有没有办法从 javascript 确定页面是否包含脚本管理器、更新面板或者 __doPostBack 是从更新面板调用还是部分回发?
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 是否存在。
如果我理解正确,这里有两个问题:
(1) 如何在 JavaScript 中判断页面上是否存在 ScriptManager?
如果服务器端页面包含一个 ScriptManager,那么客户端就会有一个PageRequestManager可用。您可以通过以下方式发现它是否存在:
var haveScriptManager = window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager;
(2) 如何判断 __doPostBack 是否同步?
获得本地 PageRequestManager 的句柄后,您可以挂钩在每次回发之前触发的事件,并检查它是同步的还是异步的。同样,PageRequestManager 的文档将为您提供有关如何执行此操作的所有详细信息。
将 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)
}