加载内联jQuery脚本以及延迟和异步脚本

问题描述 投票:4回答:3

我正在一个网站上工作并致力于其Page Speed Insights并拥有一个

Eliminate render-blocking JavaScript and CSS in above-the-fold content

所以基本上发生的事情是我在页面顶部有两个外部javascript导入,它是:

<script src="/remotestaff_2015/js/jquery-1.10.2.min.js" type="text/javascript"></script>
<script src="/remotestaff_2015/js/bootstrap.min.js" type="text/javascript"></script>

这个网站有很多javascripts,但有些是在<body>标签之后的页面底部。所以我的问题是那两个在顶部。为了修复渲染块,我已经在google上搜索了一下,发现我可以使用deferasync属性。我的问题是网站上有一些模块有内联javascripts,如:

<script type="text/javascript">

$("#menu-toggle").click(function(e) {

    e.preventDefault();

    $("#wrapper").toggleClass("toggled");

    if ($("#wrapper").hasClass("toggled")) {

        $(".color-fade").css("opacity", ".5");

    } else {

        $(".color-fade").css("opacity", "1");

    }

});

因此,如果我推迟我的jquery文件,我的内联javascripts会出现错误,因为它会在没有加载jquery的情况下加载。有没有办法修复这个内联脚本或以某种方式使它们在延迟的jquery或其他js文件加载后运行?我不想将这些内联脚本放在其他文件中。

javascript jquery asynchronous optimization lazy-loading
3个回答
1
投票

据MDN称:

此布尔属性设置为向浏览器指示在解析文档之后但在触发DOMContentLoaded之前要执行脚本。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

因此,让您的内联脚本等待文档和加载的延迟脚本。发生这种情况时,DOMContentLoaded事件将会触发:

    <script>
        document.addEventListener('DOMContentLoaded', function() {
          // Inline scripts go here
        });
    </script>

请注意,$(document).ready(function()不再需要了,因为那将等待相同的事件(DOMContentLoaded)。


0
投票

你可以动态加载你的js

$(window).bind("load", function() { // code here });

要动态加载脚本,您可以使用代码

var script = document.createElement("script")
script.type = "text/javascript";

if (script.readyState){  //IE
    script.onreadystatechange = function(){
        if (script.readyState == "loaded" ||
                script.readyState == "complete"){
            script.onreadystatechange = null;
            callback();
        }
    };
} else {  //Others
    script.onload = function(){
        callback();
    };
}

script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);

如果有帮助,请告诉我。


-1
投票

我会这样做,以使一切都干净。加载jQuery文件而不延迟,并在HTML头中定义菜单切换事件。

<script src="/remotestaff_2015/js/jquery-1.10.2.min.js"></script>
<script>
    $(document).ready(function() {
        // option 1
        /* $('#menu-toggle').click(function() {
            // your code
        }); */
    });

    // option 2
    $(document).on('click', '#menu-toggle', function() {
        // your code
    });
</script>

现在,您可以在HTML正文中的任何位置呈现元素,甚至可以从AJAX回调中呈现元素。

© www.soinside.com 2019 - 2024. All rights reserved.