Отмена динамического сценария путем удаления тега сценария не работает в FF - PullRequest
0 голосов
/ 08 июня 2011

Я добавляю динамический скрипт, создавая тег скрипта, устанавливая его источник и затем добавляя тег в DOM. Работает как положено, скрипт загружается и запускается. Однако иногда я хотел бы отменить выполнение скрипта до того, как был загружен. Поэтому я делаю это, удаляя тег script из DOM.

В IE9, Chrome и Safari он работает должным образом - после удаления тега скрипта из DOM он не выполняется.

Однако это не работает в Firefox - скрипт выполняется, даже если я удаляю его из DOM или меняю его src на "" или что-то еще, что я пробовал, я не могу остановить выполнение скрипта после того, как он был добавлен в DOM. Какие-либо предложения? Спасибо!

1 Ответ

1 голос
/ 08 июня 2011

Как насчет какой-то договоренности об обратном вызове? Вместо того, чтобы динамически добавляемый скрипт просто выполнялся сам при загрузке, он должен вызывать функцию в вашем основном скрипте, которая решит, стоит ли идти дальше. Вы могли бы заставить функцию основного скрипта просто возвращать true или false (выполнить / не выполнять), или она могла бы принять функцию обратного вызова в качестве параметра, чтобы она могла точно определить, когда запускать динамический скрипт - таким образом, если у вас было несколько динамические сценарии главный сценарий может подождать, пока все они загрузятся, а затем выполнить их в определенном порядке.

В вашем основном скрипте JS:

function dynamicScriptLoaded(scriptId,callback) {
   if (scriptId === something && someOtherCondition())
      callback();
   // or store the callback for later, put it on a timeout, do something
   // to sequence it with other callbacks from other dynamic scripts,
   // whatever...
}

В вашем динамически добавленном скрипте:

function start() {
   doMyThing();
   doMyOtherThing();
}

if (window.dynamicScriptLoaded)
   dynamicScriptLoaded("myIdOrName",start);
else
   start();

Динамический скрипт проверяет, есть ли определенная функция dynamicScriptLoaded (), ожидая, что она будет в основном скрипте (не стесняйтесь обновить его до более надежного теста, то есть проверки, что dynamicScriptLoaded на самом деле является функцией). Если он определен, он вызывает его, передавая функцию обратного вызова. Если он не определен, он предполагает, что все в порядке, чтобы продолжить и выполнить себя - или вы можете использовать любую резервную функцию, которая вам нравится.

ОБНОВЛЕНИЕ: я изменил тест if выше, так как if(dynamicScriptLoaded) выдаст ошибку, если функция не существует, тогда как if(window.dynamicScriptLoaded) будет работать. Предполагая, что функция является глобальной - очевидно, это можно изменить, если использовать схему пространства имен.

За год с того момента, как я впервые опубликовал этот ответ, мне стало известно, что загрузчик yepnope.js позволяет вам загружать скрипт, не выполняя его, поэтому он должен быть в состоянии справиться с упомянутой ситуацией blankSlate в комментарии ниже. yepnope.js всего 1.7kb.

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