2009-12-04 96 views
0

因此,我在網頁上使用此片段<tr onclick="this.toggleClassName('selected')">。 (一個Prototype.js函數)它很棒。我所做的只是點擊一個表格行,它似乎被選中。它在任何地方都可以工作,除了IE和Opera。這只是一個方便,所以我不在乎它是否可以工作,但在IE中會拋出一個錯誤,並詢問用戶他/她是否想調試。IE中的「this」關鍵字

我得到的錯誤消息是「對象不支持此屬性或方法。」它指的是哪一個對象或哪一種方法?任何想法在IE中輕鬆實現這個功能?如果不把錯誤信息扔給用戶呢?

謝謝,戴夫

http://math.davehampson.net

回答

4

是的,這基本上是Prototype的主要問題。

原型在不同的瀏覽器上工作方式不同。在可以使用主機對象原型(如HTMLTableRowElement)的瀏覽器上,它會將自己的函數(如toggleClassName)添加到這些原型中,以便每次獲得<tr>時都可以直接調用該方法。嗚呼,多麼方便!

不幸的是,能夠改變DOM節點的原型是ECMAScript或DOM標準實際上不支持的東西。它恰好在Firefox中工作,因爲Mozilla很好,但你不能期望它能夠在所有瀏覽器中工作;它肯定不會在IE中工作。

所以對於其他瀏覽器,你必須告訴原型添加(「增效劑」)自己的方法到每一個對象,你要處理:

Element.extend(this); 

現在你可以在所有的瀏覽器安全地調用this.toggleClassName

一旦你增加了特定的<tr>,每次你在將來訪問它時,它仍然會增加,所以你仍然可以調用toggleClassName。更重要的是,如果您碰巧通過原型方法訪問元素(例如$('mytrid')),它會自動爲您添加。

這不是一個便利功能:這是一個陷阱。它鼓勵你編寫恰好在你的瀏覽器上工作的代碼(支持原型破解),但是會在其他地方失敗。它鼓勵你寫代碼,如果你按照一定的順序與頁面元素進行交互,確保它們在調用增強方法之前都得到增強,但是如果你以不同順序與元素交互,則會發生錯誤。

這是一個調試災難,它是爲什麼我不使用原型。

(下週,爲了額外的firebait樂趣,爲什麼我不使用jQuery。)

+0

或多或少,我爲什麼停止使用Prototype,但我應該注意,如果你總是執行'$(this).whatever()',那麼Prototype足夠聰明,不會重新擴展已經存在的元素延長。這可以減輕對以某種順序發生的事情的依賴。 –

+0

好吧,我會咬(雖然這是脫離主題),爲什麼你不使用jQuery?我保證我不會阻止你;-) –

+0

謝謝!我不明白100%,但它做到了! –

0

的 '這個' 關鍵字是一個JavaScript的基本的和在你的例子中會返回trom節點。我懷疑prototypejs將方法附加到dom節點,並且出於某種原因,這並未完成/爲IE和Opera工作。