2011-05-12 59 views
4

背景信息周邊IE9 Treewalker過濾器的Bug工作建議

的bug在IE9它認爲,createTreeWalker方法的NodeFilter財產是一個回調函數,而不是包含一個回調函數的對象目前存在。

在這樣的呼叫:

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

filter在WebKit和壁虎定義爲 「含有一個方法acceptNode一個對象,」;然而,在IE9中,根本沒有提及acceptNode - 它期望沒有對象封裝的「回調方法」。

實際問題

那麼,什麼是解決此問題沒有做明確的瀏覽器檢測的最佳方式?在某些情況下,我需要filter作爲一種方法,而在其他情況下,我需要它成爲包含該方法的對象。有沒有一種乾淨的方式來實現這一點?所有這些瀏覽器聲稱支持DOM 2.0,所以我不能對測試...

文件 - 錯誤的證明

這裏的文檔的每個對比:

  1. W3C Spec
  2. Gecko
  3. Webkit
  4. Microsoft(「NodeFilter是一個回調函數...」 - 錯誤)
+1

壁虎已經接受了一個回調函數以及一個包含acceptNode方法將近10年的對象。見https://bugzilla.mozilla.org/show_bug.cgi?id = 113008 – Neil 2011-05-12 18:55:29

+0

這是毫無疑問的路要走。然而,該標準指出,這是一個包含回調的對象。這個評論並沒有真正解決我的問題,因爲在一天結束時,IE9不支持該標準。所以我猜...你的意思是什麼? – 2011-05-12 19:15:06

+0

這是一條評論,而不是答案。我只想指出一個回調在至少另一個瀏覽器中起作用,以防它有用。 – Neil 2011-05-12 19:19:35

回答

6

嗯,我想出了一件有用的東西。打開到更好的選擇:

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

替代品?

+1

你可以通過編寫'function filter(){/ * ... * /} filter.acceptNode = filter;' – Neil 2011-05-12 19:20:47

+0

不夠公平;在這種情況下,你的代碼似乎是最優的。 – Neil 2011-05-12 19:46:15

+0

(對不起,刪除我的評論聽起來不像一個混蛋,並且同樣清晰。用這個替換) - 不幸的是,我無法控制'filter'的實例化。 :) – 2011-05-12 19:51:50

5

其實IE 9 確實遵循規範。閱讀ECMAScript bindings section of the DOM spec

對象NodeFilter

這是一個ECMAScript中函數引用。該方法返回一個Number。該參數是一個Node對象。

因此,符合的瀏覽器(包括所有主要版本的當前版本)都將接受函數filter參數。

+0

有趣! (似乎)不一致的定義是什麼? – 2011-05-13 03:43:47

+0

DOM中還有其他類似的例子,比如'addEventListener()',它的listener參數被指定爲'EventListener',一個包含'handleEvent()'方法的對象(http://www.w3.org/ TR/DOM-Level-2-Events/events.html#Events-EventListener),而ECMAScript綁定部分指定'EventListener'應該是一個函數引用。我想它是這樣指定的,因爲DOM不會綁定到單一的編程語言,許多語言(如Java)不支持將函數作爲第一類對象,而是要求所有函數都是方法。先生, – 2011-05-13 09:24:06

+0

+1。感謝您的洞察力。 – 2011-05-13 13:53:49