2008年6月2日(月曜日)

RSS購読についてのお願い+おまけ

カテゴリー: - sato @ 17時03分22秒

satoです。

当ブログをLivedoor Readerで見ている方は結構多いのですが、Atomフィードで購読している方が多いようです。
しかし、現在システムの不調により、Atomフィードのほうは正常に表示できないケースが多いです。
ご迷惑をおかけいたしますが、極力RSS2のほうを利用して頂くようお願い申し上げます。

ところで、当ブログは
・RSS0.92
・RSS1.0
・RSS2.0
・Atom
の4種類のフィードを出力しています。
これらは全てフォーマットは違いますが、用途としては同じものです。
広義の意味で「RSS」と言うと、特に指定はなく、これら全てを指すことになります。ただし通常は「フィード」と呼んだほうが通じると思います。(AtomはRSSではないので)
そのため、「読み込み側」としての「RSS対応」なサイトを作るには、これら全てに対応している必要があります。実際には、AtomとRSS2.0だけで大体はカバーできるのですが、古いサイトだとRSS1.0や0.9しか出力していない場合があったりするので、全て対応しておくのが無難かと思われます。
一方、「出力側」としての「RSS対応」であれば、基本的にはどれか1つに対応していれば十分なことが多いですが、こちらも逆に古いシステム向けにするのであればRSS1.0などの対応も必要になります。ただし読み込み側が複数対応していないというケースは多くはないので、通常はRSS2.0かAtomに対応させることが多いです。

PHPでフィードをパースする場合は、既存のライブラリを使うことが多いですが、例えば特定サイトのフィードのみをパースする場合は、正規表現で足りることもあります。
例えば当ブログのAtomフィードであれば、

preg_match_all("/<title>(.*)</title>/", $contents, $matches);
preg_match_all("/<link rel=\"alternate\" type=\"text/html\" href=\"(.*)\" />/", $contents, $matches);

のような正規表現で取得できることが多いはずです。(ただしどちらもサイト全体のtitleとlinkも取得してしまうので、1つ抜いてください)
用途によってパース方法は変わってくると思うので、最適な方法を考えてみてください。


2008年5月26日(月曜日)

Firefoxの拡張を書き換える

カテゴリー: - sato @ 20時15分12秒

satoです。
Firefoxは様々な拡張がありますが、環境によって動かなかったり、キー操作が自分好みじゃなかったりする場合があります。
しかし拡張は意外と簡単に書き換えることができます。

※拡張を書き換える際は自己責任でお願いします。

・基礎知識
Firefoxの拡張であるxpi形式のファイルですが、実はzip形式で圧縮されたファイルを拡張子を変えただけです。
なので、適当なxpiをダウンロードして、拡張子をzipに書き換えて解凍してみると普通に解凍できます。
構成されているファイルはほとんどがテキスト形式なので、好きなエディタで編集することができます。
書き換えた後に、再度zip形式で圧縮し、Firefoxのアドオンウィンドウにドロップするとそのままインストールが可能です。
※自動でファイル名と同名のフォルダを作るような解凍ツールで解凍した場合は、自動で作られたフォルダを含めないで再圧縮してください。

・対応バージョンを書き換える
拡張の基本情報は、install.rdfに書かれています。
このファイルは、RSS等でおなじみのRDF形式のXMLファイルなので、XMLが読める方なら大体理解できると思います。
このファイルを見ると、

em:minVersion="1.5" em:maxVersion="2.0"

のような記述があると思います。これが対応バージョンの表記です。
例えば、Firefox3.0で動かすには、

em:minVersion="1.5" em:maxVersion="3.0.*"

のようにします。
このまま再圧縮するとFirefox3.0でも動く可能性がありますが、場合によってはFirefox自体が起動しなくなるようなケースもあるかもしれません。しかし非対応の拡張をどうしても使いたいという場合には有効だと思います。
ちなみに、Firefox3.0では拡張に関するセキュリティが強化されており、この方法で動くことは少ないと思います。動かす方法はありますが、今回は省略します。

