更新面板刷新后如何运行一些 javascript?

Posted

技术标签:

【中文标题】更新面板刷新后如何运行一些 javascript?【英文标题】:How can I run some javascript after an update panel refreshes? 【发布时间】:2010-11-14 12:03:28 【问题描述】:

我有一个 pageLoad 函数,它在我无法更改的 .ascx 控件上设置一些 CSS。在页面加载时一切都很好,但是当更新面板更新控件时,我的 CSS 不再应用。页面更新后如何重新运行我的函数?

 $(function() 
        $("textarea").attr("cols", "30");
        $("input.tbMarker").css( "width": "100px" ).attr("cols","25");
    );

这显然只在初始页面加载时运行。更新后如何运行?

【问题讨论】:

在客户端绑定到 MSAjax pageLoad 事件:***.com/questions/9026496/… ***.com/a/339114/900284 【参考方案1】:

最简单的方法是在您的 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 事件将在每次更新面板时执行刷新。

来源:Running script after Update panel AJAX asp.net

【讨论】:

太棒了!很长一段时间以来,我一直在寻找一种在更新面板刷新时保持 javascript 执行的方法,感谢您的回答! 刚刚在一个项目中解决了这种情况 - 这对我来说是最简单和最可靠的。 add_pageLoadedRegisterStartupScript 方法更难通过回调跟踪和调试,但 pageLoad Just Works(tm) var firstload = 0;函数 pageLoad() if (firstload==0)firstload=1; else alert('回发!'); 【参考方案2】:

添加 add_pageLoaded 处理程序也可以工作。

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(PageLoadedHandler);

注意:处理程序将触发任何回调,但您可以使用sender._postBackSettings.panelID 来过滤何时调用您的函数。

更多示例:

http://blog.jeromeparadis.com/2007/03/01/1501/ http://zeemalik.wordpress.com/2007/11/27/how-to-call-client-side-javascript-function-after-an-updatepanel-asychronous-ajax-request-is-over/

【讨论】:

这太棒了!此外,如果没有明确的面板(例如,您可能正在使用一些在幕后使用 UpdatePanels 的 Telerik Control),您还可以使用sender._postBackSettings.asyncTarget 来验证当前回发是否是您正在寻找的那个。跨度> 【参考方案3】:

以您放置脚本管理器的相同形式添加代码。

代码背后:

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】:

在更新面板的回发期间,在服务器代码中,使用 ClientScriptManager 向页面添加一些新脚本,如下所示:

ClientScriptManager.RegisterStartupScript(
       typeof(page1), 
       "CssFix", 
       "javascriptFunctionName()", 
        true);

将您的 javascript 封装在与那里的第三个参数匹配的命名函数中,并且它应该在回发返回时执行。

【讨论】:

【参考方案5】:

您还可以在每次 UpdatePanel 完成时绑定到客户端代码 (JavaScript) 中的事件,如下所示:

        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function()myFunction(););

所以在这种情况下 myFunction();每次发生 UpdatePanel 回发时都会调用。如果您在页面加载时执行此代码,该函数将在正确的时间被调用。

【讨论】:

以上是关于更新面板刷新后如何运行一些 javascript?的主要内容,如果未能解决你的问题,请参考以下文章

更新面板刷新后 jQuery 不工作

[ajax自动刷新更新面板后,jquery不起作用

回发后asp.net jquery脚本未运行

更新面板中的链接按钮导致页面刷新

在 asp.net Ajax 调用后运行 javascript 以重新绑定 datepicker

如何避免页面刷新按钮事件