为什么';这个Javascript不能与Opera或Chrome一起使用吗?

为什么';这个Javascript不能与Opera或Chrome一起使用吗?,javascript,browser,cross-browser,Javascript,Browser,Cross Browser,谢谢你的阅读 我有几个脚本,它们的构建类似于以下内容: 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');

谢谢你的阅读

我有几个脚本,它们的构建类似于以下内容:

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();
    }
}
function FunctionTwo(){
    document.write('something based on calling page');
}
scripttwo.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();
    }
}
function FunctionTwo(){
    document.write('something based on calling page');
}
这适用于FF和IE,但不适用于Opera或Chrome。在Chrome/Opera中,脚本一中的一切似乎都正常。然而,scripttwo.js中应该发生的事情实际上没有发生。就好像scripttwo.js没有被包括在内

你知道为什么Opera或Chrome不能使用吗?

也许我正在使用不兼容的东西,或者有我不知道的安全特性吗?所有文件都在同一个域上


注意 非常好的回复-非常感谢

FunctionOne在这里只是一个输入错误,在实际代码中,我使用了更好的函数名,但为了可读性,我在这里更改了它们。这可能是范围问题,尽管我同意乔·怀特的观点,这不应该成为一个问题。使用JavaScript(我的弱语言之一),谁知道呢?FunctionOne从HTML文档的头部或正文调用

我还喜欢在脚本2的末尾添加FuncTwo,以完全避免计时器。更干净,而且一旦有人指出给你看

下一步我将在完成此工作后更新

再次更新:

大家好


我现在可以在FF、IE和Chrome中使用它,但Opera现在似乎拒绝加载任何.js文件。我认为这只是某种形式的歌剧问题(),并将继续讨论其他三个问题。让你知道结果如何。

一些可能给你答案的问题/评论:

  • 什么调用
    functionOne
    (注意拼写)

  • 计时器杂乱无章,并不总是重复出现(除非停止,否则会再次开火)。我将重构
    waterer()
    以检查
    Interval
    是否仍然存在,如果不存在,则创建一个递归
    窗口。setInterval

  • 注意,您可能需要显式指定
    window.setInterval
    ,不要忽略
    窗口。

  • Interval
    的范围是否有效?您可以在函数中定义它。传统逻辑认为
    clearInterval(Interval)waterer()
    中的code>将无法访问。。。但是JS有点像那样凌乱。Opera和Chrome可能比你希望的要简单一些。仅仅在任何函数范围之外定义它就可以解决这个问题


您可以在scripttwo.js的末尾添加FunctionTwo()。然后,它将在加载时运行,而不会增加间隔的复杂性。

它在Opera中对我有效

您可以使用以下事件,而不是使用服务员脚本:

scrb.onload = function() { FunctionTwo() }
scrb.onreadystatechange = function() { FunctionTwo() }

第二行是让InternetExplorer工作。这里的一个问题是Opera似乎处理了这两个事件,因此FunctionTwo()将执行两次。有各种各样的方法来解决这个问题。浏览器检测、一些全局变量等。

我认为问题在于
间隔范围。它在FunctionOne中定义,但不在全局范围内。因此,我怀疑在执行
waterer
时,Opera和Chrome会遇到
Interval
未定义的
,只是默默地退出FunctionTwo(可能会停止脚本?)。FF和IE可能会忽略这一点


(顺便说一句,当它收到未定义的参数值时,
clearInterval
通常应该做什么?)

Interval不在本地声明为var;因此它是隐式的Window.Interval(我讨厌JavaScript的一个方面)。范围不应该是一个问题。如果你确信你的代码应该工作,但它在某些平台上不能正常运行,那么不必要的隐式应该是你的首要目标。每个主流浏览器都运行自己的Javascript实现,因此有很大的空间来弥补这些差距。问得好。只是在Chrome和Firefox中尝试了一下,结果失败了。