【问题标题】:How to detect/track postback in javascript?如何在 javascript 中检测/跟踪回发?
【发布时间】:2010-12-23 21:03:18
【问题描述】:

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

【问题讨论】:

    标签: asp.net javascript postback


    【解决方案1】:

    这是一种简单的 JS 方法来确定我刚刚在 ASPX 页面的正文中工作的 IsPostBack 的状态;需要在项目的 PageLoad 期间导致 PostBack。

        <script type="text/javascript">
            if ('False' === '<%= Page.IsPostBack.ToString()%>') 
            {
                __doPostBack();
            }
        </script>
    

    【讨论】:

      【解决方案2】:

      这应该适用于 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;
      }
      

      【讨论】:

        【解决方案3】:

        在服务器端的 Page_Load 上: 下面使用 RegisterClientScriptBlock() 的重载,它将用所需的脚本标签包围我们的字符串

        服务器端

        if (Page.IsPostBack){
           ClientScript.RegisterClientScriptBlock(GetType(),
                    "IsPostBack", "var isPostBack = true;", true);
        }
        

        然后在为 onLoad 运行的脚本中,检查该变量是否存在。

        if (isPostBack){
           //do something here
        }
        

        【讨论】:

          【解决方案4】:

          我有一个适合我的解决方案。

          // Postback catch
          var prm = Sys.WebForms.PageRequestManager.getInstance();
          prm.add_endRequest(function (s, e) {
              alert("post back");
          });
          

          【讨论】:

            【解决方案5】:

            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:我还没有测试过,但我之前做过类似的事情,它可以工作。

            【讨论】:

            • 作为一个问题或偏好,我将 runat="server" 添加到隐藏输入并在代码隐藏文件中更改它的值,但这工作得很好。我会推荐 jQuery 来做 javascript,因为那会变成: function isPostBack() {return $("#_ispostback").val() == 'true';}
            • @Shhnap:是的,我同意。对我来说只是一个懒惰的出路:P
            • 为什么要插入&lt;input&gt; 元素?您可以让 isPostBack() 直接返回 Page.IsPostBack 的值:return &lt;%= Page.IsPostBack %&gt;;
            • @RickNZ:这是个好主意。发布为答案,我会投票赞成:)
            • 隐藏字段更好是有原因的,仅使用 javascript 函数只会在实际回发时加载此值,但对于异步回发它不会,在更新中使用输入字段设置为 updatemode=always 的面板即使在异步回发时也能正常工作。
            【解决方案6】:

            这里是使用 jQuery 的解决方案:

            $("a[href^='javascript:__doPostBack']").click(function () {
                alert('ok');
            });
            

            【讨论】:

              【解决方案7】:

              由于 JavaScript 不应该使用服务器端代码编写,并且在页面中注入新元素似乎有点过头了,在我看来,最简单的解决方案是将 [datat-*] 属性添加到 &lt;head&gt; 元素: 在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] 属性视为布尔属性,您也可以使用:

              在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]');
              
              原版JS:
              document.head.hasAttribute('data-is-postback')
              

              【讨论】:

              • 如果您访问服务器端代码,这很好,但如果您不这样做,它就会失败。有些软件甚至不允许代码块,因此需要纯 JavaScript 解决方案。
              【解决方案8】:

              在某些情况下,您可能希望在没有任何服务器端代码的情况下检查回发。例如,在 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>
              

              一个警告(或功能,取决于您如何看待它),这不仅会检测回发,还会检测页面链接到自身的任何实例。

              【讨论】:

              • var offset = document.location.href.indexOf(".aspx"); return document.referrer.substring(0, offset + 5) == document.location.href.substring(0, offset + 5)
              • 这对我很有用。谢谢 :) 我有一个需要检查回发的 javacript 重定向。
              • 真是一团糟。不要将引荐来源网址用于逻辑。
              【解决方案9】:

              如果你想检查当前页面是否会在用户点击提交按钮后回发,你可以检查ViewState的存在:

              <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
              

              您可以使用 document.getElementById("__VIEWSTATE") 或 jQuery 等价物。

              但是,如果您想查看当前页面是否是为响应回发而生成的,则需要先将该数据插入到服务器端的页面中。

              例如:

              function isPostBack() {
                return <%= Page.IsPostBack %>;
              }
              

              【讨论】:

              • 如果您无权访问服务器端代码并​​且不允许使用代码块,则会出现这种情况。
              • 奇怪的是,这对我不起作用,但确实如此: function IsPostBack() { var ret = '' == 'True';返回 ret; }
              【解决方案10】:

              见下文:

              <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>
              

              【讨论】:

              • 我喜欢你选择的名字。
              【解决方案11】:

              如果您使用 AJAX 请求或有某种类型的隐藏字段 javascript 在页面加载时读取,您只能跟踪回发。否则页面会重新生成,所有 POST 数据都会丢失;正如您所期望的那样。

              【讨论】:

                猜你喜欢
                • 2015-12-15
                • 1970-01-01
                • 2019-09-12
                • 1970-01-01
                • 1970-01-01
                • 2013-05-16
                • 1970-01-01
                • 1970-01-01
                • 2019-12-20
                相关资源
                最近更新 更多