代码之家  ›  专栏  ›  技术社区  ›  Eli

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

  •  4
  • Eli  · 技术社区  · 17 年前

    谢谢你的阅读。

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

    脚本一。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();
        }
    }
    

    第二个。js

    function FunctionTwo(){
        document.write('something based on calling page');
    }
    

    这适用于FF和IE,但不适用于Opera或Chrome。在Chrome/Opera中,脚本一中的一切似乎都正常。然而,在第二个脚本中不应该发生什么。js确实发生了。好像是两个。js没有被包括在内。

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

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


    笔记 很好的回复-非常感谢!

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

    我还喜欢在脚本二的末尾添加FuncTwo,以完全避免计时器。更干净,一旦有人指给你看就很明显。。。

    下一步我会在完成这项工作后更新。

    再次更新:

    大家好,

    我现在已经在FF、IE和Chrome中使用了它,但Opera似乎拒绝加载任何内容。js文件现在已经没有了。我觉得这只是某种歌剧的问题( Opera: .js file won't load ),并将继续进行其他三项。让你知道结果如何。

    4 回复  |  直到 9 年前
        1
  •  3
  •   Thorarin    17 年前

    这在歌剧中对我很管用。。

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

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

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

        2
  •  2
  •   SpliFF    17 年前

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

        3
  •  1
  •   Oli    17 年前

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

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

    • 计时器杂乱无章,并不总是重复(除非停止,否则会再次开火)。我会重构 Waiter() 查证 Interval 仍然存在,如果不存在,则创建递归 window.setInterval .

    • 因此,您可能需要明确指定 窗设定间隔 ,而不是忽略 window.

    • 它的范围是什么 间隔 工作您可以在函数中定义它。传统逻辑会这么说 clearInterval(Interval); 在里面 服务员() 无法访问。。。但是JS有点像那样凌乱。Opera和Chrome可能没有你所希望的那么凌乱。仅仅在任何功能范围之外定义它就可以解决这个问题。

        4
  •  1
  •   Thevs    17 年前

    我认为问题在于 Interval 范围它在FunctionOne中定义,但不在全局范围内。所以,我怀疑在执行的时候 Waiter ,Opera和Chrome都遇到了这个问题 间隔 是 undefined 然后默默地退出Function2(可能停止脚本?)。FF和IE可能会忽略这一点。

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