如何在javascript中检测/跟踪回发?

时间:2009-12-07 03:11:56

标签: asp.net javascript postback

如何在javascript中检测/跟踪/检查回发(例如在asp.net Page.isPostBack()中)? 有什么建议吗?

11 个答案:

答案 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_Load:
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]属性视为布尔属性,您也可以使用:

在Page_Load:
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>