【问题标题】:How can I check for IsPostBack in JavaScript? [duplicate]如何在 JavaScript 中检查 IsPostBack? [复制]
【发布时间】:2010-09-08 18:02:55
【问题描述】:

我需要运行 JavaScript 函数 onLoad(),但只有在页面第一次加载时才执行(即不是回发的结果)。

基本上,我需要在 JavaScript 中检查 IsPostBack。

谢谢。

【问题讨论】:

  • 我编辑了这个问题,以反映 roman 原始问题的真实意图以及他选择接受的答案,因为对于这个问题所针对的平台存在一些混淆。

标签: asp.net javascript


【解决方案1】:

服务器端,写:

if(IsPostBack)
{
   // NOTE: the following uses an overload of RegisterClientScriptBlock() 
   // that will surround our string with the needed script tags 
   ClientScript.RegisterClientScriptBlock(GetType(), "IsPostBack", "var isPostBack = true;", true);
}

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

if(isPostBack) {
   // do your thing
}

你真的不需要设置变量,就像乔纳森的解决方案一样。客户端 if 语句可以正常工作,因为 "isPostBack" 变量将是未定义的,在该 if 语句中评估为 false。

【讨论】:

  • 大声笑 - 重新散列?当你回答时,我也是。我不知道你已经回答了(我们只相隔一两分钟)。这并不是一个解决方案的独特之处,它几乎是 的方法。顺便说一句,我对你的评论是我回答后的编辑 - 你可以看到历史
  • 不,我不知道。根据 MSDN,也许您需要阅读有关我使用的重载的信息。 :)
  • 杰森,在你的答案中加上“过载”的解释
  • 这将使下一个寻找答案的人一目了然,而无需通读 cmets。谢谢
  • 顺便说一下,要从代码隐藏使用 Page.ClientScript 访问 ClientScript 属性。
【解决方案2】:

还有一种更简单的方法,无需在后面的代码中编写任何内容:只需将此行添加到您的 javascript:

