Порядок загрузки JavaScript - PullRequest
29 голосов
/ 21 августа 2008

Я работаю с 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 есть что-то подобное.

Ответы [ 8 ]

44 голосов
/ 01 марта 2011

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

27 голосов
/ 21 августа 2008

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

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

Неблокирующая загрузка JavaScript содержит некоторую информацию о том, как загружаются скрипты (и обсуждаются некоторые приемы для снятия блокировки).

9 голосов
/ 21 августа 2008

в 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>
7 голосов
/ 02 марта 2009

У меня была похожая проблема, только с одним скриптом. Решение, которое я придумал, состояло в том, чтобы использовать 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);
}

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

3 голосов
/ 21 августа 2008

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

Да.

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

2 голосов
/ 21 августа 2008

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

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

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

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

2 голосов
/ 21 августа 2008

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

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

0 голосов
/ 01 августа 2012

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

_spBodyOnLoadFunctionNames.push("yourFunction");
...