・キーバインドを書き換える(Hit-a-Hintの例)
Firefoxのブラウザ内のリンクをキーボードのみで選択できるようになるHit-a-Hintという拡張があります。
キーボード派には非常に便利なのですが、デフォルトがスペースキーに割り当ててあるので、スペースキーでスクロールをしている場合には逆に不便になってしまいます。
昔はキーコンフィグ画面があったのですが、最近は何故かなくなってしまったようです。仕方がないので直接書き換えて見ます。(keyconfigという拡張を使う方法もありますが省略します)

Hit-a-Hintをzipとして解凍すると、chromeフォルダにchrome.jarというファイルがあります。
jarはJavaの圧縮形式ですが、これもzipと同じ形式です。なのでやはり拡張子をzipにして解凍します。
この中に、content\overlay.xulというファイルがあります。XML形式のファイルなので、テキストエディタで開きます。
開くと、

  <key id="hahQuickToggle" key="l" modifiers="shift,accel" oncommand="hah.QuickToggle();" />
  <key id="hahRegenHints" key="r" modifiers="shift,accel" oncommand="hah.RegenHints();" />
  <key id="hahBlurFocused" key="j" modifiers="shift,accel" oncommand="hah.BlurFocused();" />

<key id="hahStartKey" key="h" oncommand="hah.enterStartKey(event);" /> <key id="hahMagicKey" key=" " oncommand="hah.enterMagicKey(event);" />

<key id="hahBackspace" keycode="VK_BACK" oncommand="hah.enterBackSpace(event);" /> <key id="hahExitKey" keycode="VK_ESCAPE" oncommand="hah.enterExitKey(event, false);" /> <key id="hahEnterKey" keycode="VK_RETURN" oncommand="hah.enterExitKey(event, true);" />

のような記述が見えると思います。これがキーバインドそのものなので、直接編集して保存し、再度順番に圧縮していけば好きなキーバインドが出来上がります。
キーに関する詳細は、XUL:key - MDCを参照してください。

・まとめ
Firefoxの拡張は
-zip圧縮形式
-JavaScript
-XUL(XML)
でほとんどが構成されています。
ほとんどの環境で編集が可能なので、例えば日本語言語ファイルを作って公開なども簡単にできます。(公開する場合はライセンスに注意してください)
プログラミング環境としても面白いと思うので、興味のある方は拡張作成にも挑戦してみてください。


2008年5月19日(月曜日)

symfony+sfModalBoxPluginで簡単ダイアログ

カテゴリー: - sato @ 12時32分52秒

satoです。
今回はsymfonyフレームワークで、簡単にダイアログボックス的なものを表示してみます。
sfModalBoxPluginを利用します。

・sfModalBoxPluginのインストール
sfPrototypePluginが必要なので、先にインストールします。

$ symfony plugin-install http:⁄⁄plugins.symfony-project.com/sfPrototypePlugin
$ symfony plugin-install http:⁄⁄plugins.symfony-project.com/sfModalBoxPlugin

細かい設定は特に必要ありません。

・ダイアログ側作成
まず、ダイアログとして表示したいactionを作成します。
apps/frontend/modules/dialogtest/actions/actions.class.php

  public function executeDialog()
  {
  }

apps/frontend/modules/dialogtest/templates/dialogSuccess.php

<p>hello dialog box</p>
<p><a href="#" onclick="Modalbox.hide();return false;">close</a></p>

・呼び出し元作成
apps/frontend/modules/dialogtest/actions/actions.class.php

  public function executeTest()
  {
  }

apps/frontend/modules/dialogtest/templates/testSuccess.php

<?php use_helper('ModalBox') ?>
<?php echo m_link_to('show dialog', 'dialogtest/dialog') ?>

・実行
dialogtest/testをブラウザで表示すると、

このような画面になります。ここで「show dialog」をクリックすると

このような画面になります。「close」をクリックすると元の画面に戻ります。

例えばselectタグでは多すぎるような項目を選択させる際に、ダイアログを出して選択させて、選択結果をJavaScriptで元の画面に挿入するようにすると、操作性が上がると思います。
デザインの都合上、管理画面などに利用するのが向いていると思います。
actionがそのままダイアログとして利用できるのは便利だと思うので、是非試してみてください。

ModalBoxの詳しい説明は、ModalBox | Wildbitをご覧下さい。sfModalBoxPluginについてはsfModalBoxPlugin - symfony - Tracをご覧下さい。


