Jquery - 如何在表单提交上停止此脚本

时间:2014-06-02 17:45:05

标签: jquery forms submit

我创建了此脚本,以提醒用户他们离开页面而未填写表单。当用户单击提交按钮时,将忽略该脚本。不幸的是,在我正在处理的网站上,表单提交时未加载新页面,只有感谢信息出现在同一页面上(因此在该点点击的任何链接仍会显示警报消息)。所以我希望做的是 - 在表单提交上取消此脚本。任何人的想法? (语法请!) - 我只有SCRIPT级访问权限,我无法直接编辑提交按钮。

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
      var action_is_post = false;
      $("form").submit(function () {
        action_is_post = true;
      });

      window.onbeforeunload = confirmExit;
      function confirmExit()
      {
        if (!action_is_post)
          return 'Are you sure you want to leave this page?';
      }
    });
    </script>

2 个答案:

答案 0 :(得分:1)

解决这个问题的方法之一是改变你的策略。

您假设网页访问者始终填写表单。但是,如果不是这样,至少有一个实例:在提交表单并重新加载页面之后,这不再是真的(现在是对页面的新访问,用户将无法完成此表单时间,因为它已经完成了。)

因此,更改策略以便默认情况下将消息设置为OFF,并且只有在用户执行以下操作时才启用此消息:(a)单击任何表单字段(.focus()事件),(b)离开表单字段(.blur()事件),(c)更改元素(.change()事件)的内容等。

示例:

<script>
    var exit_message = false; //outside of document.ready

    $(document).ready(function(){
        window.onbeforeunload = confirmExit;

        $('.formField').focus(function(){
            exit_message = true;
        });

        $("form").submit(function () {
            exit_message = false;
        });

    }); //END document.ready

    function confirmExit() {
        if (exit_message)
            return 'Are you sure you want to leave this page?';
        }
    }
</script>

对于上面的示例,请注意,至少有一个表单字段(或所有,如果您愿意)应该具有类 formField 。例如:

<input id="first_name" class="formField" type="text" />

进一步的想法(回应评论):

如果您需要记住最后一页交互的状态(例如,用户已经提交了表单,并且您希望记住每次以后的页面交互),您可以使用PHP $_SESSION超级 - 全局变量。

$ _ SESSION是一个数组变量,您可以为其创建新的关联元素。它是特殊,因为(a)它内置于PHP中,(b)它对于页面的每个访问者都是唯一的。

要使用此超全局,您必须通过将session_start();放在脚本的最顶部来启用它。通常,session_start()必须出现在其他任何内容之前,当然在将任何数据/标头输出到页面之前。像这样:

<?php
    session_start();
    //carry on as usual

此指令必须位于每个 PHP页面的顶部,该页面将使用$ _SESSION变量。

现在,您应该使用$ _SESSION变量,而不是使用全局变量(例如 $ exit_message = 1 )。我们称之为“form_submitted”:

<强> PHP:

<?php
    session_start();

    //Note: you may have to use == false /or/ === false... Please test/research
    if ( !isset($_SESSION['form_submitted']) ){
        $_SESSION['form_submitted'] = 0;
    }


    if ( $_SESSION['form_submitted'] == 0 ) {
        echo '<input type="hidden" id="stored_state" value="0" />';
    }

jQuery / javascript

    function confirmExit() {
        if ( $('#stored_state').val() == 0 )
            return 'Are you sure you want to leave this page?';
        }
    }

解释上述代码:

  • 如果用户之前从未访问过该页面,则会话var将不存在。在这种情况下,创建它并将值设置为零。否则,该值将是它最后设置的值。

  • 无法从jQuery访问PHP变量(除非您使用ajax)。因此,在完成输出页面之前,添加一个隐藏的输入字段,用于存储PHP变量的值。 jQuery / javascript可以访问隐藏字段的值,瞧!您可以在脚本中使用PHP变量的值。

注意:在表单处理中,(我相信你提到的PHP页面的顶部),你应该切换var值。也就是说,表格提交后:

<?php
    //At the part where you deal with the form submission data:
    $_SESSION['form_submitted'] = 1;

在此处详细了解$_SESSION变量:

TiZag on Sessions

DevShed Sessions

Going Deep Inside Sessions

Session variables explained

答案 1 :(得分:0)

没有文件访问权限就无法完成。使用focus()绑定到输入字段是最佳解决方案。