Home > スポンサー広告 > User JavaScriptの AfterEventListener.loadにはまる

スポンサーサイト

スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Comments:-

Comment Form

Trackback+Pingback:-

TrackBack URL for this entry
http://karafuto50.blog117.fc2.com/tb.php/160-446ffd8e
Listed below are links to weblogs that reference
スポンサーサイト from Karafuto Blog

Home > スポンサー広告 > User JavaScriptの AfterEventListener.loadにはまる

Home > user javascript > User JavaScriptの AfterEventListener.loadにはまる

User JavaScriptの AfterEventListener.loadにはまる

user javascript

Opera 9.5になって動かなくなっていた User JavaScriptをいくつか直した。

具体的には、livedoor Readerの User JavaScriptで、window.onloadのイベントハンドラ、init関数の後に動くように作ったスクリプトが、init関数よりも先に動いて、エラーを吐いていた。Opera 9.27までなら 'AfterEventListener.load'で window.onloadを感知して、関数の後に動いていたのが、Opera 9.5では window.onloadの前に動いていた。そのことと、下記の更新履歴から Opera 9.5は window.onloadを捕捉できないのかと勘違いして、スクリプトを修正するのにてこずった。

イベントの捕捉がよりクロスブラウザ互換になりました。window へアタッチされた load イベントは捕捉されず、対象において捕捉したイベントは破棄されます。文書中で load イベントを捕捉する必要がある場合、document オブジェクトへイベントリスナをアタッチしてください

Opera 9.5 ベータ 1 for Windows 更新履歴

本当のエラーの原因は下の Browser JavaScript(browser.js - Opera Desktop 9.51, July 6, 2008)のコードに関係していた。このコードがすべてのサイトで loadイベントの後呼び出されていた。そのため、このイベントリスナが window.onloadより先に実行されてしまうため、User JavaScriptがこれを目的のイベントと間違えて検出し、予定より早く動いていたのだ。(Web Forms 2.0は拡張されたフォームの仕様のようなんだけど、これを使用しているサイトはそんなにあるの?)

// The required attribute does not take the value false according to WebForms2 - remove "required=false" from form elements
document.addEventListener('load', function(){
    try{var obj = document.evaluate( '//input[translate(@required, "FALSE", "false")="false"]', document.documentElement, null, 4, null ), el ;
    while(el=obj.iterateNext()){el.removeAttribute('required');}}catch(e){}
}, false);

今回、User JavaScriptで修正したところは、'AfterEventListener.load'で イベントリスナを検出する時、そのイベントリスナが目的の関数( init関数)なのか確かめてからスクリプトを実行するようにした。以下のようになる。(イベントリスナの後にスクリプトを実行するのだから、当然どんなイベントリスナが実行されたかを調べておくべきだった。)

window.opera.addEventListener('AfterEventListener.load', function (e){
    // init()関数か調べる
    if (e.listener.toString().indexOf('function init()') == -1) return;

    // 処理

}, false);

Browser JavaScriptのことを最後にちょこっと書いておくと、Browser JavaScriptを無効にしてあれば上のようなエラーは出ない。しかし、Browser JavaScriptは、古い形式のスクリプトや Opera を意図せずにブロックしてしまい Opera で利用できない Web ページを自動的に修正する機能です。そういうことなので有効にしておいた方が良いかと。Browser JavaScriptの設定を確認するには、ブラウザ JavaScriptのページを開くと、上の方の「更新情報の取得」のリストの最後に、「現在ブラウザ JavaScript は有効(無効)です」と表示される。Browser JavaScriptを有効にするには、設定ファイルエディタ(opera:config) > User Prefs > Browser JavaScriptに 1を入力して、保存する。

Comments:0

Comment Form

Trackback+Pingback:0

TrackBack URL for this entry
http://karafuto50.blog117.fc2.com/tb.php/160-446ffd8e
Listed below are links to weblogs that reference
User JavaScriptの AfterEventListener.loadにはまる from Karafuto Blog

Home > user javascript > User JavaScriptの AfterEventListener.loadにはまる

おまかせリンク(R)
全記事表示リンク
Search
Meta
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。