Прототип Javascript, работающий в Mozilla, но не в IE - PullRequest
0 голосов
/ 13 октября 2009

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

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

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

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

1 Ответ

1 голос
/ 13 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...