【问题标题】:jQuery submit()-event to override form actionjQuery submit()-event 覆盖表单操作
【发布时间】:2012-02-25 16:21:33
【问题描述】:

我有一个表单,并且我有一些 jquery 代码来覆盖提交过程。但它不起作用,也没有错误。我已经简化了示例代码,希望没有错别字。

有人知道代码有什么问题吗?它没有到我得到警报()的地步。 click() 事件工作正常。

我尝试为表单设置一个 ID。还是什么都没有。

使用 jquery-1.4.2.min.js

  <form name="checkout_shipping" action="checkout.php" method="post">
    <div class="contentText">
      <table border="0" width="100%" cellspacing="0" cellpadding="2">
        <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 0); document.checkout_shipping.submit();">
          <td width="75%" style="padding-left: 15px;">Flat price</td>
          <td>$8.00</td>
          <td align="right"><input type="radio" name="shipping" value="flat_flat" onclick="this.form.submit();" /></td>
        </tr>
        <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 1); document.checkout_shipping.submit();">
          <td>Pick-up</td>
          <td>$0.00</td>
          <td align="right"><input type="radio" name="shipping" value="pickup_pickup" checked="checked" onclick="this.form.submit();" /></td>
        </tr>
      </table>
    </div>
  </form>

  <script>
    $('form[name=checkout_shipping]').submit(function(e) {
      e.preventDefault();
      alert('Houston we have contact!');
      $.ajax({
        url: '/includes/checkout/payment.php',
        data: false, // false for testing
        type: 'POST',
        cache: false,
        async: false,
        dataType: 'html',
        error: function(jqXHR, textStatus, errorThrown) {
          // ...
        },
        success: function(data) {
          // ...
        }
      });
    });
  </script>

【问题讨论】:

    标签: javascript forms dom jquery


    【解决方案1】:

    您提交表单的方式绕过了事件处理程序。

    代替:

     document.checkout_shipping.submit();
    

    使用

     $(this).closest('form').submit();
    

    http://jsfiddle.net/6uZuS/

    完整代码:

    <form name="checkout_shipping" action="checkout.php" method="post"> 
        <div class="contentText"> 
            <table border="0" cellspacing="0" cellpadding="2"> 
                <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 0); $(this).closest('form').submit();"> 
                        <td width="75%" style="padding-left: 15px;">Flat price</td> 
                        <td>$8.00</td> 
                        <td align="right"><input type="radio" name="shipping" value="flat_flat" onclick="$(this).closest('form').submit();" /></td> 
                    </tr> 
                    <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 1); $(this).closest('form').submit();"> 
                        <td>Pick-up</td> 
                        <td>$0.00</td> 
                        <td align="right"><input type="radio" name="shipping" value="pickup_pickup" checked="checked" onclick="$(this).closest('form').submit();" /></td> 
                    </tr> 
                </table> 
            </div> 
    </form> 
    
    
     <script type="text/javascript">
          $(document).ready(function(){
               $('form[name=checkout_shipping]').submit(function(e) { 
                    e.preventDefault();
                    alert('Got you!');
               });
          });
     </script>
    

    【讨论】:

    • 没有错误,没有工作。只需提交表单并重新加载页面。即使您的示例在链接中起到了作用。
    • 我从 JS Fiddle 复制了适合我的 HTML/脚本。你在 JSFiddle 上测试过代码吗?
    • 我错了,我在复制您的代码并命名为 id 时出现了拼写错误。它确实有效。非常感谢你!哇。我永远不会猜到这只是一个事件绕过问题。
    • 没问题。不久前,我在使用 jQuery Validate 插件时处于你的位置,调用 .submit 绕过了它用于客户端验证的钩子。 :)
    【解决方案2】:

    您可以查看here

    <form name="checkout_shipping" id="checkout_shipping" action="checkout.php" method="post">
        <div class="contentText">
          <table border="0" width="100%" cellspacing="0" cellpadding="2">
            <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 0);">
              <td width="75%" style="padding-left: 15px;">Flat price</td>
              <td>$8.00</td>
              <td align="right"><input type="radio" name="shipping" value="flat_flat" onclick="$(this).parents('form').submit();" /></td>
            </tr>
            <tr onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 1);">
              <td>Pick-up</td>
              <td>$0.00</td>
              <td align="right"><input type="radio" name="shipping" value="pickup_pickup" checked="checked" onclick="$(this).parents('form').submit();" /></td>
            </tr>
          </table>
        </div>
      </form>
    <script>
    $(document).ready(function(){
    $('#checkout_shipping').submit(function(e) {
          e.preventDefault();
          alert('Houston we have contact!');
    });
    })
    </script>
    

    【讨论】:

    • 没有错误但没有工作。我得到的是常规形式的动作。没有警报,没有 ajax。
    • 您必须将 onclick 事件更改为:$(this).parents('form').submit();$(this).closest('form').submit();
    • 尝试过 Splash-X 解决方案。但它在我的环境中不起作用。像往常一样没有萤火虫错误。
    • @tim 问题是您是否尝试过我们在 JSFiddle 上的任一解决方案?他们都为我(我的和 Fedya 的)在 IE9 和 FF 8 中工作
    • 你们的解决方案毕竟奏效了。见其他帖子。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多