0

<tr onclick="this.toggleClassName('selected')">所以,我在网页上使用了这个片段。(Prototype.js 函数)效果很好。我所做的只是单击表格行,它似乎被选中。它适用于任何地方,除了 IE 和 Opera。这只是一种方便,所以我并不关心它是否有效,但在 IE 中它会抛出一个错误,并询问用户他/她是否想调试。

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

谢谢,戴夫

( http://math.davehampson.net )

4

3 回答 3

4

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

原型在不同浏览器上的工作方式不同。在允许您使用宿主对象的原型(如 HTMLTableRowElement)的浏览器上,它会将自己的函数添加toggleClassName到这些原型中,因此每次获得 a 时,<tr>您都可以直接在其上调用该方法。哇哦,多方便啊!

不幸的是,能够改变 DOM 节点的原型是没有 ECMAScript 或 DOM 标准真正认可的。它恰好可以在 Firefox 中工作,因为 Mozilla 就是这样,但你不能指望它在所有浏览器中都能工作;它肯定不会在 IE 中工作。

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

Element.extend(this);

现在您可以this.toggleClassName在所有浏览器上安全地调用。

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

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

这是一场调试灾难,也是我不使用原型的原因。

(下周,为了获得额外的火焰诱饵乐趣,为什么我也不使用 jQuery。)

于 2009-12-04T01:43:46.153 回答
1

尝试改用这个:

$(this).toggleClassName('selected')

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

于 2009-12-04T01:24:35.043 回答
0

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

于 2009-12-04T01:24:58.223 回答