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

如何让jQuery找到对应行并在AJAX成功时触发动作(使用this)

问题分析与解决方案

这个问题我之前也碰到过,核心是回调函数里this的指向问题,我给你拆解下原因和几种解决办法:

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

在你的代码里,$.post的success回调函数内部,this的指向已经不是触发blur事件的那个td[contenteditable]元素了——默认情况下,这里的this指向的是jQuery的jqXHR请求对象,而不是你需要的DOM元素。所以你用$(this).closest('tr')根本找不到目标行,自然没法给td.editQty添加success类。

解决方案(三种常用方法)

方法一:提前保存目标元素的引用(最稳妥兼容的方式)

在事件处理函数里,先把你后续需要操作的DOM元素(比如目标行的td.editQty)缓存到变量里,这样回调函数里直接用这个变量就行,不用依赖this:

$( document ).ready(function() {
  $('tr').on('blur', 'td[contenteditable]', function() {
    // 提前缓存目标元素和需要提交的数据,避免重复DOM查找
    const $currentRow = $(this).closest('tr');
    const $targetQtyTd = $currentRow.children('td.editQty');
    const submitData = {
      modelId: $currentRow.children('td.idmodel').text(),
      qty: $targetQtyTd.text(),
      ajax: true
    };

    $.post("ajax/modQtyModels", submitData, function(data) {
      // 直接用提前缓存的元素变量
      $targetQtyTd.addClass("success");
    });
  });
});

这种方法兼容性最好,不管是ES5还是ES6环境都能正常工作,而且提前缓存DOM元素还能提升性能,避免多次查找DOM。

方法二:使用ES6箭头函数(简洁优雅)

箭头函数不会绑定自己的this,它会继承外层作用域的this。所以把success回调改成箭头函数,就能直接用外层事件处理函数里的this了:

$( document ).ready(function() {
  $('tr').on('blur', 'td[contenteditable]', function() {
    $.post("ajax/modQtyModels", {
      modelId: $(this).closest('tr').children('td.idmodel').text(),
      qty: $(this).closest('tr').children('td.editQty').text(),
      ajax: true
    }, (data) => {
      // 箭头函数的this继承自外层事件处理函数的this
      $(this).closest('tr').children('td.editQty').addClass("success");
    });
  });
});

这种写法更简洁,但要注意你的项目环境需要支持ES6语法(现在大部分现代浏览器和构建工具都支持了)。

方法三:用$.ajax的context选项(灵活可控)

如果你习惯使用完整的$.ajax配置,可以通过context参数指定回调函数里的this指向:

$( document ).ready(function() {
  $('tr').on('blur', 'td[contenteditable]', function() {
    $.ajax({
      url: "ajax/modQtyModels",
      method: "POST",
      data: {
        modelId: $(this).closest('tr').children('td.idmodel').text(),
        qty: $(this).closest('tr').children('td.editQty').text(),
        ajax: true
      },
      context: this, // 指定回调里的this指向当前触发事件的元素
      success: function(data) {
        $(this).closest('tr').children('td.editQty').addClass("success");
      }
    });
  });
});

这种方法可以灵活控制this的指向,适合需要在多个回调里复用同一个this的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:14:38