感谢阅读。
我有几个类似于以下内容构建的脚本:
scriptone.js
function FunctionOne(){
// Do a bit of work...
// Include a second javascript file, scripttwo.js
// that contains a function called FunctionTwo.js
var scrb = document.createElement('script');
scrb.type = 'text/javascript';
scrb.src = 'http://www.example.com/scripttwo.js?bunchofargs=varied';
// Append it to the head.
document.getElementsByTagName('head')[0].appendChild(scrb);
// Can't run the second function directly, because it may not be loaded quite yet,
// So use the Waiter function.
Interval = setInterval("Waiter()", 10);
// All done.
return;
}
function Waiter(){
if(window.FunctionTwo) {
clearInterval(Interval);
FunctionTwo();
}
}
scripttwo.js
function FunctionTwo(){
document.write('something based on calling page');
}
这适用于FF和IE,但不适用于Opera或Chrome。在Chrome / Opera中,一切似乎在脚本1中都可以正常工作。但是,在scripttwo.js中应该发生的任何事情都不会发生。就好像scripttwo.js没有包括在内一样。
为什么这不能用于Opera或Chrome?
也许我正在使用不兼容的东西,或者是否有我不知道的安全功能?所有文件都在同一个域中。
注意 很棒的回复 - 非常感谢!
FuncionOne在这里只是一个拼写错误,在实际代码中,我使用了更好的函数名称,但为了便于阅读,我在这里更改了它们。这可能是范围,但我同意乔怀特认为它不应该是一个问题。使用JavaScript(我的弱语言之一),谁知道?从HTML文档的头部或主体调用FunctionOne。
我也喜欢将FuncTwo添加到脚本2的末尾,以完全避免使用计时器。更干净,一旦有人向你指出,那么显而易见......
我将在接下来的工作后更新。
再次更新:
大家好,
我现在已经在FF,IE和Chrome中工作,但Opera现在似乎拒绝加载任何.js文件。我认为这只是某种类型的Opera问题(Opera: .js file won't load),并将继续其他三种问题。让你知道结果如何。
答案 0 :(得分:3)
在Opera中它适用于我..
您可以使用事件:
,而不是使用Waiter脚本scrb.onload = function() { FunctionTwo() }
scrb.onreadystatechange = function() { FunctionTwo() }
第二行是Internet Explorer的工作原理。一个问题是Opera似乎处理这两个事件,因此FunctionTwo()将被执行两次。有各种方法来解决这个问题。浏览器检测,一些全局变量等
答案 1 :(得分:2)
你可能只需将FunctionTwo()添加到scripttwo.js的末尾。然后它将在加载时运行,而不会增加间隔的复杂性。
答案 2 :(得分:1)
可能会给您答案的一些问题/评论:
什么叫FuncionOne
(注意你的拼写)?
定时器很乱,并不总是递归(除非停止,否则再次开火)。我会重构Waiter()
以检查Interval
是否仍然存在,如果不存在,则创建一个递归window.setInterval
。
在该注释中,您可能需要明确指定window.setInterval
,而不是省略window.
Interval
的范围是否有效?您在函数中定义它。传统的逻辑会说clearInterval(Interval);
中的Waiter()
无法访问......但JS有点混乱。 Opera和Chrome可能比你希望的更乱。仅仅在任何功能范围之外定义它都应该解决这个问题。
答案 3 :(得分:1)
我认为问题出在Interval
范围内。它在FunctionOne中定义,但不在全局范围内定义。所以,我怀疑在执行Waiter
时,Opera和Chrome遇到Interval
是undefined
并且只是默默地退出FunctionTwo(可能会停止脚本?)。 FF和IE可能会忽略这一点。
(顺便说一下,当clearInterval
收到未定义的参数值时,它应该规范地做什么?)。