You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在click函数内正确实现submit函数?(附代码故障排查)

问题分析与解决方案

你的核心问题是:在addCart函数里,你只是给表单绑定了submit事件的处理器,但并没有实际触发表单的提交动作,所以AJAX代码完全没执行。另外,你的HTML里还有个小问题:a标签同时设置了两个id属性(id="submit"和id="cartsub"),这不符合HTML规范(id必须唯一),得先修正这个。

方案一:直接在addCart里执行AJAX逻辑(推荐)

既然你是通过点击a标签触发操作,完全不需要借助表单的submit事件,直接在addCart函数里处理AJAX即可,这样逻辑更直接,也避免了事件绑定的问题:

修正后的HTML

<form method="POST" class="<?php echo $row['code']; ?>" id="form<?php echo $row['id']; ?>">
  <!-- 移除重复的id,保留class即可 -->
  <a class="product-links cartsub" href='javascript:addCart(<?php echo $row['id']; ?>);'>
    <i class="fa fa-shopping-cart"></i>
  </a>
  <!-- 假设这里有你需要的input#code -->
  <input type="hidden" id="code" value="<?php echo $row['code']; ?>">
</form>

修正后的JavaScript

function addCart(id){
  // 获取目标表单
  const $form = $("#form" + id);
  // 阻止a标签默认的跳转行为(虽然href是javascript,但加上更稳妥)
  event.preventDefault();
  
  // 获取code值
  const code = $form.find('input#code').val();
  const dataString = 'code=' + code;

  // 执行AJAX提交
  $.ajax({
    type: 'POST',
    url: 'addcart.php',
    data: dataString,
    cache: false,
    success: function (result) {
      if(result === "success"){
        alertify.success("המוצר נוסף לעגלה");
        $("#plus").fadeIn(300).delay(1500).fadeOut(300);
      } else{
        alertify.error("המוצר כבר קיים בעגלה");
      }
    }
  });

  // 合并重复的load操作,提升性能
  $("#cartreload1, #cartreload2").load("product.php #cartreload1, #cartreload2");
}

方案二:绑定submit事件后立即触发(不推荐,但满足你想保留submit逻辑的需求)

如果你坚持要通过表单submit事件来处理,那需要在绑定事件后主动触发submit动作,同时还要避免重复绑定事件(否则多次点击会执行多次AJAX):

function addCart(id){
  const $form = $("#form" + id);
  
  // 先解绑之前的submit事件,避免重复绑定导致多次执行
  $form.off('submit').on('submit', function(e) {
    e.preventDefault();
    const code = $(this).find('input#code').val();
    const dataString = 'code=' + code;

    $.ajax({
      type: 'POST',
      url: 'addcart.php',
      data: dataString,
      cache: false,
      success: function (result) {
        if(result === "success"){
          alertify.success("המוצר נוסף לעגלה");
          $("#plus").fadeIn(300).delay(1500).fadeOut(300);
        } else{
          alertify.error("המוצר כבר קיים בעגלה");
        }
      }
    });

    $("#cartreload1, #cartreload2").load("product.php #cartreload1, #cartreload2");
  });

  // 主动触发表单的submit事件,执行上面绑定的逻辑
  $form.submit();
}

为什么原来的代码不生效?

你之前的代码只是给表单添加了submit事件的回调函数,但从来没有调用$form.submit()来触发这个事件,所以AJAX代码根本没有机会执行。而当你不包裹在click函数里时,页面加载就绑定了submit事件,此时如果表单被其他方式提交(比如按钮点击),就会触发回调,但你现在的触发源是a标签的点击,所以必须主动触发submit或者直接执行逻辑。

内容的提问来源于stack exchange,提问作者Yotam Dahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:52:40