我不認爲錯誤是在發佈的代碼;兩個版本都適用於我,這兩種調用在不同的瀏覽器上都沒有什麼不同。
但是,原型在IE和Mozilla中的工作方式大不相同,這可能會導致代碼中的其他地方出現差異。
在Mozilla中,Prototypre將其方法添加到HTMLElement等的原型中,以便所有DOM對象都可以直接調用這些方法。然而這在IE(*)中是不可能的,因此爲了覆蓋所有的瀏覽器,你必須'擴充'你想要調用方法的每個節點,或者明確地通過調用Element.extend
,或者通過使用Prototype自己的方法之一隱式地作爲$
功能,獲得一個句柄的對象:
document.getElementByID('foo').hide(); // ok on Mozilla, fail on IE
$('foo').hide(); // ok everywhere
Element.hide('foo'); // ok everywhere
Element.extend(document.getElementByID('foo'));
document.getElementByID('foo').hide(); // ok everywhere
這實際上是原型的最壞的特徵之一,因爲你可以寫在Mozilla一的代碼加載,將在IE中失敗,並沒有注意到:它不是如此多的隱藏瀏覽器差異,以放大它們。更糟糕的是,由於許多Prototype自己的方法隱式擴展對象,並且因爲一旦擴展這些節點保留其擴展名,就很容易獲得在IE中忘記擴展元素的代碼通常工作因爲別的東西已經延伸了,但在一些更罕見的情況下會炸燬。這不利於調試。 (*:不是IE的錯誤,在ECMAScript標準中,你不能期望像DOM那樣能夠改變'主機對象'的原型,即使你可以得到它們的構造函數的句柄,這也沒有被指定存在於任何特定的地方原型是利用非標準的功能,使代碼可能看起來更好,但你不能在實踐中利用這一點,令人遺憾)。
一個簡單的測試似乎在IE6中工作:http://jsbin.com/usaca您是否使用任何其他JavaScript庫(例如jQuery)? – brianpeiris 2009-10-13 03:57:55
非常感謝brianpeieris 你是對的,所有在另一個庫引起的IE6奇怪的事情mootools.js 你真的幫助我! – beng 2009-10-13 05:34:54