【问题标题】:Using jquery to prevent form from submitting does not work after the first preventDefault在第一次 preventDefault 后使用 jquery 阻止表单提交不起作用
【发布时间】:2014-05-28 12:44:03
【问题描述】:

我使用下面的脚本通过 check.php 的响应从数据库中获取一些数据,然后检查数据,如果一切正常,我想提交一个表单,否则阻止它。 #order_number 是我正在检查的字段(文本类型的输入),#seblod_form 是表单。 如果我不触发第二个 e.preventDefault 一切正常并且表单提交正常。当我触发第二个 e.preventDefault 表单不提交时,它会在 html 中得到一个忙类,即使 okToSubmit = true 表单也会不提交。有什么想法可以解决这个问题吗?

<script src="https://code.jquery.com/jquery-2.1.1.min.js">
 $(document).ready(function(){
     $( document ).on('keydown',function( e ) {
       if (e.keyCode == 13){
    e.preventDefault();  //prevent form submitting when user presses enter key
    return false;
       }
     });
    $( document ).on('keyup','#order_number',function( e ) {
        if (e.keyCode != 13){
            var value = $('#order_number').val();
            var okToSubmit = true;
            $.ajax({      
            type: "POST",                                
            url: 'check.php',            
            data: {order_number:value},  
            dataType: 'json',                                    
            success: function(data) {
              if (data['found'] != 'true' || data['ordernumberused'] == 'true'){
                 if (data['ordernumberused'] == 'true') {
                    $('#cck1r_form_order_number').append( $( "<div id='message' style='color:red;'>This order number is already used!!!</div>" ) );
                    okToSubmit = false;
                 }
                 else{
                     $('#message').remove();
                }
                 $('#order_number').css("border-color", "red");
             }
              else {
                 $('#order_number').css("border-color", "green");
                 okToSubmit = true;
                 alert(okToSubmit);
              }
              $('#seblod_form').submit(function(e){
                     if (!okToSubmit){
                        e.preventDefault();
                        return false;
                       }
                       else {
                           return true;
                       }
              });

            }//end success 
            });//end ajax
        }
    });
});


</script>

这是代码的更新版本:

        <script src="https://code.jquery.com/jquery-2.1.1.min.js">  </script> /*hack for invoices - receipts*/
<script>
 $(document).ready(function() {
 var okToSubmit = true;
 $('#seblod_form').submit(function(e) {
     if (!okToSubmit) {
         e.preventDefault();
         return false;
     } else {
         return true;
     }
 });

 $('input#submit').mousedown(function() {
    if(okToSubmit){
    $('#seblod_form').removeClass('busy');

 }
 });

   $('input#submit').mouseup(function() {
    if(okToSubmit){
    $('#seblod_form').submit();

 }
 });



 $(document).on('keydown', function(e) {
     if (e.keyCode == 13) {
         e.preventDefault(); //prevent form submitting when user presses enter key
         return false;
     }
 });
 $(document).on('keyup', '#order_number', function(e) {
     if (e.keyCode != 13) {
         var value = $('#order_number').val();

         $.ajax({
             type: "POST",
             url: 'http://eshop.wideservices.gr/check.php',
             data: {
                 order_number: value
             },
             dataType: 'json',
             success: function (data) {
                 if (data['found'] != 'true' || data['ordernumberused'] == 'true') {
                     if (data['ordernumberused'] == 'true') {
                        if (!$('div').is('#message')){
                         $('#cck1r_form_order_number').append($("<div id='message' style='color:red;'>This order number is already used!!!</div>"));
                        }
                         okToSubmit = false;
                     } else {
                         $('#message').remove();
                     }
                     $('#order_number').css("border-color", "red");
                 } else {
                     $('#order_number').css("border-color", "green");
                     okToSubmit = true;

                 }
             } //end success 
         }); //end ajax
     }
 });});


</script>

removeClass 似乎可以解决问题。

【问题讨论】:

  • 你真的把你的 jQuery 合并到一个外部的 JS 包含中了吗?那不是跨浏览器兼容的。它们应该是单独的脚本元素!
  • 每次键入密钥并调用 Ajax 时,您都试图附加到 submit 事件。这显然是个坏主意。

标签: javascript jquery


【解决方案1】:

您尝试在每次键入键时附加到submit 事件。这显然是一个坏主意,因为每次连接时它都会使用它自己的函数范围值okToSubmit,这将同时导致真假调用。任何实例中的任何false 都会使其变为preventdefault()

尝试在更高级别声明 okToSubmit 并仅连接一次 submit 事件。

例如

 $(document).ready(function () {
     var okToSubmit = true;
     $('#seblod_form').submit(function (e) {
         if (!okToSubmit) {
             e.preventDefault();
             return false;
         } else {
             return true;
         }
     });

     $(document).on('keydown', function (e) {
         if (e.keyCode == 13) {
             e.preventDefault(); //prevent form submitting when user presses enter key
             return false;
         }
     });
     $(document).on('keyup', '#order_number', function (e) {
         if (e.keyCode != 13) {
             var value = $('#order_number').val();
             okToSubmit = true;
             $.ajax({
                 type: "POST",
                 url: 'check.php',
                 data: {
                     order_number: value
                 },
                 dataType: 'json',
                 success: function (data) {
                     if (data['found'] != 'true' || data['ordernumberused'] == 'true') {
                         if (data['ordernumberused'] == 'true') {
                             $('#cck1r_form_order_number').append($("<div id='message' style='color:red;'>This order number is already used!!!</div>"));
                             okToSubmit = false;
                         } else {
                             $('#message').remove();
                         }
                         $('#order_number').css("border-color", "red");
                     } else {
                         $('#order_number').css("border-color", "green");
                         okToSubmit = true;
                         alert(okToSubmit);
                     }
                 } //end success 
             }); //end ajax
         }
     });
 });

另一个问题:

您将 jQuery 代码包含在外部 JavaScript 文件请求中。总之不要!。您不应该混合使用外部 JS 请求和内联脚本块,因为这不适用于所有浏览器(而且看起来非常糟糕):)

例如

<script src="https://code.jquery.com/jquery-2.1.1.min.js"/>
<script type="text/javascript">
    ...your inline script code here...
</script>

【讨论】:

  • 感谢您为我指出正确的方向,但即使有您的建议,我也无法在 preventDefault() 触发后提交表单。尽管在您的建议之后,我设法做的是让表单提交,如果我手动删除 class="busy",jquery 在触发 preventDefault() 后放在表单元素上!也许这可以为可能发生的事情提供线索?
  • 您可以始终触发preventDefault(),并在您对数据满意时手动触发提交。这样问题就解决了。
  • 我添加了下面的代码,它现在似乎可以工作了。但是我不知道为什么您的建议不起作用。他们不工作没有任何意义。 $('input#submit').mousedown(function() { if(okToSubmit){ $('#seblod_form').removeClass('busy'); } }); $('input#submit').mouseup(function() { if(okToSubmit){ $('#seblod_form').submit(); } });
  • 我建议您更新您的问题,将新代码(全部)添加到现有代码下方作为更新。我也很好奇为什么这些建议不起作用。
  • 我是 jquery-javascript 的新手,所以我可能无法正确处理您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多