htmlSQL とは SQL のような構文から HTML にアクセスできる実験的な PHP のクラスです。 これは、あなたが特定の値を抽出するために、複合関数(正規表現)を書く必要はないことを意味します。
$wsql = new htmlsql();
if (!$wsql->connect('file', '../../blog/index.html')){
print 'Error while connecting: ' . $wsql->error;
exit;
}
if (!$wsql->query('SELECT text FROM * WHERE $id == "nav"')){
print "Query error: " . $wsql->error;
exit;
}
foreach($wsql->fetch_array() as $row){
print $row['text'];
}
ということで、「IEさん、頼むよ...」っていう話。
JavaScriptのIE用イベントハンドラ「attachEvent/detachEvent」。これを使って呼び出したイベント内では、thisがwindowと解釈される落とし穴が。
下記のイベントをIEで実行すると、どうなるか、さっそく検証。
ボタンのラベル「送信する」がalertで返される、かと思いきや、結果は「undefined」。
これが、IEでattachEventした関数内では、「this」がwindowオブジェクトとなってしまうってこと。
つまり、detachEventもできず、はまるので注意。
じゃあ、どう書けばいいのか。
thisの代わりに「evt.srcElement」で、イベント発生元を取得すればよい。
と、ここまでがIEの話。
IE以外は、「addEventListener/removeEventListener」でイベントを制御するから、その振り分けをすればよい。クロスブラウザで動作する、最終的なコードは下記。
今回、ブラウザ依存の問題に結構はまってしまったけど、イベントのバブリングフェーズとかキャプチャフェーズについて勉強できたから、許す。(←何を?)
たまにネイティブのJavaScriptを書くと、ブラウザの差異を意識しなくていい「jQuery」のありがたみが身にしみますね。。。
thisを意図通り扱うため、上記のようにcallを使う方法もある。けど、この場合、無名関数でattachするから、detachEventできないので要注意です。
(参考サイト)
JavaScript のイベントハンドラ - daily dayflower
JavaScript メモ / チップス attachEvent() と addEventListener() [ ARTEMIS ]
(*は必須項目です)
$wsql1 = new htmlsql();
if (!$wsql1->connect('url', 'String')){
print 'Error while connecting: ' . $wsql1->error;
exit;
}
if (!$wsql1->query('SELECT text FROM p')){
print "Query error: " . $wsql1->error;
exit;
}
foreach($wsql1->fetch_array() as $row1){
print $row1['text'];
}
$wsql2 = new htmlsql();
// connect to a File
if (!$wsql2->connect('url', 'http://vosegus.org/blog/atom.xml')){
print 'Error while connecting: ' . $wsql2->error;
exit;
}
if (!$wsql2->query('SELECT * FROM entry')){
print "Query error: " . $wsql2->error;
exit;
}
foreach($wsql2->fetch_objects() as $obj){
$sub_wsql = new htmlsql();
$sub_wsql->connect('string', $obj->text);
if (!$sub_wsql->query('SELECT * FROM *')){
print "Query error: " . $wsql2->error;
exit;
}
$sub_wsql->convert_tagname_to_key();
$item = $sub_wsql->fetch_array();
print $item['title']['text'];
}
?>