Загружать jquery асинхронно перед другими скриптами
Я добавил атрибут async
для моего HTML-кода включения JavaScript.
Итак, теперь я:
<script async src="jquery.myscript.js"></script>
И это работает со всеми загрузками JS, все, кроме jquery.
Если добавить тэг async
в jQuery <script>
, все остальные script, которые зависят от jquery, не работают.
В этом jsfiddle вы можете увидеть проблему:
http://jsfiddle.net/uFbdV/
В примере я использовал <script> Mycode </script>
вместо включения внешнего file.js, но это не меняет ситуацию.
Я хотел бы запустить jQuery с атрибутом async и запустить другие несколько внешних скриптов асинхронно только после загрузки jquery.
Возможно?
Ответы
Ответ 1
Я хотел бы запустить jQuery с атрибутом async и запустить другие несколько внешних скрипты асинхронно только после загрузки jquery.
Что это значит? Это звучит так же, как вы хотите сначала загрузить jQuery, а затем другие вещи, когда это будет сделано. Поэтому вы хотите загрузить его синхронно. Если вы все еще хотите использовать async
, вы можете определить функцию onload
, чтобы продолжить загрузку других вещей, как только jQuery будет готов. Или вы можете использовать defer
. Оба они описаны здесь: https://davidwalsh.name/html5-async
Ответ 2
Это может быть то, что вы ищете:
http://www.yterium.net/jQl-an-asynchronous-jQuery-Loader - jQl асинхронный загрузчик jQuery.
Он асинхронно загружает jQuery, не блокируя другие компоненты:
jQl.loadjQ('http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js');
jQl автоматически захватывает все вызовы jQuery().ready()
, поэтому вы можете написать:
<script type="text/javascript">
jQl.loadjQ('http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js');
jQuery('document').ready(function(){
alert('Hello world');
});
</script>
jQl поставит в очередь эти вызовы функций и выполнит их, как только загрузится jQuery, и DOM будет готов, так как они будут выполняться обычным способом.
Ответ 3
Это большой пример использования для defer
:
<script defer src="jquery.js"></script>
<script defer src="custom.js"></script>
Ни один из этих тегов не будет блокировать рендеринг. Браузер может загружать jquery.js
и custom.js
параллельно. Он выполнит jquery.js
, как только он будет загружен, и DOM будет загружен, а custom.js
будет выполняться впоследствии.
К сожалению, есть несколько вопросов:
- Вы не можете использовать атрибут
defer
для встроенных скриптов.
- IE < 10 был задокументирован, чтобы вызвать сценарии с
defer
до неожиданно чередовать их выполнение.
- Я не могу найти никаких спецификаций, которые говорят, что сценарии с порядком
defer
предназначены для выполнения по порядку, просто они предназначены для выполнения после загрузки DOM.
Ответ 4
Эта функция умна для асинхронной загрузки javascript:
function loadScripts(urls, length, success){
if(length > 0){
script = document.createElement("SCRIPT");
script.src = urls[length-1];
console.log();
script.onload = function() {
console.log('%c Script: ' + urls[length-1] + ' loaded!', 'color: #4CAF50');
loadScripts(urls, length-1, success);
};
document.getElementsByTagName("head")[0].appendChild(script);
}
else
if(success)
success();
}
Применение:
urls = ['https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.8/js/materialize.min.js',
'http://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js'
];
loadScripts(urls, urls.length, function(){
/* Jquery and other codes that depends on other libraries here */
});
Эта функция умна для асинхронной загрузки css:
function loadLinks(urls, length, success){
if(length > 0){
link = document.createElement("LINK");
link.href = urls[length-1];
link.rel = 'stylesheet';
link.onload = function() {
console.log('%c link: ' + urls[length-1] + ' loaded!', 'color: #4CAF50');
loadLinks(urls, length-1);
};
document.getElementsByTagName("head")[0].appendChild(link);
}
else
if(success)
success();
}
Применение:
links = [
'https://www.amirforsati.ir/css/styles.css',
'https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css',
'https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.8/css/materialize.min.css'
];
loadLinks(links, links.length, function(){});
Вы можете использовать как css, так и функцию javascript для загрузки асинхронно css и js. используйте эти коды в файле, который загружается асинхронно:
<script async src="js/scripts.js"></script>
Ответ 5
<script>var JSdep = [
["//ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.4.min.js", "window.jQuery", "/bundle/jquery"],
["//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js", "self.framework === 'bootstrap'", "/bundle/bootstrap"],
["//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js", "window.jQuery && window.jQuery.ui && window.jQuery.ui.version === '1.12.1'", "/bundle/jqueryui"],
["//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js", "window.jQuery && window.jQuery.fn.selectpicker", "/bundle/bootstrap-select"],
]
</script>
<script type="text/javascript">
var downloadJSAtOnload = function (e) {
var src = e.srcElement.src.toString();
//console.log("[jquery] loaded", src);
for (var i = 0; i < JSdep.length; i++) {
if (src.indexOf(JSdep[i][0]) !== -1) {
if ((!JSdep[i][1]) || (eval(JSdep[i][1]))) {
console.log("[jquery] loaded ok", src);
break;
} else {
console.log("[jquery] fail", src);
return;
}
}
}
if (i === JSdep.length) {
console.log("[jquery] fallback loaded ok", src);
}
if (jqloaded) {
return;
}
jqloaded = true;
for (var i = 1; i < JSdep.length; i++) {
//console.log("[jquery] loading", JSdep[i][0], JSdep[i][1], JSdep[i][2]);
var raf2 = requestAnimationFrame || mozRequestAnimationFrame ||
webkitRequestAnimationFrame || msRequestAnimationFrame;
if (raf2) { window.setTimeout(dljquery([JSdep[i][0], JSdep[i][1], JSdep[i][2]]), 0); }
else window.addEventListener('load', dljquery([JSdep[i][0], JSdep[i][1], JSdep[i][2]]));
}
}
var downloadJSAtOnerror = function (e) {
var src = e.srcElement.src.toString();
console.log("[jquery] error", src);
for (var i = 0; i < JSdep.length; i++) {
if (src.indexOf(JSdep[i][0]) !== -1) {
console.log("[jquery] failed try fallback", src);
dljquery([JSdep[i][2], JSdep[i][1]]);
return;
}
}
console.log("[jquery] failed on fallback", src);
return;
}
// Add a script element as a child of the body
var dljquery = function (src) {
//console.log("[jquery] start", src);
var element = document.createElement("script");
element.src = src[0];
element.async = "async";
try {
document.body.appendChild(element);
} catch (err) {
console.log("[jquery] err", err);
}
if (element.addEventListener) {
element.addEventListener("load", downloadJSAtOnload, false);
element.addEventListener("error", downloadJSAtOnerror, false);
} else if (element.attachEvent) {
element.attachEvent("onload", downloadJSAtOnload);
element.attachEvent("onerror", downloadJSAtOnerror);
} else {
element.onload = downloadJSAtOnload;
element.onerror = downloadJSAtOnerror;
}
}
// var fb = "/bundle/jquery";
var raf = requestAnimationFrame || mozRequestAnimationFrame ||
webkitRequestAnimationFrame || msRequestAnimationFrame;
if (raf) raf(function () { window.setTimeout(dljquery([JSdep[0][0], JSdep[0][1], JSdep[0][2]]), 0); });
else window.addEventListener('load', dljquery([JSdep[0][0], JSdep[0][1], JSdep[0][2]]));
var jqloaded = false;
function doOnload() {
console.log("[jquery] onload");
}
// Check for browser support of event handling capability
if (window.addEventListener)
window.addEventListener("load", doOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", doOnload);
else window.onload = doOnload;
</script>
нашел это У меня были проблемы с загрузкой загрузок иногда до jquery теперь надеюсь, что это поможет другим Я положил этот script на голову, но дал ошибку, не могу добавить appendChild сейчас /body и проверенные работы для всех браузеров, которые я пробовал scriptasync, но у него не было события, которые говорят мне, когда загрузка заканчивается и несколько раз загрузочная загрузка перед jquery и наоборот наоборот, потому что bootstrap зависит от jquery, мне пришлось загружать jquery, а затем запускать загрузить bootstrap сейчас я добавлю резервную копию
зафиксировал его
теперь он проверяет, что jq загружен
и только затем загружает другие
ok теперь его скопировать в папку