通过删除脚本标记取消动态脚本在FF中不起作用

时间:2011-06-07 23:27:47

标签: javascript firefox dynamic

我通过创建脚本标记,设置其源代码然后将标记添加到DOM来添加动态脚本。它按预期工作,脚本正在下载并执行。但有时我想在下载之前取消脚本执行。所以我通过从DOM中删除脚本标记来实现。

在IE9,Chrome和Safari中,它按预期工作 - 从DOM中删除脚本标记后,它不会执行。

然而它在Firefox中不起作用 - 即使我将其从DOM中删除或将其src更改为“”或我尝试过的任何其他内容,脚本也会执行,我不能在脚本添加到脚本后停止执行DOM。有什么建议? 谢谢!

1 个答案:

答案 0 :(得分:1)

某种回调安排怎么样?而不是让动态添加的脚本在加载时简单地执行,让它调用主脚本中的函数来决定是否继续。您可以让主脚本的函数只返回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 loader允许您在不执行脚本的情况下加载脚本,因此它应该能够处理下面评论中提到的blankSlate情况。 yepnope.js只有1.7kb。