代码之家  ›  专栏  ›  技术社区  ›  Bernie Perez

javascript加载顺序

  •  29
  • Bernie Perez  · 技术社区  · 16 年前

    我和他们一起工作 amq.js (ActuMeq)和 Google Maps . 我按此顺序加载脚本

    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
        <title>AMQ & Maps Demo</title>
    
        <!-- Stylesheet -->
        <link rel="stylesheet" type="text/css" href="style.css"></link>
    
        <!-- Google APIs -->
        <script type="text/javascript" src="http://www.google.com/jsapi?key=abcdefg"></script>
    
        <!-- Active MQ -->
        <script type="text/javascript" src="amq/amq.js"></script>
        <script type="text/javascript">amq.uri='amq';</script>
    
        <!-- Application -->
        <script type="text/javascript" src="application.js"></script>
    </head>
    

    不过,在application.js中,它可以很好地加载maps,但在尝试订阅AMQ主题时会出错。AMQ依赖于原型,而firefox中的错误控制台表示没有定义对象。我认为在脚本加载完成之前使用AMQ对象有问题。 在我的application.js中使用两个脚本之前,有没有一种方法可以确保它们都加载?

    谷歌有一个很好的功能调用 google.setOnLoadCallback(initialize); 效果很好。我不确定amq.js是否有类似的东西。

    8 回复  |  直到 7 年前
        1
  •  27
  •   Walter Rumsby    16 年前

    在我的application.js中使用两个脚本之前,有没有一种方法可以确保它们都加载?

    javascript文件应按顺序加载 和块 因此,除非您所依赖的脚本正在做一些不寻常的事情,否则您应该做的就是在其他文件之后加载application.js。

    Non-blocking JavaScript Downloads 有一些关于脚本如何加载的信息(并讨论了一些颠覆块的技术)。

        2
  •  44
  •   John Doe    14 年前

    跨域脚本是在站点本身的脚本之后加载的,这就是出现错误的原因。有趣的是,这里没人知道。

        3
  •  10
  •   Constantin    16 年前

    在jquery中,您可以使用:

    $(document).ready(function(){/*do stuff here*/});
    

    这可以确保在完成您的工作之前,javascript已经加载并且DOM已经就绪。

    在原型中,看起来这可能有效

    document.observe("dom:loaded", function() {/*do stuff here*/});
    

    如果我正确理解你的问题……我想这可能有帮助。

    如果你不想依靠自由党来做这件事…我认为这可能有效:

    <script>
       function doIt() {/*do stuff here*/}
    </script>
    <body onLoad="doIt();"></body>
    
        4
  •  7
  •   cmcginty    16 年前

    我有一个类似的问题,只有一个脚本。我想出的解决办法是 addEventListener("load",fn,false) 到A script 使用创建的对象 document.createElement('script') 下面是最后一个函数,它加载任何标准JS文件,并允许您添加一个“后加载”脚本。

    function addJavaScript( js, onload ) {
       var head, ref;
       head = document.getElementsByTagName('head')[0];
       if (!head) { return; }
       script = document.createElement('script');
       script.type = 'text/javascript';
       script.src = js;
       script.addEventListener( "load", onload, false );
       head.appendChild(script);
    }
    

    我希望这能在将来帮助别人。

        5
  •  3
  •   Alexander Elgin    7 年前

    有没有一种方法可以确保两个脚本在我使用之前都已加载?

    对。

    把你想要加载的代码放在最后(你的 application.js 在原型中 document.observe . 这应该确保只有在原型+其他东西完成并准备好之后才能加载代码。(如果您熟悉jquery,此函数类似于jquery的 $(document).ready )

        6
  •  2
  •   Walter Rumsby    16 年前

    AMQ依赖于原型,而firefox中的错误控制台表示没有定义对象。

    你是说AMQ依赖于 Prototype library ?在您提供的代码中,我看不到该库的导入。

        7
  •  2
  •   Bernie Perez    16 年前

    你是说AMQ依赖于 原型库?我看不见 在代码中为该库导入 你已经提供了。

    是的,对于ActiveMQ的javascript(amq.js),这取决于原型。在amq.js中,它加载3个脚本,分别是amq.js、behavior.js和prototype.js。

    感谢您对javascript加载顺序的帮助。这告诉我我的虫子在另一个城堡里:(

    我想我有一个不同的问题。我还检查了ActiveMQ5.0到5.1中的JS文件,发现它们也是一样的。在5.0版到5.1版中,有些内容发生了变化,需要刷新才能订阅主题。我会继续找的,但谢谢你消除了这个可能的原因。

        8
  •  0
  •   Brian Scott    12 年前

    您还可以使用内置的SharePoint JavaScript方法控制脚本的执行;

    _spBodyOnLoadFunctionNames.push("yourFunction");