我通过创建脚本标记,设置其源代码然后将标记添加到DOM来添加动态脚本。它按预期工作,脚本正在下载并执行。但有时我想在下载之前取消脚本执行。所以我通过从DOM中删除脚本标记来实现。
在IE9,Chrome和Safari中,它按预期工作 - 从DOM中删除脚本标记后,它不会执行。
然而它在Firefox中不起作用 - 即使我将其从DOM中删除或将其src更改为“”或我尝试过的任何其他内容,脚本也会执行,我不能在脚本添加到脚本后停止执行DOM。有什么建议? 谢谢!
答案 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。