【问题标题】:why "return false;" or "event.preDefualt();" doesn't work after $.post();?为什么“返回错误”;或“event.preDefualt();”在 $.post(); 之后不起作用?
【发布时间】:2012-10-23 17:05:06
【问题描述】:

为什么“返回错误;”或“event.preDefualt();”在 $.post(); 之后不起作用 首先,我只是在后面写了一个 return false $(#id).submit(function(e){ return false;}// it works properly.但是 当我通过$.post('check-email.php',{parameter},function{data}) 调用某些东西时,我尝试在 $.post 调用之后写入 return false。它不起作用并直接转到下一页。 这是我的代码:-

$(document).ready(function () { //newly added 
    $('#mysignupform').submit(function (event) {
        return false;
        or event.preDfault(); // only work here
        var emailVal = $('#inputEmail').val(); // assuming this is a input text field
        //alert(emailVal);
        $.post('check-email.php', {
            'email': emailVal
        }, function (data) {
            alert(data);
            if (data == 'false') {
                $("#mysignupform").submit(function (event) {
                    return false;
                    or event.preventDefault(); //both doesnt work here..why??
                    ;
                });
            } else {
                $("#mysingupform").submit(function () {
                    return false;
                }); //retrun false doesnt work here..why??
            }
        });
    });
});

我不想让他们提交,但它仍然在发生。请帮我..! 提前谢谢..

【问题讨论】:

  • 不要使用不相关的标签。 PHP 已移除。
  • 不知道是不是3次错别字,但它是event.preventDefault()
  • 你在数据中得到了什么
  • 您已经在提交事件中,并且正在创建另外两个事件我不明白...返回语句不会返回外部函数。

标签: javascript jquery


【解决方案1】:

这应该可行:

$(document).ready(function () { //newly added 
    $('#mysignupform').submit(function (event) {
        // your $.post call
        $.post('check-email.php', {email: emailVal}, function (data) {
            // ...
            // having a return false means returning false to the success callback
            // of your .post call. it is not the same as returning false to the 
            // submit() callback
        });

        // return false to submit()
        return false;
    });
});

【讨论】:

    【解决方案2】:

    Ajax 异步工作。简单的解决方案是在提交按钮上绑定一个点击事件处理程序。

    $('#your_submit_button').click(function (event) {
        event.preventDefault();
        var emailVal = $('#inputEmail').val(); // assuming this is a input text field
        $.post('check-email.php', {
            'email': emailVal
        }, function (data) {
            if (data !== 'false') {
                // submit the form here
                $("#mysingupform").submit();
            }
        });
    });
    

    【讨论】:

      【解决方案3】:

      因为$.post异步的。立即在调用$.post 之后的语句处继续执行。由于后面没有语句,submit 事件处理函数将简单地返回undefined,浏览器将愉快地继续提交,就好像什么都没发生一样。

      异步方法的回调只会在一段时间后执行。在您的情况下,这将是服务器返回响应的时候。由于外部函数已经返回,因此该回调函数无处返回

      您需要始终阻止表单提交按钮上click 事件处理程序中的默认操作,然后在$.post 回调中以编程方式重新提交表单:

      $('#mysignupform :submit').click(function (event) {
          var form = this.closest("form"); // Get a reference to the containing form
          event.preventDefault(); // Prevent the default action (form submission)
          $.post('check-email.php', { /* data */ }, function (data) {
              // If the data is good...
              form.submit(); // Submit the containing form
          });
      });
      

      如果您绑定到表单submit 事件,显然您不能真正做到这一点,因为重新提交表单将再次触发事件处理程序,您将陷入无限循环。

      【讨论】:

        【解决方案4】:

        $.post(...) 是异步的。请改用$.ajax(async: false, ...)

        【讨论】:

          【解决方案5】:

          这是因为 post 完成后执行的函数是异步执行的,即您不再在事件处理程序中。

          This answer 有一个你可以使用的技术——基本上是再次点击提交按钮,在设置一个布尔标志以防止你的帖子逻辑被执行两次之后。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-24
            • 2019-08-06
            • 2017-09-11
            • 1970-01-01
            • 1970-01-01
            • 2021-09-24
            • 1970-01-01
            相关资源
            最近更新 更多