2008年5月8日(木曜日)

Windowsのランチャー

カテゴリー: - sato @ 18時02分30秒

Windowsで作業する際はアプリケーションランチャーが必須だと思います。スタートメニューはアプリケーション数が増えてくると使いづらくなります。
今回はそのうちの個人的に好きなもの2つを紹介したいと思います。

Clock Launcher
国産の多機能ランチャーです。
基本的にはメニュー型ですが、様々なマウス操作(ダブルクリック、回転、画面端に移動など)で呼び出すことができ、いつでも利用することができます。
また、普段はボタンが常駐しており、ここから時計や付箋を呼び出したりもできます。
そのほかにTClock(タスクトレイの時計を改造するアプリ)や、カレンダーなども内蔵しており、ランチャーとして使用しなくてもWindows操作が快適になります。
Vistaでの動作保証はされていないようなのですが、一応動くようです。
カテゴリ登録が手間だと思う人だと面倒ですが、マウス操作がメインで、様々な機能が欲しいならお勧めです。

Launchy
Clock Launcherはメニュー型でしたが、こちらは逆にコマンド型になります。
事前にフォルダを指定しておくと(デフォルトでもスタートメニューのものは全て対象になっていますが)、Launchyの画面でアプリケーション名を入力すると起動します。もちろん自動補完もあるので、数文字打てば対象のアプリケーションに到達できます。
通常は隠れていて、ホットキーで呼び出すタイプなので、キーボード派の方に特にお勧めです。デフォルトではALT+SPACEになっています。
また、Launchyはプラグインで様々な拡張ができます。例えば数式を入力すると計算結果が表示されるプラグイン、検索単語を入力するとGoogleでの検索結果がブラウザで表示されるプラグインなどがあります。PuTTYのセッションを開くプラグインもあり、開発にも便利です。

そのほかにも、bluewindCraftLaunchOrchisなどがあります。
また、Windows標準のクイック起動バーを分離させても立派なボタン型ランチャーになります。この方法も手軽でお勧めです。

ランチャーは好みが大幅に分かれると思うので、いろいろ試してみてください。


2008年4月21日(月曜日)

Passenger(mod_rails)で簡単Rails環境構築

カテゴリー: - sato @ 18時50分17秒

satoです。今回はRubyを代表するフレームワークRuby On Railsの話です。
通常Ruby On Railsを動かす場合、mod_rubyやwebrickとかは使わず、fastcgiやmongrel(cluster)といった環境を用意することが多いです。しかしどちらも設定が煩雑で、簡単に利用できるとは言い難いものでした。
しかし最近、Passengerなるものが出てきて話題になっています。これは「a.k.a. mod_rails」の名の通り、Rails専用のApacheモジュールとなっています。
インストールも非常に簡単で、RubyGemsがインストールされている環境なら、

% gem install passenger
% passenger-install-apache2-module

で完了します。
passenger-install-apache2-moduleを実行すると、足りない環境や、Apacheの設定方法まで詳しく表示されるので、インストールに失敗して困るということもないと思います。
passenger-install-apache2-moduleが無事終了すると、

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so RailsSpawnServer /usr/lib/ruby/gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server RailsRuby /usr/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails applications on Apache, without any further Ruby on Rails-specific configuration!

のようなメッセージが出ます。(環境によってパスは変わります)
ここに書いてある3行をそのままhttpd.confに追記し、Apacheを再起動すればインストール完了です。
httpd.confでDeny from allが記述されている場合は消すといいようです。
あとは普通にRailsアプリケーションを作成し、実行するだけです。DocumentRootがRailsのpublicであれば他の設定は不要です。(そうでない場合は少し設定が必要のようです)
開発用サーバとしての機能は備わっていないので、開発中はruby script/serverでWebrickを起動することになります。
Passengerの再起動は、touch tmp/restart.txtしておくと勝手に再起動するようです。

環境面で敷居の高かったRailsですが、これで手軽に導入できるようになるのでしょうか。
パフォーマンスは良好のようなので、安定性に期待したいところです。


2008年4月14日(月曜日)

Propelを単体で使う

カテゴリー: - sato @ 18時09分58秒

