30

我正在使用amq.js (ActiveMQ) 和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 中,它可以很好地加载地图,但是在尝试使用 AMQ 订阅主题时出现错误。AMQ 依赖于 Firefox 中的错误控制台说对象未定义的原型。我认为在脚本完成加载之前使用 amq 对象有问题。有没有办法确保在我的 application.js 中使用它们之前加载这两个脚本?

谷歌有这个很好的函数调用google.setOnLoadCallback(initialize);,效果很好。我不确定 amq.js 有这样的东西。

4

8 回答 8

43

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

于 2011-02-28T21:45:55.630 回答
27

有没有办法确保在我的 application.js 中使用它们之前加载这两个脚本?

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

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

于 2008-08-21T04:46:39.690 回答
9

在 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>
于 2008-08-20T23:17:30.353 回答
7

我有一个类似的问题,只有一个脚本。我想出的解决方案是使用使用 Here is the final function 创建addEventListener("load",fn,false)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);
}

我希望这可以帮助将来的人。

于 2009-03-02T10:18:57.787 回答
3

有没有办法在我使用它们之前确保两个脚本都加载?

是的。

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

于 2008-08-20T23:15:32.230 回答
2

AMQ 依赖于 FireFox 中的错误控制台说对象未定义的原型。

您的意思是 AMQ 依赖于原型库吗?在您提供的代码中,我看不到该库的导入。

于 2008-08-21T03:09:52.357 回答
2

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

是的,ActiveMQ 的 javascript (amq.js) 确实依赖于 Prototype。在 amq.js 中,它加载了 3 个脚本,_amq.js、behaviour.js 和 prototype.js。

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

我想我有一个不同的问题。我还检查了从 ActiveMQ 5.0 到 5.1 的 js 文件,发现它们也是一样的。在 5.0 到 5.1 中发生了一些变化,需要刷新主题才能订阅。我会继续寻找,但感谢您消除了这个可能的原因。

于 2008-08-21T16:54:08.880 回答
0

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

_spBodyOnLoadFunctionNames.push("yourFunction");
于 2012-08-01T14:31:05.807 回答