【问题标题】:Defer Loading of javascript for google page insights延迟加载 javascript 以获取谷歌页面洞察
【发布时间】:2017-07-21 15:54:06
【问题描述】:

我有一个延迟加载 javascript 的代码我想知道代码是否会根据它们在代码中的位置按顺序加载脚本(JQuery.min 首先)?

function downloadJSAtOnload() {


var element01 = document.createElement("script");
element01.src = "js/jquery.min.js";
document.body.appendChild(element01);

var element02 = document.createElement("script");
element02.src = "js/plugins.js";
document.body.appendChild(element02);

var element03 = document.createElement("script");
element03.src = "js/scripts.js";
document.body.appendChild(element03);


var element04 = document.createElement("script");
element04.src = "js/SmoothScroll.min.js";
document.body.appendChild(element04);

var element05 = document.createElement("script");
element05.src = "js/contact-form.js";
document.body.appendChild(element05);

}

if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;

如果这没有先加载JQuery.min,然后再加载其他js文件,你如何让JQuery.min成为第一个加载的脚本,然后加载其余的脚本? 另外我猜例如 contact-form.js 将是第一个完成加载的,因为它很小,所以这可能会导致 Uncaught ReferenceError: $ is not defined 我猜是因为 JQuery.min 还没有完成下载所以你将如何解决这个问题?我猜是一个听众/如果完成加载加载其他人等待...... 在此先感谢

【问题讨论】:

  • 您是对的,您是按顺序调用它们,因为您不能确定它们会以相同的顺序返回。回调或承诺可以解决这个问题。
  • 你能不能用一个promise来加载jquery.min,然后在加载其余部分的分辨率上?
  • 我会调查一下,我对 Promise 几乎一无所知
  • 不幸的是,我也不是,但他们做同步事情的能力似乎符合你的需要

标签: javascript jquery onload deferred


【解决方案1】:

在这里找到Load jQuery with JavaScript using Promises

function loadScript(url) {
    return new Promise(function(resolve  reject) {
        var script = document.createElement("script");
        script.onload = resolve;
        script.onerror = reject;
        script.src = url;
        document.getElementsByTagName("head")[0].appendChild(script);
    });
}

function loadjQuery() {
    if (window.jQuery) {
        // already loaded and ready to go
        return Promise.resolve();
    } else {
        return loadScript('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js');
    }
}


// Usage:
loadjQuery().then(function() {
    // code here that uses jQuery
}, function() {
    // error loading jQuery
});

【讨论】:

  • 这看起来不错,但是脚本必须附加到头部吗?为什么不在结束正文标签之后?使用 Promise 的代码是否可以跨浏览器工作?另一个小问题可能是,如果完整渲染(加载时)花费的时间太长,谷歌会惩罚页面加载,而不仅仅是第一次渲染。这段代码不会侵犯本机 onload 吗?这将是一个了不起的解决方案,只是想知道它是否有效以及如何工作。
  • @ptts 我认为将其附加到何处并不重要。根据这个stackoverflow.com/questions/22516959/… 它是跨浏览器兼容的
  • 哇,那太好了。但是,链接中的哪一个回复是有效的?如果我阅读所有答案,会有一些争议。
  • 我看了去年12月最新的一篇
  • 我假设我使用 var element05 = document.createElement("script");等等等等,这里使用jQuery的代码也有这种方法与纯javascript相比有什么缺点吗?
【解决方案2】:

这很快,但我认为应该可以。

function downloadJSAtOnload() {
    var element01 = document.createElement("script");
    element01.src = "js/jquery.min.js";
    document.body.appendChild(element01);

    element01.onload = function() {
        var element02 = document.createElement("script");
        element02.src = "js/plugins.js";
        document.body.appendChild(element02);

        var element03 = document.createElement("script");
        element03.src = "js/scripts.js";
        document.body.appendChild(element03);


        var element04 = document.createElement("script");
        element04.src = "js/SmoothScroll.min.js";
        document.body.appendChild(element04);

        var element05 = document.createElement("script");
        element05.src = "js/contact-form.js";
        document.body.appendChild(element05);
    }
}

【讨论】:

  • 我试图满足谷歌页面洞察/在我的网站文件的首屏,所以寻找一个加载 jquery.min.js 并摆脱文件上的上述折叠警告的解决方案
  • @Neths 那么,您希望能够加载 jquery.min.js 并且一旦完全加载然后加载其余部分?这能解决你的问题吗?
  • 我认为它会因为如果 juqery.min.js 首先完全加载它不会抛出 $ is not defined 错误
  • 这会抛出 Uncaught SyntaxError: Unexpected end of input
猜你喜欢
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多