微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 将Ajax工具包脚本移动到页面底部

我正在努力改进我们的一个网站PageSpeed见解得分,在我们徘徊在90左右的那一刻,如果可能的话,我们想要进入90年代中期.

我们遇到的一个难点是,Ajax工具包脚本管理器正在页面顶部生成其脚本,谷歌将此标记为“应该修复”问题,并抱怨该脚本是渲染阻止,应该移动到页面底部或异步加载或通过defer属性加载.

我正在使用以下内容将我们的脚本合并到一个.js文件中以最小化请求:

<ajaxToolkit:ToolkitScriptManager ID="manScript" LoadScriptsBeforeUI="false" runat="server" EnableViewState="false" ScriptMode="Release">

    <CompositeScript ScriptMode="Release" Path="/CMSGlobalFiles/Js/combinedajax.min.js">
        <Scripts>
            <asp:ScriptReference Name="WebForms.js" Path="/CMSGlobalFiles/Js/aspnet/WebForms.js" Assembly="System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" />
            <asp:ScriptReference Name="MicrosoftAjax.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjax.js"  />
            <asp:ScriptReference Name="MicrosoftAjaxWebForms.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjaxWebForms.js" />
        </Scripts>
    </CompositeScript>

</ajaxToolkit:ToolkitScriptManager>

有没有办法在输出的CompositeScript标签上设置延迟或异步?或者将其移动到页面底部的任何其他方式?

我尝试过以下方法

protected override void Render(HtmlTextWriter writer)
{
    StringWriter output = new StringWriter();
    base.Render(new HtmlTextWriter(output));

    string outputAsstring = output.ToString();

    if(outputAsstring.Contains("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>"))
    {
        outputAsstring = outputAsstring.Replace("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>",string.Empty);
    }

    writer.Write(outputAsstring);
}

然后手动在页面底部包含对脚本的引用:

<script type="text/javascript">
    function downloadJSAtOnload() {
        createScript("/CMSGlobalFiles/Js/combinedajax.min.js?v=1");
        createScript("//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js");
        createScript("/cmsglobalfiles/js/vendor/modernizr.js");
        createScript("/cmsglobalfiles/js/main.min.js");
        createScript("/cmsglobalfiles/js/vendor/wow.min.js");
    }

    function createScript(path) {
        var element = document.createElement("script");
        element.src = path;
        document.body.appendChild(element);
    }

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

这将删除生成的复合脚本并在结束正文标记之前创建一个新的复合脚本,这会使我们的分数达到95,但我认为加载太晚,因为我们遇到了很多控制台错误

ReferenceError: Sys is not defined

WebForm_InitCallback is not defined

这表明脚本管理器坏了,有没有办法实现这一点?

解决方法

我使用ajax控件工具包版本15.1.4.0,你使用ScriptManager而不是ToolkitScriptManager,但你可以设置LoadScriptsBeforeUI =“False”,它在< / form>之前呈现.

原文地址:https://www.jb51.cc/csharp/99826.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