【问题标题】:Why does my function run multiple times after UpdatePanel is loaded为什么我的函数在 UpdatePanel 加载后运行多次
【发布时间】:2012-08-01 21:59:21
【问题描述】:

所以我想在更新面板更新后运行一些 javaScript 函数,所以我有:

function pageLoad() { 

    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_pageLoaded(panelLoaded);
}


function panelLoaded(sender, args) {
        alert("foobar");
}

使用上面的代码,如果我更新一次面板,“foobar”会被提醒一次;如果我第二次更新面板,“foobar”会弹出两次;第三次触发面板更新,“foobar”弹出3次……第四次弹出4次,依此类推……

这是什么原因造成的??

谢谢~~~

【问题讨论】:

  • 看起来你在 lprm.add_pageLoaded(panelLoaded)l 中一遍又一遍地添加它。它可能永远不会从 prm 中删除,并且每次您加载页面时,它都会添加一个新实例。尝试在那里设置断点并查看 prm 中有多少 panelLoaded 调用。 prm 是否有 remove_pageLoaded();选项?
  • 谢谢,你没看错,是Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(panelLoaded);
  • 很高兴为您提供帮助!祝你项目的其余部分好运。

标签: asp.net ajax vb.net updatepanel pagerequestmanager


【解决方案1】:

这是因为 pageLoad 也在 updatepanel 回发期间执行。有一个简单的解决方案:

function pageLoad(sender, eventArgs) {
    // If this is being executed by ajax
    if (eventArgs) {
        // And this is only a partial load
        if (eventArgs.get_isPartialLoad()) {
            // Don't perform any further processing
            return;
        }
    }
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_pageLoaded(panelLoaded);
}

【讨论】:

  • 这对我也有用。我正在添加一个 textchanged 事件,它的行为就像前两个请求被取消,第三个请求被实际处理。因此,我的进度指示器/加载器无法正常工作
【解决方案2】:

谢谢大家,问题似乎是 Sam 提到的 prm 实例太多。我添加了 Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(panelLoaded);在 alert() 之后,一切都很好。

【讨论】:

    【解决方案3】:

    这就是正在发生的事情。 pageLoad 基本上是Application.InitPageRequestManager.EndRequest 的组合。这意味着它适用于应用程序初始化(大约 DOM 就绪)和每个 Partial PostBack

    所以 pageLoad 适用于所有 PostBacks;完整的和部分的。

    现在,您在每次部分回发时再次在 ScriptManager 的实例上绑定 pageLoaded 事件,一次又一次地导致此行为。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多