我不认为错误是在发布的代码;两个版本都适用于我,这两种调用在不同的浏览器上都没有什么不同。
但是,原型在IE和Mozilla中的工作方式大不相同,这可能会导致代码中的其他地方出现差异。
在Mozilla中,Prototypre将其方法添加到HTMLElement等的原型中,以便所有DOM对象都可以直接调用这些方法。然而这在IE(*)中是不可能的,因此为了覆盖所有的浏览器,你必须'扩充'你想要调用方法的每个节点,或者明确地通过调用Element.extend
,或者通过使用Prototype自己的方法之一隐式地作为$
功能,获得一个句柄的对象:
document.getElementByID('foo').hide(); // ok on Mozilla, fail on IE
$('foo').hide(); // ok everywhere
Element.hide('foo'); // ok everywhere
Element.extend(document.getElementByID('foo'));
document.getElementByID('foo').hide(); // ok everywhere
这实际上是原型的最坏的特征之一,因为你可以写在Mozilla一的代码加载,将在IE中失败,并没有注意到:它不是如此多的隐藏浏览器差异,以放大它们。更糟糕的是,由于许多Prototype自己的方法隐式扩展对象,并且因为一旦扩展这些节点保留其扩展名,就很容易获得在IE中忘记扩展元素的代码通常工作因为别的东西已经延伸了,但在一些更罕见的情况下会炸毁。这不利于调试。 (*:不是IE的错误,在ECMAScript标准中,你不能期望像DOM那样能够改变'主机对象'的原型,即使你可以得到它们的构造函数的句柄,这也没有被指定存在于任何特定的地方原型是利用非标准的功能,使代码可能看起来更好,但你不能在实践中利用这一点,令人遗憾)。
一个简单的测试似乎在IE6中工作:http://jsbin.com/usaca您是否使用任何其他JavaScript库(例如jQuery)? – brianpeiris 2009-10-13 03:57:55
非常感谢brianpeieris 你是对的,所有在另一个库引起的IE6奇怪的事情mootools.js 你真的帮助我! – beng 2009-10-13 05:34:54