如何在javascript中检测/跟踪/检查回发(例如在asp.net Page.isPostBack()中)? 有什么建议吗?
答案 0 :(得分:39)
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:我还没有测试过它,但之前我做过类似的事情并且有效。
答案 1 :(得分:18)
在某些情况下,您可能希望在没有任何服务器端代码的情况下检查回发。例如,在SharePoint中,您不能在SharePoint Designer页面中包含代码块,因此您无法使用任何需要&lt;%= something%&gt;的解决方案。这是一个不涉及服务器端代码的替代方案:
<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>
一个警告(或功能,取决于你如何看待它),这不仅会检测回发,还会检测页面链接到自身的任何实例。
答案 2 :(得分:9)
如果您想检查当前页面是否为回发,如果用户点击提交按钮,您可以检查是否存在ViewState:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
您可以使用类似document.getElementById("__VIEWSTATE")
或类似jQuery的内容。
但是,如果您想查看当前页面是否是为了响应回发而生成的,那么您需要先将该数据插入到服务器端的页面中。
例如:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
答案 3 :(得分:5)
由于JavaScript不应该使用服务器端代码编写,并且在页面中注入新元素似乎有些过分,在我看来,最简单的解决方案是向<head>
添加[datat-*]
属性元素:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";
然后可以访问:
<子> jQuery的:子>$('head').data('isPostback');
Vanilla 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]');
Vanilla JS:
document.head.hasAttribute('data-is-postback')
答案 4 :(得分:4)
见以下内容:
<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>
答案 5 :(得分:4)
我有一个适合我的解决方案。
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
答案 6 :(得分:0)
如果您使用的是AJAX请求,或者有一个javascript在页面加载时读取的隐藏字段,您只能跟踪回发。否则页面将重新生成,所有POST数据都将丢失;正如你所期待和希望的那样。
答案 7 :(得分:0)
以下是使用jQuery的解决方案:
$("a[href^='javascript:__doPostBack']").click(function () {
alert('ok');
});
答案 8 :(得分:0)
在服务器端的Page_Load上: 以下使用RegisterClientScriptBlock()的重载,它将使用所需的脚本标记
包围我们的字符串服务器端
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
然后在运行forLoad的脚本中,检查该变量是否存在。
if (isPostBack){
//do something here
}
答案 9 :(得分:0)
这应该适用于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;
}
答案 10 :(得分:0)
这是一种确定我刚刚在ASPX页面的主体中工作的IsPostBack的状态的简单JS方法;需要在项目的PageLoad期间引起回发。
<script type="text/javascript">
if ('False' === '<%= Page.IsPostBack.ToString()%>')
{
__doPostBack();
}
</script>