Расширение библиотеки .js onScriptLoaded работает до загрузки jQuery - PullRequest
2 голосов
/ 09 ноября 2010

См. это демо от Filament Group с использованием их Прогрессивного улучшения Enhance.js Библиотека

Изменение, чтобы дать: -

<script type="text/javascript" src="../_shared/EnhanceJS/enhance.js"></script>
<script type="text/javascript"> 
// Run capabilities test
enhance({
loadScripts: [
 {src: 'js/excanvas.js', iecondition: 'all'},
 '../_shared/jquery.min.js',
 'js/visualize.jQuery.js',
 'js/example.js'
],
loadStyles: [
'css/visualize.css',
'css/visualize-dark.css'
] 
}); 

    alert($);

</script> 

Iполучить "$ is undefined error" в предупреждении, предположительно, потому что jQuery еще не загружен.

Примечание - предупреждение ($) только для отладки - я пытаюсь что-то сделать с этим, например, $('some-selector') - и никакие $ (обработчик) или $ (документ) .ready и т. д. тоже не работают - jquery не загружен, $ не определен.

добавление onScriptLoaded выглядит так, как будто он должен работать, но если я добавлю

onScriptsLoaded:[runMyCode()]

и более поздние

function runMyCode()
{
    alert("runMyCode was called");
    alert($);
}

Первое предупреждение сработает, но $ все еще не определено.

Если я вызываю runMyCode для события нажатия кнопки, оно работает.

Поэтому возникает вопрос - как запустить код после завершения загрузки всех сценариев с помощью extension.js?

PS Та же проблема проверена в IE8 / FF3 / Chrome7

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Я думаю, что это то, что вам нужно, обратите внимание, что onScriptsLoaded используется непосредственно как обратный вызов , поэтому это должна быть функция, а не массив:

enhance({
   loadScripts: [
    {src: 'js/excanvas.js', iecondition: 'all'},
    '../_shared/jquery.min.js',
    'js/visualize.jQuery.js',
    'js/example.js'
   ],
   loadStyles: [
    'css/visualize.css',
    'css/visualize-dark.css'
   ],
   onScriptsLoaded: function() { alert($); }
});

Или, в более общем случае, для функции, передайте только ссылку, как это:

   onScriptsLoaded: runMyCode

Причина, по которой onScriptsLoaded:[runMyCode()] "вид" работает, заключается в том, что он немедленно вызывает функцию runMyCode (во время выполнения этой строки не , когда сценарии заканчиваются) и делает массив из этого результата. Это на самом деле вызовет ошибку, когда сценарии завершатся, поскольку ожидается, что onScriptsLoaded будет функцией обратного вызова, а не массивом.

3 голосов
/ 09 ноября 2010

Я думаю, что это может быть проблемой:

onScriptsLoaded:[runMyCode()]

пытались ли вы (при условии, что запись массива верна): ( edit & mdash; значение не правильное)

onScriptsLoaded: [runMyCode]

? Во-первых, вы вызываете свою функцию во время настройки библиотеки. Вместо этого вы хотите передать только ссылку на вашу функцию.

edit на самом деле это должно быть просто:

onScriptsLoaded: runMyCode

Я не знаю, откуда появился массив; это определенно не упомянуто в документации "extension.js".

...