是的,這基本上是Prototype的主要問題。
原型在不同的瀏覽器上工作方式不同。在可以使用主機對象原型(如HTMLTableRowElement)的瀏覽器上,它會將自己的函數(如toggleClassName
)添加到這些原型中,以便每次獲得<tr>
時都可以直接調用該方法。嗚呼,多麼方便!
不幸的是,能夠改變DOM節點的原型是ECMAScript或DOM標準實際上不支持的東西。它恰好在Firefox中工作,因爲Mozilla很好,但你不能期望它能夠在所有瀏覽器中工作;它肯定不會在IE中工作。
所以對於其他瀏覽器,你必須告訴原型添加(「增效劑」)自己的方法到每一個對象,你要處理:
Element.extend(this);
現在你可以在所有的瀏覽器安全地調用this.toggleClassName
。
一旦你增加了特定的<tr>
,每次你在將來訪問它時,它仍然會增加,所以你仍然可以調用toggleClassName
。更重要的是,如果您碰巧通過原型方法訪問元素(例如$('mytrid')
),它會自動爲您添加。
這不是一個便利功能:這是一個陷阱。它鼓勵你編寫恰好在你的瀏覽器上工作的代碼(支持原型破解),但是會在其他地方失敗。它鼓勵你寫代碼,如果你按照一定的順序與頁面元素進行交互,確保它們在調用增強方法之前都得到增強,但是如果你以不同順序與元素交互,則會發生錯誤。
這是一個調試災難,它是爲什麼我不使用原型。
(下週,爲了額外的firebait樂趣,爲什麼我不使用jQuery。)
或多或少,我爲什麼停止使用Prototype,但我應該注意,如果你總是執行'$(this).whatever()',那麼Prototype足夠聰明,不會重新擴展已經存在的元素延長。這可以減輕對以某種順序發生的事情的依賴。 –
好吧,我會咬(雖然這是脫離主題),爲什麼你不使用jQuery?我保證我不會阻止你;-) –
謝謝!我不明白100%,但它做到了! –