我有一个pageLoad函数,它在.ascx控件上设置一些我无法更改的css。在页面加载一切正常,但当更新面板更新控件时,我的css不再应用。如何在页面更新后重新运行我的功能?
$(function() {
$("textarea").attr("cols", "30");
$("input.tbMarker").css({ "width": "100px" }).attr("cols","25");
});
这显然只在初始页面加载时运行。如何在更新后运行它?
答案 0 :(得分:83)
最简单的方法是在您的javascript代码中使用MSAjax pageLoad事件:
<script>
///<summary>
/// This will fire on initial page load,
/// and all subsequent partial page updates made
/// by any update panel on the page
///</summary>
function pageLoad(){ alert('page loaded!') }
</script>
我已多次使用它,它的功效就像魅力一样。最重要的是不要将它与document.ready函数混淆(在页面文档对象模型(DOM)准备好执行JavaScript代码之后只执行一次),而每次更新面板都会执行pageLoad Event刷新。
答案 1 :(得分:42)
添加add_pageLoaded处理程序也可以。
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(PageLoadedHandler);
注意:处理程序将触发任何回调,但您可以使用sender._postBackSettings.panelID
来过滤希望调用函数的时间。
更多样本:
答案 2 :(得分:14)
在更新面板的回发期间,在服务器代码中,使用ClientScriptManager向页面添加一些新脚本,如下所示:
ClientScriptManager.RegisterStartupScript(
typeof(page1),
"CssFix",
"javascriptFunctionName()",
true);
将javascript封装在与第三个参数匹配的命名函数中,并且应该在回发返回时执行。
答案 3 :(得分:13)
使用放置脚本管理器的相同表单添加代码。
代码背后:
protected void Page_Load(object sender, EventArgs e)
{
if (ScriptManager1.IsInAsyncPostBack)
{
StringBuilder sb = new StringBuilder();
sb.Append("<script language='javascript' type='text/javascript'>");
sb.Append("Sys.Application.add_load(func);");
sb.Append("function func() {");
sb.Append("Sys.Application.remove_load(func);");
sb.Append("alert('I am Batman!');");
sb.Append("}");
sb.Append("</script>");
ScriptManager.RegisterStartupScript(this, GetType(), "script", sb.ToString(), false);
}
}
答案 4 :(得分:12)
每次UpdatePanel完成时,您也可以绑定到客户端代码(JavaScript)中的事件:
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){myFunction();});
所以在这种情况下myFunction();每次发生UpdatePanel回发时都会调用。如果在加载页面时执行此代码,则将在正确的时间调用该函数。