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

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

20.08.2008 22:53:25
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

27
21.08.2008 04:46:39
Также стоит взглянуть на API определения асинхронного модуля и другие, которые делают то же самое для параллельной загрузки файлов JavaScript и других ресурсов.
Vimes 25.03.2014 16:42:47

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

Да.

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

3
5.01.2018 12:51:47

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

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

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

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

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

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

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

<script>
   function doIt() {/*do stuff here*/}
</script>
<body onLoad="doIt();"></body>
9
20.08.2008 23:17:30
Убедитесь, что загружен javascript и dom, или просто dom?
Gattster 24.05.2012 02:13:37

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

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

2
21.08.2008 03:09:52

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

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

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

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

2
21.08.2008 16:54:08

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

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

7
2.03.2009 10:18:57
Спасибо, это полезно.
Jon Onstott 24.06.2010 06:55:30

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

44
28.02.2011 21:45:55
Спасибо за этот комментарий. После перемещения моих сценариев в тот же домен проблем больше нет.
BradH 2.09.2011 16:05:39
Есть ли здесь ошибка ( stackoverflow.com/questions/1307929/… ) в «подходящем ответе»: «Javascript гарантированно будет работать в том порядке, в котором он указан в вашем HTML, поэтому просто убедитесь, что ваша функция определена, прежде чем пытаться прикрепить его к событию. "?
Olivier Pons 24.10.2011 20:06:20
Это кажется невозможным, поскольку довольно распространенной практикой является загрузка, скажем, jQuery из CDN Google, а затем
spinn 4.02.2013 10:03:27
Только что проверил это в последних версиях Chrome и Firefox, и это не так. Это также противоречит MDN (см. Developer.mozilla.org/en/docs/Web/HTML/Element/script ). -1; вы не предоставили никаких доказательств по вашему требованию, и я не верю, что это правда.
Mark Amery 20.12.2014 22:18:00

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

_spBodyOnLoadFunctionNames.push("yourFunction");
0
1.08.2012 14:31:05