Включение Prototype.js дважды вызывает конфликт в IE7 - PullRequest
1 голос
/ 09 июля 2010

Я использую фреймворк Prototype javascript. Я включил его в фрагмент кода JavaScript, который я позволяю людям копировать и вставлять на свои веб-сайты. Существует вероятность того, что их веб-сайт уже содержит Prototype или они хотели включить фрагмент несколько раз. В обоих случаях Prototype будет определен дважды, и в результате IE7 не будет работать. Он скажет «Объект не поддерживает это свойство или метод» почти при любом вызове функции библиотеки прототипов. Я попробовал это:

if (typeof(Prototype) === 'undefined') {
   alert('including Prototype');
   // minified Prototype code here
}
alert('running my code');
// all my code here

Когда я запускал это, только «включая Prototype» было предупреждено, но «запуск моего кода» никогда не получало предупреждение. Почему?

1 Ответ

1 голос
/ 09 июля 2010

только «включая прототип» было оповещено, но «запуск моего кода» никогда не получал оповещения.Почему?

Я не знаю, не увидев код - вы получаете что-нибудь в консоли ошибок JavaScript? - но одна возможность состоит в том, что что-то в коде полагается на неукрашенную глобальную область.Например, оператор function нельзя использовать внутри if в стандартном ECMAScript.Что на самом деле происходит, если вы пытаетесь это сделать, зависит от браузера, но обычно оно может переопределить ранее объявленную версию функции, даже если предложение if не оценивает true.

Эта проблема может быть решена с помощьюпомещая Prototype в свой собственный блок <script>, который вставляется на страницу с помощью методов DOM или document.write до выполнения основного сценария.Однако:

Я включил его в фрагмент кода javascript, который я позволяю людям копировать и вставлять на свои сайты.

Да, я бы на самом деле этого не делал,Использование более чем одной широкомасштабной, навязчивой среды, такой как Prototype или jQuery, на одной странице - это путь к конфликту и потенциально трудным для отладки проблемам.(То же самое с двумя копиями / версиями одного и того же фреймворка.)

Когда вы вставляете сниппет, вы - гость в доме другого веб-мастера, и вам необходимо иметь как можно меньшую площадь.ИМО это означает, что вы не должны использовать какие-либо рамки.

...