JavaScript Порядок загрузки


28

Я работаю как с 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 этот приятный вызов функции google.setOnLoadCallback(initialize);, который отлично работает. Я не уверен, что у amq.js есть что-то вроде этого.

27

Есть ли способ убедиться, что оба сценария загружаются, прежде чем использовать их в приложении application.js?

JavaScript файлы должны загружать последовательно и блокировать так, если скрипты вы в зависимости от делаете что-то необычное все, что вам нужно нужно сделать, это нагрузка application.js после других файлов.

Non-blocking JavaScript Downloads содержит некоторую информацию о загрузке скриптов (и обсуждает некоторые методы, чтобы подорвать блокировку).

  0

Также стоит посмотреть на API-интерфейс [Асинхронный модуль определения] (http://en.wikipedia.org/wiki/Asynchronous_module_definition) и другие, которые делают то же самое для одновременной загрузки файлов JavaScript и других ресурсов. 25 мар. 142014-03-25 16:42:47


3

Есть ли способ убедиться, что оба сценария загружаются до того, как я их использую?

Да.

Введите код, который хотите загрузить последним (application.js) в прототип document.observe. Это должно гарантировать, что код загрузится только после того, как прототип + другой материал будет готов и готов. (Если вы знакомы с JQuery, эта функция похожа на JQuery-х $(document).ready)


10

в JQuery вы можете использовать:

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

который удостоверяется Javascript загружен и дом готов, прежде чем делать свои вещи.

в прототипе, похоже, это может работать

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

Если я правильно понимаю вашу проблему правильно .. Я думаю, что может помочь ..

Если вы не хотите, чтобы полагаться на Lib для сделать это ... Я думаю, что это может работать:

<script> 
    function doIt() {/*do stuff here*/} 
</script> 
<body onLoad="doIt();"></body> 
  0

Удостоверяется ли, что загружен javascript и dom, или только dom? 24 май. 122012-05-24 02:13:37

  0

dom и javascript 24 май. 122012-05-24 18:10:27


2

AMQ зависит от прототипа, который консоль ошибок в FireFox говорит объект не Defi Нед.

Вы имеете в виду, что AMQ зависит от Prototype library? Я не вижу импорт для этой библиотеки в коде, который вы предоставили.


2

Вы хотите сказать, что AMQ зависит от библиотеки прототипов ? Я не вижу импорт для этой библиотеки в коде , который вы предоставили.

Да, для javascript для ActiveMQ (amq.js) зависит от прототипа. В amq.js он загружает 3 скрипта, _amq.js, behaviour.js и prototype.js.

Благодарим вас за помощь в загрузке JavaScript. Это говорит мне, что моя ошибка находится в другом замке :(

У меня другая проблема. Я также проверил файлы js от ActiveMQ 5.0 до 5.1 и заметил, что они были такими же. Что-то изменилось в 5.0 на 5.1, который требует обновления тем для подписки. Я буду продолжать искать, но спасибо за устранение этой возможной причины.


7

У меня была схожая проблема, только с одним скриптом. Решение, которое я придумал, было использовать addEventListener("load",fn,false) для объекта script, созданного с использованием document.createElement('script'). Вот последняя функция, которая загружает любой стандартный JS-файл и позволяет добавить сценарий «post load».

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); 
} 

Надеюсь, это может помочь кому-то в будущем.

  0

Спасибо, это полезно. 24 июн. 102010-06-24 06:55:30


43

междоменные скрипты загружаются после скриптов самого сайта, поэтому вы получаете ошибки. интересно, никто этого не знает.

+2

Спасибо за этот комментарий. После переноса моих сценариев в один и тот же домен больше нет проблем. 02 сен. 112011-09-02 16:05:39

+2

Есть ли ошибка здесь (http://stackoverflow.com/questions/1307929/javascript-dom-load-events-execution-sequence-and-document-ready) при «замечательном хорошем ответе»: «Javascript гарантирован выполняться в том порядке, в котором он отображается в вашем HTML-коде, поэтому просто убедитесь, что ваша функция определена, прежде чем пытаться присоединить ее к событию. "? 24 окт. 112011-10-24 20:06:20

+14

Это не представляется возможным, так как довольно распространенная практика загрузки, скажем, jQuery из CDN от Google, а затем ваши собственные локальные скрипты, которые требуют jQuery. 04 фев. 132013-02-04 10:03:27

+2

Просто протестировал это в последних версиях Chrome и Firefox, и это не так, как в , Это также противоречит MDN (см. Https://developer.mozilla.org/en/docs/Web/HTML/Element/script). -1; вы не представили никаких доказательств для своего заявления, и я не верю, что это правда. 20 дек. 142014-12-20 22:18:00


0

Вы также можете использовать встроенный метод JavaScript javascript для управления выполнением ваших скриптов;

_spBodyOnLoadFunctionNames.push("yourFunction");