【发布时间】:2010-12-23 21:03:18
【问题描述】:
如何在 javascript 中检测/跟踪/检查回发(例如在 asp.net Page.isPostBack() 中)? 有什么建议吗?
【问题讨论】:
标签: asp.net javascript postback
如何在 javascript 中检测/跟踪/检查回发(例如在 asp.net Page.isPostBack() 中)? 有什么建议吗?
【问题讨论】:
标签: asp.net javascript postback
这是一种简单的 JS 方法来确定我刚刚在 ASPX 页面的正文中工作的 IsPostBack 的状态;需要在项目的 PageLoad 期间导致 PostBack。
<script type="text/javascript">
if ('False' === '<%= Page.IsPostBack.ToString()%>')
{
__doPostBack();
}
</script>
【讨论】:
这应该适用于 ASP.Net 页面,而不依赖于后端提供的变量/控件:
function isPostBack(frmID) {
var eventtarget = "";
var eventargument = "";
if (!!frmID) {
if (document.forms.length == 0) return false;
sForm = document.forms[0];
}
else {
sForm = document.getElementById(frmID);
if (!sForm) return false;
}
if (sForm.__EVENTTARGET) eventtarget = sForm.__EVENTTARGET.value;
else return false;
if (sForm.__EVENTARGUMENT) eventargument = sForm.__EVENTARGUMENT.value;
else return false;
if (eventtarget != "" || eventargument != "") return true;
else return false;
}
【讨论】:
在服务器端的 Page_Load 上: 下面使用 RegisterClientScriptBlock() 的重载,它将用所需的脚本标签包围我们的字符串
服务器端
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
然后在为 onLoad 运行的脚本中,检查该变量是否存在。
if (isPostBack){
//do something here
}
【讨论】:
我有一个适合我的解决方案。
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
【讨论】:
ASPX:
<input type="hidden" id="_ispostback" value="<%=Page.IsPostBack.ToString()%>" />
客户端脚本:
function isPostBack() { //function to check if page is a postback-ed one
return document.getElementById('_ispostback').value == 'True';
}
PS:我还没有测试过,但我之前做过类似的事情,它可以工作。
【讨论】:
<input> 元素?您可以让 isPostBack() 直接返回 Page.IsPostBack 的值:return <%= Page.IsPostBack %>;
这里是使用 jQuery 的解决方案:
$("a[href^='javascript:__doPostBack']").click(function () {
alert('ok');
});
【讨论】:
由于 JavaScript 不应该使用服务器端代码编写,并且在页面中注入新元素似乎有点过头了,在我看来,最简单的解决方案是将 [datat-*] 属性添加到 <head> 元素:
在Page_Load中:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";
然后可以这样访问:
jQuery:$('head').data('isPostback');
原版JS:document.head.getAttribute('data-is-postback') === 'true';
当然,如果您将[data-is-postback] 属性视为布尔属性,您也可以使用:
if (IsPostBack)
{
Page.Header.Attributes.Add("data-is-postback", "");
}
else
{
Page.Header.Attributes.Remove("data-is-postback");
}
jQuery:$('head').is('[data-is-postback]');
原版JS:document.head.hasAttribute('data-is-postback')
【讨论】:
在某些情况下,您可能希望在没有任何服务器端代码的情况下检查回发。例如,在 SharePoint 中,您不能在 SharePoint Designer 页面中拥有代码块,因此您不能使用任何需要 的解决方案。这是一个不涉及服务器端代码的替代方案:
<script type="text/javascript">
function isPostBack()
{
return document.referrer.indexOf(document.location.href) > -1;
}
if (isPostBack()){
document.write('<span style="color:red;">Your search returned no results.</span><br/>');
}
</script>
一个警告(或功能,取决于您如何看待它),这不仅会检测回发,还会检测页面链接到自身的任何实例。
【讨论】:
如果你想检查当前页面是否会在用户点击提交按钮后回发,你可以检查ViewState的存在:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
您可以使用 document.getElementById("__VIEWSTATE") 或 jQuery 等价物。
但是,如果您想查看当前页面是否是为响应回发而生成的,则需要先将该数据插入到服务器端的页面中。
例如:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
【讨论】:
见下文:
<script type="text/javascript">
function invokeMeMaster() {
var chkPostBack = '<%= Page.IsPostBack ? "true" : "false" %>';
if (chkPostBack == 'false') {
alert('Only the first time');
}
}
window.onload = function() { invokeMeMaster(); };
</script>
【讨论】:
如果您使用 AJAX 请求或有某种类型的隐藏字段 javascript 在页面加载时读取,您只能跟踪回发。否则页面会重新生成,所有 POST 数据都会丢失;正如您所期望的那样。
【讨论】: