2

有没有办法从 javascript 确定页面是否包含脚本管理器、更新面板或者 __doPostBack 是从更新面板调用还是部分回发?

4

3 回答 3

3

当调用一个更新面板时,有两个函数从 javascript 端触发。在此函数中,您还可以获得触发此更新的面板的 ID。如果在更新面板之外有完整的帖子,那么您需要捕获表单的提交。

以下是更新面板要更新时触发的代码,以及显示触发的更新面板 ID 的函数。

<script>

    if(window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager)
    {
      var prm = Sys.WebForms.PageRequestManager.getInstance();

       prm.add_initializeRequest(InitializeRequest);
       prm.add_endRequest(EndRequest);
    }
    else
    {
      // no ScriptManager found
    }        

      function InitializeRequest(sender, args) 
      {     
         // get the array of update panels id
         var UpdPanelsIds = args.get_updatePanelsToUpdate();
         // get the Post ID
         args.get_postBackElement().id;
      }

      function EndRequest(sender, args) {
      }
</script>

'Dan Davies Brackett' 正确描述了如何知道 ScriptManager 是否存在。

于 2012-05-11T16:12:33.747 回答
1

如果我理解正确,这里有两个问题:

(1) 如何在 JavaScript 中判断页面上是否存在 ScriptManager?

如果服务器端页面包含一个 ScriptManager,那么客户端就会有一个PageRequestManager可用。您可以通过以下方式发现它是否存在:

 var haveScriptManager = window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager;

(2) 如何判断 __doPostBack 是否同步?

获得本地 PageRequestManager 的句柄后,您可以挂钩在每次回发之前触发的事件,并检查它是同步的还是异步的。同样,PageRequestManager 的文档将为您提供有关如何执行此操作的所有详细信息。

于 2012-05-11T16:08:50.937 回答
0

将 scriptManager clientID 发送到一些客户端 javascript,然后在页面上查找它 (document.getElementById(emittedClientID)

您可以将 __doPostBack 重命名为... __NewDoPostBack = __doPostBack,然后创建一个新函数,例如...

__doPostBack = function(whatever arguments __NewDoPostBack takes){
    alert("We're doing a post back");
    __NewDoPostBack(whatever arguments __NewDoPostBack takes)
}
于 2012-05-11T16:06:54.887 回答