是的,这基本上是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%,但它做到了! –