PHP5専用のO/RマッパーにPropelというものがあります。
PHPのフレームワーク「symfony」の標準のO/Rマッパーとして有名ですが、単体で使っている人はあまり見かけない気がします。
今回は単体で使う方法を軽く説明しようと思います。

1.インストール
PEARコマンドでインストールするのが簡単です。

# pear channel-discover pear.phpdb.org
# pear install phpdb/propel_generator
# pear install phpdb/propel_runtime

なお、phingが必要なので、入っていない場合は事前に

# pear install channel://pear.phing.info/phing

で入れておいてください。
ログを記録する場合はLogが必要なので、

# pear install Log

で入れておいてください。(今回は不要です)
執筆時点でのPropelの安定バージョンは1.2です。

2.テーブル定義
PropelではXMLでテーブル構造を定義します。これにより、リレーションを含めたPHPオブジェクトが全て自動で生成されます。
今回は仮にbookmarkという簡単なアプリケーションにします(実際にアプリケーションは作成しません)。bookmarkというフォルダを作り、以下のファイルを作成します。
schema.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<database name="bookmark" defaultIdMethod="native">

<table name="bookmark" description="bookmark"> <column name="id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="bookmark id"/> <column name="title" type="varchar" size="255" required="true" description="bookmark title"/> <column name="url" type="varchar" size="255" required="true" description="bookmark url"/> </table>

</database>

3.基本設定
ビルドに関する設定は以下のファイルで設定します。
build.properties

propel.project = bookmark
propel.database = mysql
propel.database.url = mysql://root@localhost/bookmark

また、これとは別に、実際のアプリケーションからの接続時の設定は以下のファイルを使用します。
runtime-conf.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <propel>
  <datasources default="bookmark">
   <datasource id="bookmark">
    <adapter>mysql</adapter>
    <connection>
     <phptype>mysql</phptype>
     <database>bookmark</database>
     <hostspec>localhost</hostspec>
     <username>root</username>
     <password></password>
    </connection>
   </datasource>
  </datasources>
 </propel>
</config>

このような仕様になっているのは、Propel自体がgeneratorとruntimeで分離しているからだと思われます。

ファイルを作成したら、mysqlでbookmarkという名前のデータベースを作成しておいてください。

4.オブジェクト作成

bookmarkフォルダで以下のコマンドを実行します。

% propel-gen .

するとbookmarkフォルダ以下に多数のファイルが生成されます。
実際にデータベースに投入するSQLファイルは、build/sql/schema.sqlになります。そのままmysqlに投げてもいいですが、

% propel-gen . insert-sql

でもデータベースに投入できます。(実際に行っていることは手動での挿入と同じだと思います)

propel-genの際に、

Execution of target "convert-props" failed for the following reason: /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead
[phingcall] /usr/share/pear/data/propel_generator/build-propel.xml:534:12: Cannot write parsed template: Unable to parse template ./templates/conf/Control.tpl: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead

のようなエラーが出た場合は、

% export TZ=Asia/Tokyo

としてください。

5.実際に使う

index.php

<?php

require_once('propel/Propel.php');

// $dir = dirname(__FILE__); // ルートフォルダであればこれでも取得できます $dir = '/path/to/bookmark'; set_include_path($dir.'/build/classes' . PATH_SEPARATOR . get_include_path());

Propel::init($dir.'/build/conf/bookmark-conf.php');

これが初期化部分になります。$dirは適宜変更してください。

require_once('bookmark/Bookmark.php');

使用するテーブルに対応するファイルを読み込みます。

この後に実際のコードを記述していきます。

・データを追加/保存する

$bookmark = new Bookmark();
$bookmark->setUrl('http://ryus.co.jp/');
$bookmark->setTitle('XOOPS Webサイト/イントラサイト制作、XOOPS モジュール開発/カスタマイズを専門に行っています。 - XOOPS専門-株式会社RYUS');
$bookmark->save();

これでINSERTになります。DBから取得したデータであればUPDATEになります。両者を特に気にする必要はありません。

・データを読み込む

$bookmark = BookmarkPeer::retrieveByPk(1);
$url = $bookmark->getUrl();
$title = $bookmark->getTitle();
echo $url,$title,PHP_EOL;

