DGi*_*bbs 7 c# asp.net ajax ajaxcontroltoolkit
我正在努力改善我们的一个网站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>
Run Code Online (Sandbox Code Playgroud)
有没有办法设置defer或获得输出async的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);
}
Run Code Online (Sandbox Code Playgroud)
然后手动在页面底部包含对脚本的引用:
<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>
Run Code Online (Sandbox Code Playgroud)
这将删除生成的复合脚本并在关闭正文标记之前创建一个新的复合脚本,这会带来我们的分数,95但我认为加载太晚,因为我们遇到了很多控制台错误:
ReferenceError:未定义Sys
WebForm_InitCallback未定义
这表明脚本管理器坏了,有没有办法实现这一点?
我使用的是 ajax 控制工具包版本15.1.4.0,您可以在其中使用ScriptManager而不是ToolkitScriptManager,但您可以在其中进行设置LoadScriptsBeforeUI="False",并且它会在之前呈现</form>。
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |