2011-03-24 50 views
1

我需要枚舉我之前修改的DOM元素的所有屬性。我可以使用Firefox,Chrome和Opera來完成,但我無法使用Safari(我暫時不在乎IE)。如何使一個DOM處理程序在Safari中枚舉?

<a id="link">Link...</a> 
<script> 
    var link = document.getElementById("link"); 
    var foo = function (baz) {}; 
    link.onclick = foo; 
    alert ("onclick" in link); // true 
    alert (link.hasOwnProperty("onclick")); // true 
    alert (link.propertyIsEnumerable("onclick")); 
    // false with Chrome, Safari, Opera* 
</script> 

*:雖然該屬性是不是可以在Opera中枚舉它無論如何枚舉!

for (p in link) 
    if (p==="onclick") 
     alert (p); // onclick 

我可以通過分配之前刪除onclick屬性使Chrome的第三alert輸出true

delete link.onclick; 

但物業Safari中並沒有列舉尚。

我甚至與ECMAScript 5對象方法defineProperty嘗試:

Object.defineProperty (link, onclick, { 
    value: foo, 
    enumerable: true, 
    configurable: true, 
    writable: true 
}); 

但它返回的錯誤:

TypeError: defineProperty is not supported on DOM Objects

有什麼建議?

P.S.爲什麼Safari的行爲與Chrome不同,儘管它們都基於Webkit?

+2

回答你的PS:Webkit是渲染引擎。對於Javascript,Safari使用JavaScriptCore引擎(Squirrelfish),Chrome使用V8。 – Martijn 2011-03-24 12:30:34

回答

0

useragent與在Webkit JavaScriptCore中實現EcmaScript5 Object方法的Webkit版本進行比較。 Chrome的Webkit版本與Safari不同,因此標準支持也會有所不同。