if(<%=(Not Page.IsPostBack).ToString().ToLower()%>){//Your JavaScript goodies here}

if(<%=(Page.IsPostBack).ToString().ToLower()%>){//Your JavaScript goodies here}

【讨论】:

  • 不会在外部 .js 文件中工作,而且它也很脏:从你的 Javascript 中依赖 ASP 是很糟糕的。使其不便携。
  • 我不同意这段代码很烂。如果您的 JavaScript 无论如何都依赖于 ASP.NET(在我的情况下,它调用 PageMethods.* 并使用各种嵌入式 .ClientID 调用来引用 ASP.NET 控件),那很好。此外,其他示例如何更便携?您指的是一个变量 isPostBack,如果在代码隐藏中没有随附的 ASP.NET 代码,它将毫无意义。
【解决方案3】:

您好,请尝试以下...

function pageLoad (sender, args) {

alert (args._isPartialLoad);

}

结果是布尔值

【讨论】:

  • 这是正确答案。不是其他人。它使用内置功能,在外部 .js 文件中工作,不需要任何代码隐藏实现。请参阅此帖子:stackoverflow.com/questions/602441/… 了解更多信息
  • 谢谢您,先生! :) 那应该是正确的答案。适用于纯 ASP 和 Telerik(RadScriptManager 而不是 ScriptManager)
【解决方案4】:

该解决方案对我不起作用,我不得不对其进行调整:

protected void Page_Load(object sender, EventArgs e)
{
    string script;
    if (IsPostBack)
    {
        script = "var isPostBack = true;";
    }
    else
    {
        script = "var isPostBack = false;";
    }
    Page.ClientScript.RegisterStartupScript(GetType(), "IsPostBack", script, true);
}

希望这会有所帮助。

【讨论】:

  • 为什么它不起作用?与其想出一个不同的解决方案,也许你应该深入挖掘一下,找出它为什么不起作用,这样你至少可以在此处发布你的适应信息。
  • 看,那是很久以前的事了,我不记得为什么它不起作用。我应该发布原因,但我的时间非常有限,所以我只是发布了我的修复。希望这将使 1 或 2 人受益,但可能会因敢于质疑您 2 年的解决方案而招致愤怒。
  • 它不起作用,因为如果你对一个不存在的变量执行“if”,它会退出你的脚本(无论如何在 Firefox 7 中)。但是如果 postback 为 false,则不需要声明变量,您可以在 JavaScript 中执行此操作: if (typeof(isPostBack) != "undefined" && isPostBack)
【解决方案5】:

您可以在页面上放置一个隐藏的输入,并在页面加载后给它一个值。然后你可以检查那个字段,如果在post数据中就是postback,否则不是。

有两种使用服务器端代码(特定于 ASP.NET)作为响应发布的解决方案。我认为值得指出的是,该解决方案与技术无关,因为它仅使用客户端功能,所有主流浏览器都提供这些功能。

【讨论】:

  • 确实,您的解决方案是不可知的,但根据标记的方式,问题是特定于 ASP.NET 的。此外,由于我的回答被接受为答案,Roman 显然使用的是 ASP.NET
  • 查看我的评论,了解我为何编辑此问题以提供更清晰的信息。我对原始问题发表了评论。
【解决方案6】:

试试这个,在这个 JS 中,我们可以检查它是否被回发,并相应地在相应的循环中执行操作。

    window.onload = isPostBack;

    function isPostBack() {

        if (!document.getElementById('clientSideIsPostBack')) {
            return false;
        }

        if (document.getElementById('clientSideIsPostBack').value == 'Y') {

            ***// DO ALL POST BACK RELATED WORK HERE***

            return true;
        }
        else {

            ***// DO ALL INITIAL LOAD RELATED WORK HERE***

            return false;
        }
    }

【讨论】:

    【解决方案7】:

    您可以创建一个值为 0 的隐藏文本框。将 onLoad() 代码放在 if 块中,检查以确保隐藏文本框值为 0。如果它是执行代码并将文本框值设置为1.

    【讨论】:

      【解决方案8】:

      这里有很多选择。

      对于纯 JS 解决方案,让您的页面提交给自身,但带有额外的 URL 参数 (mypage.html?postback=true) - 然后您可以使用 window.location.href 获取页面 url,并使用拆分或正则表达式来查找您的变量。

      假设您发送回某种脚本语言来处理页面(php/perl/asp/cf 等),更简单的方法是让它们在页面中回显一行 javascript 设置变量:

      <html>
      
      <?php
      if ($_POST['myVar']) {
          //postback
          echo '<script>var postingBack = true;</script>';
          //Do other processing
      } else {
          echo '<script>var postingBack = false;</script>'
       } ?>
      <script>
      function myLoader() {
           if (postingBack == false) {
                //Do stuff
           }
       }
      
      <body onLoad="myLoader():"> ...
      

      【讨论】:

      • 这是一个特定于 ASP.NET 的问题,但我认为你不应该因为发布 PHP 解决方案而受到反对(我不知道是谁做的)——即使你的想法是正确的语言不是。 :)
      • 诚然,最初的问题被标记为 asp.net,但它并没有这样表述。这个问题和除了公认的答案之外的所有问题都与语言无关。就改写的问题而言,公认的答案是正确的,但与大多数 .net 内容一样,可以保护开发人员免受底层机制的影响。
      • “保护开发者免受底层机制的影响?”为何如此?也许您的意思是使用“绝缘”一词而不是“保护”。这不是我们需要保护的东西。 ASP.NET WebForms,而不是 MVC,是垃圾,我承认。它充其量只是一个泄漏的抽象。也就是说,我完全理解 HTTP 协议、HTML、浏览器等的底层机制。这不是重点——当你对正在使用的框架别无选择时,你可以使用 hack 之类的东西,这是许多在该行业工作的软件开发人员的案例。我不知道你在说什么。
      【解决方案9】:

      这是一种方法(将其放在 Page_Load 中):

      if (this.IsPostBack)
      {
          Page.ClientScript.RegisterStartupScript(this.GetType(),"PostbackKey","<script type='text/javascript'>var isPostBack = true;</script>");
      }
      

      然后在 JS 中检查该变量。

      【讨论】:

      • 你所做的只是接受我的回答,并删除 else 子句。
      • 非常接近,但 Jason 有更多细节 - 为你投票
      • 这不像是我想赢得一场比赛——我有什么动机来复制你的答案?不要自吹自擂。
      • 顺便说一句,我没有复制你的另一个证据是你最初忘记了脚本标签。如果您查看我的答案,我正在使用 RegisterStartupScript 的重载,它将自动包含该内容。 :)
      • 两年多过去了,你还在苦恼吗? ;)
      【解决方案10】:

      在其中创建一个全局变量并应用该值

      <script>
             var isPostBack = <%=Convert.ToString(Page.IsPostBack).ToLower()%>;
      </script>
      

      然后你可以从其他地方引用它

      【讨论】:

      • 为什么会被否决?这似乎是最简单的答案。如果我用这个有什么问题吗?
      • 我认为反对者对依赖于全局范围的解决方案皱眉,这是最容易意外污染/破坏的解决方案。因此,不能保证您的代码不会突然开始行为不端。否则,这个其实是我也喜欢的简单解决方案。
      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2011-02-28
      相关资源
      最近更新 更多