2009-12-04 95 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工作。