Jquery 绕过.submit()处理程序

Jquery 绕过.submit()处理程序,jquery,Jquery,我有一个表单提交的事件处理程序,需要做一些工作。这项工作包括调用ajax来执行一些非常具体的验证。由于异步性质,我的意图是在事件处理程序的顶部preventDefault,如果一切顺利,通过触发submit()方法“手动”提交表单 当然,这让我陷入了一个循环。如果我提交并且一切顺利,那么在我重新提交时将调用提交事件处理程序。当我手动触发submit时,有没有办法绕过处理程序 我要补充的是,我的极客业力今天是空的,所以我可能会使这比它必须要困难得多。如果有一个非常简单的解决方案,我想听听 我应该补

我有一个表单提交的事件处理程序,需要做一些工作。这项工作包括调用ajax来执行一些非常具体的验证。由于异步性质,我的意图是在事件处理程序的顶部
preventDefault
,如果一切顺利,通过触发
submit()
方法“手动”提交表单

当然,这让我陷入了一个循环。如果我提交并且一切顺利,那么在我重新提交时将调用提交事件处理程序。当我手动触发submit时,有没有办法绕过处理程序

我要补充的是,我的极客业力今天是空的,所以我可能会使这比它必须要困难得多。如果有一个非常简单的解决方案,我想听听

我应该补充一点,通过简单地使jQuery
$.ajax
调用同步,我已经制定了一个可行的解决方案,但我不禁觉得有一种更有效的方法可以完成这项工作,而我今天还没有看到

谢谢。

不要在表单上放置提交按钮,请将一个按钮绑定为“验证”机制(正确时)最终提交

就向后兼容性而言,添加一个submit按钮,然后使用jQuery将该按钮替换为一个自定义绑定按钮(因此,如果它们不支持javascript,它们仍然可以继续)。毕竟,对于这些情况/表单的黑客攻击,服务器应该有输入验证

重新考虑之后,移动验证逻辑的触发器。绑定到submit按钮的click事件。这允许您在调用
submit()
之前进行干预。此事件还应始终返回false,因为您希望等待AJAX响应以真正验证表单是否应提交

在那里,等待AJAX的响应,一切正常后调用submit

关于向后兼容性,在以下情况下,您仍应在服务器端使用此验证逻辑:

  • 没有javascript支持(可能他们正在使用NoScript插件?)
  • 这种使用感觉就像绕过了表单逻辑,并开始提升提交数据
  • AJAX验证可能无法完成的任何其他(in)有效原因,以及可能出现的问题
  • 
    函数myFunct(){
    $.post('ajax/test.html',函数(数据){
    //对ajax响应进行验证
    如果(一切都好){
    $('#myForm')。提交();
    }
    });
    }
    
    您要做的是“解锁”该功能

    var done = false;
    
    function AjaxCallback()
    {
      done = true;
      document.getElementById("myForm").submit();
    }
    
    function PerformAjax()
    {
      if (!done)
      {
        // perform ajax here
        return false;
      }
      else
        return true;
    }
    
    <form id="myForm" onsubmit="javascript: return PerformAjax();">
    
    var done=false;
    函数AjaxCallback()
    {
    完成=正确;
    document.getElementById(“myForm”).submit();
    }
    函数PerformAjax()
    {
    如果(!完成)
    {
    //在这里执行ajax
    返回false;
    }
    其他的
    返回true;
    }
    
    您可以执行以下操作:

    HTML:

    <form id="my-form">
        <!-- your fields... -->
        <button type="submit">Submit</button>
    </form>
    
    var myForm = $('#my-form');
    
    myForm.on('submit', function(e, skipValidation) {
        if(skipValidation) {
            return;
        }
    
        yourAjaxValidation().then(function(){
            myForm.trigger('submit', [true]);
        })
    })
    

    鉴于AJAX是异步的,在“提交线程”中不可能出现简单的“是/否”。这就是全部问题。提交表单时,它不会调用函数。重新阅读代码。我正在使用onclick事件,而不是onsubmit。。。编辑:有人删除了他们的评论。你仍然认为返回可以从AJAX“成功线程”返回到原始表单“提交捕获线程”。你也有一个无限循环,基本上模仿OP的暗示。什么?表单将在第一次提交时执行ajax,返回false-它不会提交。当ajax完成时,它会将
    done
    设置为true,然后再次提交表单。这次表单将成功提交,因为
    done
    为true,而
    PerformAjax
    将返回true。事实上,我没有看到done在任何地方设置为true(尽管我现在意识到它是在AJAX调用中设置的。我的错误。虽然我可以在AJAX调用中按ESC键,但可以操作表单,然后重新提交并绕过“锁".Hmm true,或者甚至
    javascript:done=true;void 0;
    进入URL栏也会被忽略。我更喜欢上面的解决方案。我们正在考虑相同的解决方案+1您知道,点击事件是否会捕获按下
    Enter
    键?我想确定我捕获了提交表单的所有方法。@Rob:应该,思想测试是最好的方法。可以在各种浏览器中弹出JSFIDLE演示,然后尝试按enter键。--后续:最新的chrome、FF6、IE9都会在输入字段中触发enter键的单击事件。
    var myForm = $('#my-form');
    
    myForm.on('submit', function(e, skipValidation) {
        if(skipValidation) {
            return;
        }
    
        yourAjaxValidation().then(function(){
            myForm.trigger('submit', [true]);
        })
    })