代码之家  ›  专栏  ›  技术社区  ›  jay

停止,然后在ajax检查后重新启动submit()

  •  1
  • jay  · 技术社区  · 16 年前

    我问了一个问题[ here ]最近,它只是没有给我一个答案。下面是我想做的,你可以看到我第一次尝试上面的链接:

    1. 检查数据库中是否存在类似的条目
      1. 如果是的话
      2. 如果没有 ,对窗体启用默认操作并让它提交

    var forceSubmitForm = false;
    $('#purchaser_contact').submit(function(){
    
      if(forceSubmitForm) return true;
    
      if( $("#id").val()=="" ){
    
        if( $("#fname").val()=='' || $("#city").val()=='' ){ alert('First Name and City are required fields. Please fill these in before continuing.'); return false; }
    
          $.ajax({
            type: "POST",
            url: 'ajax/contactSearch.php',
            data: ({ fname: $("#fname").val(), lname: $("#lname").val(), city: $("#city").val(), state: $("#state").val() }),
            success: function(d) {
                var obj = JSON.parse( d );
                if(obj.result != 0){
                $("#contactSearch").remove();
                $("#button-wrapper").before('<div id="contactSearch">'+obj.result+'</div>');
                $("#contactSearch").slideToggle('slow');                                
              } else {
                forceSubmitForm = true;
                $('#purchaser_contact').submit(); // Form will submit
              }
            }
          });   
    
          return false;
    
      } //END IF empty id
    
    });     
    

    直到第二次按下提交按钮(即, $('#purchaser_contact').submit(); 未提交表单)。

    编辑 这从来没有为我工作,但西门的答案是最接近的,他声称它在所有主要的浏览器工作,所以如果它有助于某人,伟大的。

    6 回复  |  直到 9 年前
        1
  •  1
  •   Simeon    16 年前

    这就是你正在寻找的解决方案。

    var forceSubmitForm = false;
    $('#myForm').submit(function(){
        if(forceSubmitForm) return true;
        $.ajax({
            // ...
            success: function(data){
                if(data.entry != 'OK'){ // or whatever check
                    forceSubmitForm = true;
                    $('#myForm').submit(); // Form will submit
                }else{
                    // Form will not be submitted
                }
            }
        });
        return false;
    });
    

    编辑 为了向自己证明这种方法是有效的,我创建了一个带有表单和提交按钮的示例页面。这在所有主要浏览器中都可以正常工作:

    $(function(){ // On DOM ready
        var forceSubmitForm = false;
    
        $('#purchaser_contact').live('submit', function() {
            if (forceSubmitForm){
                alert('submitting');
                return true;
            }
    
            // A callback function works in the same manner as a timeout
    
            setTimeout(function(){
                forceSubmitForm = true;
                $('#purchaser_contact').submit();
            }, 1500); // Submit after 1,5 seconds
    
            return false; // Do not submit immediately
        });
    });
    
        2
  •  0
  •   Crozin    16 年前

    $(function() {
        $("#myForm").submit(function() {
            $.post(/* make AJAX request */ function() {
                if (/* similar entry does not exisits */) {
                     $("#myForm").data("allow-submit", true).submit();
                } else {
                     alert('NOT ALLOWED!');
                }
            });
    
            return $(this).data("allow-submit") || false; // prevent form submit if not allowed
        });
    });
    
        3
  •  0
  •   dnagirl    16 年前

    本质上,您希望在提交表单时运行一个函数,然后在函数为负时缩短表单操作。这样做应该:

    $("form#myForm").submit(function(){
        if(someCustomFunction()){//do the check
                event.preventDefault; //short circuit
                someOtherCustomFunction();//display your alternative
    
        }
    });
    
        4
  •  0
  •   digitaldreamer    16 年前

    $('form').submit(function(event) {
       event.preventDefault();
    
       //do stuff, you can put your ajax call here
       ...
    
       if(fail) { return false; }
       else { return true; }
    });
    
        5
  •  0
  •   zuallauz    15 年前

    <form id="loginForm" method="post" action="login.php">
    <input type="text" name="username" id="username">
    <input type="button" value="Log in" id="btnDoSomething">
    </form>
    

    以及Javascript/jQuery:

    $("#btnDoSomething").click(function() {
    
        var request = $.ajax({
            data: {username: $("#username").val()},
            dataType: 'json',
            success: function(data)
            {
                // when response is returned do stuff then submit form
                // ...
                $("#loginForm").submit();
            },
            url: 'ajax-check-username.php'
        });
    });
    

    另外,如果用户按了Enter键,您希望执行ajax请求,那么也可以提交,因此此代码段也很方便:

    // If they hit the enter button, run the same method
    $('#loginForm').bind('keypress', function(e)
    {
        if (e.keyCode == 13)
        {
            $(this).find("#btnDoSomething").click();
        }
    });
    

    工作完美!

        6
  •  0
  •   emachine    15 年前

    我知道我是一个旧线程坏死,但我最近遇到了这个问题,并认为我会抛出一个答案,为任何人谁偶然发现这个线程。我的解决办法是 $.ajax 呼叫同步。

    var formShouldSubmit = false;
    $("form#my_form").bind("submit", function(){
         $.ajax({
            url: "my_form_validate.php",
            data: $(this).serialize(),
            success: function(data){
                if ( data.valid ){
                    formShouldSubmit = true;
                }
                else{
                    $("#error").html('Invalid entry');
                }
            },
            async: false,
            dataType: "json"
        });
        if ( !formShouldSubmit ){
            return false;
        }
    });