ASP.NET中RegisterClientScriptBlock配合jQuery报错的解决方法咨询
最优解决方案:替换RegisterClientScriptBlock为RegisterStartupScript
这是最符合ASP.NET Web Forms设计规范的解法,无需额外hack逻辑:
ScriptManager.RegisterStartupScript(this, GetType(), "closeFilt", "$(function(){$('#filters-container').slideUp(); });", true);
两者的核心区别在于脚本渲染位置:
RegisterClientScriptBlock会将脚本块插入到页面<form>标签开启后的靠前位置,早于你放在页脚的jQuery引用,自然会报jQuery is not defined错误RegisterStartupScript会将脚本块插入到页面<form>标签闭合前的位置,刚好在所有页脚静态资源引用之后,执行时jQuery已经加载完成
备选方案:保留RegisterClientScriptBlock的兼容写法
如果受业务逻辑限制必须使用RegisterClientScriptBlock,可以用原生API监听jQuery加载状态,比固定300ms定时器的兼容性和性能更好:
ScriptManager.RegisterClientScriptBlock(this, GetType(), "closeFilt", @" document.addEventListener('DOMContentLoaded', function(){ // 直接判断jQuery是否已挂载 if(window.jQuery) return $('#filters-container').slideUp(); // 短轮询判断jQuery加载状态,加载完成后立即终止 var loadTimer = setInterval(function(){ if(window.jQuery){ clearInterval(loadTimer); $('#filters-container').slideUp(); } }, 30); }); ", true);
不推荐方案:调整jQuery引用位置
你也可以直接把jQuery的引用从页脚移到<head>标签内,就能直接兼容原来的RegisterClientScriptBlock写法,但该方案会阻塞页面首屏渲染,仅适合极小体积的jQuery资源使用。
内容的提问来源于stack exchange,提问作者simplyBarbe
相关产品推荐
相关产品推荐