読み込み系は"テーブル名Peer"クラスで行います。
retrieveByPkは、主キーからデータを取得します。
# 表示が化ける可能性があるので、適当な文字コードで表示してください。

・複数データ取得

$bookmarks = BookmarkPeer::doSelect(new Criteria());
foreach($bookmarks as $bookmark) {
  $url = $bookmark->getUrl();
  $title = $bookmark->getTitle();
  echo $url,$title,PHP_EOL;
}

doSelectは条件付きで複数レコード取得します。引数のCriteriaは条件を指定するクラスなのですが、今回は無指定なので単にnewしたものをそのまま渡しています。
条件を指定する例としては、

$c = new Criteria();
$c->add(BookmarkPeer::URL, 'http://ryus.co.jp/');
$bookmarks = BookmarkPeer::doSelect($c);

のような感じになります。Criteriaの条件設定は細かいところまで手が届くようになっています。

6.まとめ
詳しくは公式のドキュメントが充実しているので、そちらを参照してください。
次期バージョンであるPropel1.3(symfony1.1で載る予定)ではcreoleからPDOになり、更なる機能強化が期待できます。
PHPのO/Rマッパーは他にもS2Dao.PHP5Doctrineなど多数あるので、好みのものを利用するのがいいと思います。


2008年4月7日(月曜日)

Smartyのテンプレートの文字列内変数を拡張する

カテゴリー: - sato @ 17時20分49秒

satoです。
XOOPSでは、テンプレートエンジンにSmartyを使うことになります。
このSmartyは便利なのですが、若干使いづらい部分もあったりまします。

まず前提として、Smartyの文字列定数中に変数を混ぜたい場合、バッククォート(`)で囲むとそれが変数として解釈されるようになっています。
例えば、

{"私は`$name`です。"}

として、$nameに"sato"という文字列がassignされていると、

私はsatoです。

と表示されます。

しかし、このバッククォート内にメンバ関数を指定すると、解釈がうまくいかないようです。

例えば、

私は{$my->show('name')}です。

みたいなものは可能なのですが、

{"私は`$my->show('name')`です"}

とすると、

私は`Object id #2->show('name')`です。

のように、$myの部分だけ変数として解釈され、それ以外は普通の文字列として出力されてしまいます。
通常、こういう場合は、

{assign var=name value=$my->show('name')}
{"私は`$name`です"}

のように1段階assignを追加することになり、若干手間がかかります。
今回はこれの簡易的な対応方法を試してみました。

Smartyのassignされた変数というのは、実際にそのスコープに存在するものではなく、Smartyクラスの_tpl_varsメンバ変数に格納されています。このため、テンプレート側で記述した変数は、Smartyの構文解析を通してSmartyクラスのメンバ変数になるように置換処理が入ります。具体的には生成されたテンプレートキャッシュを見ればわかると思います。
そのため、Smartyでは正規表現を利用して構文解析を行っているのですが、この正規表現に手を入れることで、上記の対応が可能になります。

バッククォート内を解釈しているのは、Smarty_Compiler#_expand_quoted_textで、変数の解析をしている正規表現は_obj_ext_regexpに格納されています。
このため、Smarty_Compilerに手を入れればいいのですが、Smarty_CompilerはSmarty#_compile_sourceで生成され、すぐ破棄されるので、途中からアクセスすることはできません。Smarty_Compiler.class.phpを直接書き換えればいいという話もありますが、それでは汚くなってしまいます。
幸い、Smartyクラスが生成するSmarty_Compilerクラスは別のものに変更ができるようになっています。Smartyクラスのcompiler_fileとcompiler_classにそれぞれ読み込むファイルとクラス名が格納されているので、それを自前のものに変更します。

具体的にやってみます。
以下のファイルを作成します。パス等は適宜変更してください。
MySmartyCompiler.class.php


	

require 'Smarty-2.6.19/libs/Smarty_Compiler.class.php';

class MySmartyCompiler extends Smarty_Compiler { function MySmartyCompiler() { parent::Smarty_Compiler();

$this->_obj_ext_regexp = str_replace(’(?:[$?[w.]+])*’, ‘(?:[($?[w.]+)])*(?:(($?[w"’.]+)))*’, $this->_obj_ext_regexp); } }

呼び出し側を作成します。
index.php


	

require 'Smarty-2.6.19/libs/Smarty.class.php';

class myClass {

function show($var) { return 'sato'; }

}

$smarty = new Smarty(); $smarty->compiler_file = ‘MySmartyCompiler.class.php’; $smarty->compiler_class = ‘MySmartyCompiler’;

$smarty->template_dir = ‘templates’; $smarty->compile_dir = ‘templates_c’; $smarty->config_dir = ‘config’; $smarty->cache_dir = ‘cache’; $smarty->plugins_dir = ‘plugins’;

$smarty->assign(’my’, new myClass()); $smarty->display(’index.tpl’);

テンプレートを作成します。
templates/index.tpl

<html>
<body>

{"私は`$my->show('name')`です。"}

</body> </html>

実行すると、

私はsatoです。

のように正常に表示されているのが確認できると思います。
全てのパターンでテストを行っているわけではないので、不具合があったらコメント欄等でよろしくお願いします。

XOOPSからこれを利用する場合は、各RenderSystem内に存在するSmartyオブジェクトを取得して書き換える必要があります。
モジュールの場合は通常はLegacy_RenderSystemなので、

    $root =& XCube_Root::getSingleton();
    $renderSystem = $root->mContext->mModule->getRenderSystem();
    $renderSystem->mXoopsTpl->compiler_file = 'MySmartyCompiler.class.php';
    $renderSystem->mXoopsTpl->compiler_class = 'MySmartyCompiler';

のような感じで対応が可能です。(表示処理の実行前に記述してください)
管理画面はLegacy_AdminRenderSystemなので、mXoopsTplではなくmSmartyを参照することになります。

しかしこの方法でも、

{"私は`$pattern[$foo->bar()]`です"}

のようなパターンには対応できません。このパターンに対応するには_expand_quoted_text自体を大幅に改変する必要がありそうです。興味のある方は挑戦してみてください。


2008年3月31日(月曜日)

外部ライブラリを使わないJavaScriptプログラミング

カテゴリー: - sato @ 18時38分02秒

初めまして、入社2日目のsatoです。

現在、JavaScriptで開発といえばprototype.jsjQueryといったライブラリを使用することが多いですが、ちょっとした開発では直接書いたほうが早い場合もあります。
普段外部のライブラリを使っていると忘れがちになるので、基本的なものをまとめてみました。

・クラスの作成

function Class() {}
Class.prototype.foo = 1;
Class.prototype.hoge = function() {
  this.foo = 2;
}

var c = new Class(); c.hoge(); alert(c.foo); // 2

・XmlHttpRequest

// オブジェクト作成
var xhr = null;
if (window.ActiveXObject) {
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
} else {
  xhr = new XMLHttpRequest();
}

// アクセス xhr.open("GET", "foo.xml", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { var xml = xhr.responseXML; // 読み込み完了時の処理を記述する } } } xhr.send(null);

・DOM操作

var elem = document.getElementById("foo"); // #fooの要素を取得
var nodes = elem.childNodes;
for(var i=0;i<nodes.length;i++) {
  // elemの子要素全てに対して何かする
  var node = nodes[i];

// 要素の値を取得する // barなら"bar"が返る alert(node.nodeValue); }

// 中身を全て取得する場合はinnerHTML alert(elem.innerHTML);

elem.appendChild(document.createElement("br")); // タグを追加

外部ライブラリを使うか使わないかは、規模と書きやすさで考えればいいと思います。書きやすさだけで考えれば何らかのライブラリを使用したほうがいいのですが、巨大なものが多いので(今時そんなの気にしないかもしれませんが)、こういうのも覚えておくと便利です。
かと言って、全部直接書いていくのも面倒なので、例えばprototype.jsのような

function $(e) { return document.getElementById(e); }

こんな関数を用意しておくと多少は楽になると思います。

ただしそのまま書いていくと、外部ライブラリを使用するのに比べコード量は増えると思いますので、規模が大きくなりそうだと思ったら使い慣れたライブラリに切り替えるのをお勧めします。


8 queries. 0.048 sec.
Powered by WordPress Module based on WordPress ME & WordPress

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.