4

背景情報

現在IE9にNodeFilterは、メソッドのプロパティがcreateTreeWalkerコールバック関数を含むオブジェクトではなくコールバック関数であると見なすバグが存在します。

このような呼び出しで:

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);

filteracceptNodeWebkitおよびGeckoでは、「メソッドを含むオブジェクト」として定義されています。ただし、IE9では、acceptNodeについてはまったく言及されていません。オブジェクトをラップせずに、「コールバックメソッド」を想定しています。

実際の質問

では、明示的なブラウザ検出を行わずにこの問題を回避するための最良の方法は何ですか?メソッドである必要filterがある場合もあれば、メソッドを含むオブジェクトである必要がある場合もあります。これを達成するためのクリーンな方法はありますか?これらのブラウザはすべてDOM2.0をサポートしていると主張しているため、テストできません...

ドキュメント-バグの証明

それぞれのドキュメントの比較は次のとおりです。

  1. W3C仕様
  2. ヤモリ
  3. Webkit
  4. Microsoft(「NodeFilterはコールバック関数です...」-間違っています)
4

2 に答える 2

6

さて、私はうまくいく1つのことを思いついた。より良い選択肢を受け入れる:

var filter = { acceptNode: function() {
     //do filtering...
} };

// Hackzilla.  A true W3C-compliant nodeFilter object isn't passed, and instead a "safe" one _based_ off of the real one.
var safeFilter = filter.acceptNode;
safeFilter.acceptNode = filter.acceptNode;

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, safeFilter, false);

これは、優れたブラウザがフィルタオブジェクトを呼び出し.acceptNode、悪いブラウザがすぐに実行しようとするため、機能します。

代替案?

于 2011-05-12T19:11:51.757 に答える
5

実際、IE9は仕様に準拠しています。DOM仕様のECMAScriptバインディングセクションをお読みください。

オブジェクトNodeFilter

これはECMAScript関数リファレンスです。このメソッドは数値を返します。パラメータはNodeオブジェクトです。

したがって、準拠しているブラウザー(すべての主要なブラウザーの現在のバージョンを含む)はすべて、filterパラメーターとして関数を受け入れます。

于 2011-05-12T21:23:18.663 に答える