Закладка продлится до загрузки Javascript
У меня есть букмарклет, который загружает jQuery и некоторые другие js-библиотеки.
Как я:
- Подождите, пока библиотека javascript, которую я использую, недоступна/загружена. Если я попытаюсь использовать script, прежде чем он завершит загрузку, например, используя функцию $с jQuery перед ее загрузкой, генерируется исключение undefined.
- Убедитесь, что загрузочный буклет не будет кэшироваться (без использования заголовка сервера или, очевидно, что это файл javascript: метатег)
Кто-нибудь знает, работает ли onload для динамически добавленного javascript в IE? (чтобы противоречить этому сообщению
Какое самое простое решение, самое чистое решение этих проблем?
Ответы
Ответ 1
Это зависит от того, как вы загружаете jQuery. Если вы добавляете элемент script на страницу, вы можете использовать тот же метод, который использует jQuery для динамической загрузки script.
EDIT. Я сделал домашнее задание и фактически извлек функцию loadScript из кода jQuery для использования в вашем букмаркете. Это может быть полезно многим (включая меня).
function loadScript(url, callback)
{
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = url;
// Attach handlers for all browsers
var done = false;
script.onload = script.onreadystatechange = function()
{
if( !done && ( !this.readyState
|| this.readyState == "loaded"
|| this.readyState == "complete") )
{
done = true;
// Continue your code
callback();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild( script );
}
};
head.appendChild(script);
}
// Usage:
// This code loads jQuery and executes some code when jQuery is loaded
loadScript("https://code.jquery.com/jquery-latest.js", function()
{
$('my_element').hide();
});
Ответ 2
Чтобы ответить на ваш первый вопрос: Javascript интерпретируется последовательно, поэтому любой следующий код букмарклета не будет выполняться до тех пор, пока библиотека не будет загружена (предполагается, что библиотека была интерпретирована успешно - никаких синтаксических ошибок).
Чтобы предотвратить кеширование файлов, вы можете добавить бессмысленную строку запроса...
url = 'jquery.js?x=' + new Date().getTime();
Ответ 3
Я обратил внимание, что в Chrome порядок загружаемых скриптов не определен, при использовании техники @Vincent Robert. В этом случае небольшая модификация помогает:
(function() {
var callback = function() {
// Do you work
};
// check for our library existence
if (typeof (MyLib) == 'undefined') {
var sources = [
'http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js',
'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js',
'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js',
'http://myhost.com/javascripts/mylib.min.js'];
var loadNextScript = function() {
if (sources.length > 0) {
var script = document.createElement('script');
script.src = sources.shift();
document.body.appendChild(script);
var done = false;
script.onload = script.onreadystatechange = function() {
if (!done
&& (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) {
done = true;
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
loadNextScript();
}
}
} else {
callback();
}
}
loadNextScript();
} else {
callback();
}
})();
Ответ 4
Я немного приблизился к этому, но не полностью. Было бы неплохо иметь дискретный пример букмарклета, демонстрирующий, как избежать кеширования.