Я не думаю, что ошибка в размещенном коде; обе версии работают для меня, и ни один из этих вызовов не делает ничего особенного в разных браузерах.
Однако Prototype работает очень по-разному в 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
Это на самом деле одна из худших функций Prototype, потому что вы можете написать загрузку кода в Mozilla, которая не будет работать в IE и не заметить: она не столько скрывает различия в браузере, сколько усиливает их.
Что еще хуже, поскольку многие из собственных методов Prototype неявно расширяют объекты, и поскольку после расширения эти Узлы сохраняют свои расширения, очень легко получить ситуации, когда в IE ваш код, который забывает расширить элемент, обычно обычно работает, потому что что-то еще расширило это уже, но в более редких обстоятельствах взорвется. Это не хорошо для отладки.
(*: не ошибка IE. В стандарте ECMAScript не ожидается, что вы сможете изменять прототипы «хост-объектов», таких как DOM, даже если вы можете получить указатель на их функцию конструктора, которая также не указано, что он существует в каком-либо конкретном месте. Prototype использует нестандартную функцию, чтобы сделать код потенциально более приятным, но вы, к сожалению, не можете воспользоваться этим на практике.)