Прототип Javascript, работающий в Mozilla, но не в IE

Я использую библиотеку JavaScript из прототипа v.1.6.0.3. Я обнаружил, что базовая нотация $ отлично работает в Mozilla, но не в IE6.

Вот простой пример

  • Element.hide('div123'); -> работа в IE & Mozilla
  • $('div123').hide(); -> работает только в Mozilla

Мне интересно, чего мне здесь не хватает, так как у меня также есть некоторые другие случаи, которые не работают в IE, такие как перетаскивание (это никогда не сбрасывается в IE, но хорошо в Mozilla). Хотя из моего понимания Prototype является "поддержкой" IE?

13.10.2009 03:15:15
Кажется, в IE6 работает простой тест: jsbin.com/usaca Используете ли вы какие-либо другие библиотеки JavaScript (например, jQuery)?
brianpeiris 13.10.2009 03:57:55
Большое спасибо brianpeieris. Вы правы, все странные вещи в IE6, вызванные другой библиотекой mootools.js. Вы действительно помогаете мне !!
beng 13.10.2009 05:34:54
1 ОТВЕТ

Я не думаю, что ошибка в размещенном коде; обе версии работают для меня, и ни один из этих вызовов не делает ничего особенного в разных браузерах.

Однако 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, даже если вы можете получить дескриптор их функции конструктора, которая также не является определено, что он существует в любом конкретном месте. Прототип использует нестандартную функцию, чтобы код потенциально выглядел лучше, но вы не можете воспользоваться этим на практике, к сожалению.)

1
13.10.2009 05:51:45