【问题标题】:Why doesn't this Javascript work with Opera or Chrome?为什么这个 Javascript 不能与 Opera 或 Chrome 一起使用?
【发布时间】:2010-11-01 01:07:53
【问题描述】:

感谢阅读。

我有几个类似于以下内容的脚本:

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 中,脚本一中的一切似乎都正常。然而,scripttwo.js 中不应该发生的事情实际上并没有发生。好像没有包含 scripttwo.js。

知道为什么这不适用于 Opera 或 Chrome?

也许我正在使用不兼容的东西,或者是否有我不知道的安全功能?所有文件都在同一个域中。


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

FuncionOne 在这里只是一个错字,在实际代码中,我使用了更好的函数名称,但为了便于阅读,我在这里更改了它们。这可能是范围,尽管我同意 Joe White 的观点,认为这不应该是一个问题。使用 JavaScript(我的弱语言之一),谁知道呢? FunctionOne 从 HTML 文档的头部或正文中调用。

我也喜欢将 FuncTwo 添加到脚本 2 末尾的想法,以完全避免计时器。更干净,一旦有人向你指出它就会变得如此明显......

我会在接下来的工作后更新。

再次更新:

大家好,

我现在可以在 FF、IE 和 Chrome 中使用它,但 Opera 现在似乎完全拒绝加载任何 .js 文件。我认为这只是某种 Opera 问题 (Opera: .js file won't load),并将继续处理其他三个问题。让你知道结果如何。

【问题讨论】:

    标签: javascript browser cross-browser


    【解决方案1】:

    它在 Opera 中对我有用..

    您可以使用事件来代替 Waiter 脚本:

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

    第二行是为了让 Internet Explorer 工作。一个问题是 Opera 似乎处理了这两个事件,所以 FunctionTwo() 将被执行两次。有多种方法可以解决这个问题。浏览器检测、一些全局变量等

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        一些可能会给你答案的问题/cmets:

        • 什么叫FuncionOne(注意你的拼写)?

        • 定时器很混乱,并不总是递归(除非停止,否则会再次触发)。我将重构Waiter() 以检查Interval 是否仍然存在,如果不存在,则创建一个递归window.setInterval

        • 在此说明中,您可能需要明确指定 window.setInterval,而不是省略 window.

        • Interval 的范围是否有效?您在函数中定义它。传统逻辑会说Waiter() 中的clearInterval(Interval); 将无法访问...但是JS 就是这样有点乱。 Opera 和 Chrome 可能没有您希望的那么混乱。仅仅在任何函数范围之外定义它应该可以解决这个问题。

        【讨论】:

        • Interval 没有在本地声明为 var;因此它是隐含的 Window.Interval (我讨厌 JavaScript 的一件事)。范围应该不是问题。
        • 如果您确定您的代码应该可以工作但它在某些平台上无法正常运行,那么您应该首先关注不必要的隐含。每个主要浏览器都运行自己的 Javascript 实现,因此有很大的空间可以弥补差距。
        【解决方案4】:

        我认为问题出在Interval 范围内。它在 FunctionOne 内部定义,但不在全局范围内。所以,我怀疑在执行 Waiter 时,Opera 和 Chrome 会遇到 Intervalundefined 并且只是默默地退出 FunctionTwo(也许停止脚本?)。 FF 和 IE 可能会忽略这一点。

        (顺便说一句,clearInterval 在收到未定义的参数值时应该规范地做什么?)。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 1970-01-01
        相关资源
        最近更新 更多