IE中的“this”关键字

时间:2009-12-04 01:21:16

标签: javascript internet-explorer this prototypejs

因此,我在网页上使用此代码段<tr onclick="this.toggleClassName('selected')">。 (一个Prototype.js函数)它很棒。我所做的只是点击表格行,它似乎被选中。除IE和Opera外,它无处不在。这只是一个方便,所以我并不关心它是否有效,但在IE中它会抛出一个错误,并询问用户是否要调试。

我得到的错误消息是“对象不支持此属性或方法”。它可能指的是哪个对象或哪个方法?有关在IE中实现此功能的简单方法的任何想法?如何不向用户抛出错误消息?

谢谢,戴夫

http://math.davehampson.net

3 个答案:

答案 0 :(得分:4)

是的,这基本上是Prototype的主要问题。

Prototype在不同浏览器上的工作方式不同。在允许您使用主机对象原型(如HTMLTableRowElement)的浏览器上,它会为这些原型添加自己的函数,如toggleClassName,这样每次获得<tr>时都可以调用那个方法直接就可以了。哇哇,多么方便!

不幸的是,能够改变DOM节点的原型是没有ECMAScript或DOM标准实际认可的。它恰好在Firefox中运行,因为Mozilla很不错,但你不能指望它适用于所有浏览器;它当然不适用于IE。

因此,对于其他浏览器,您必须告诉Prototype将自己的方法添加('augment')到您想要处理的每个对象上:

Element.extend(this);

现在,您可以在所有浏览器上安全地致电this.toggleClassName

一旦你增加了特定的<tr>,每次访问它时,它仍然会被扩充,所以你仍然可以在其上调用toggleClassName。更重要的是,如果您碰巧通过Prototype方法访问元素 - 例如$('mytrid') - 它会自动为您扩充它。

这不是一个方便的功能:这是一个陷阱。它鼓励您编写恰好在您的浏览器上工作的代码(支持原型黑客)但在其他地方会失败。如果您按照特定顺序与页面元素进行交互,它会鼓励您编写恰好可用的代码,以确保在调用增强方法之前它们都会得到增强,但如果您以不同的顺序与元素交互,则会失败。

这是一个调试灾难,这就是为什么我不使用原型。

(下周,额外的flamebait乐趣,为什么我不使用jQuery。)

答案 1 :(得分:1)

请尝试使用此代码:

$(this).toggleClassName('selected')

详细原因在这里:http://prototypejs.org/learn/extensions/

答案 2 :(得分:0)

'this'关键字是javascript基础,在您的示例中将返回tr dom节点。我怀疑prototypejs是将方法附加到dom节点,并且出于某种原因,这并没有为IE和Opera完成/工作。