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

如何修改返回DOM元素对象的所有jQuery函数使其返回额外数据?

如何修改jQuery返回的DOM元素对象以附带额外数据?

你的思路方向是对的,但存在几个关键问题:直接返回数组会丢失jQuery对象的所有方法,代码中存在未定义变量origAppliedArray,且jQuery的实际构造函数是$.fn.init而非$.fn.constructor。以下是两种可行方案,根据你的需求选择:

方案1:给DOM元素添加额外属性(推荐,不破坏原有功能)

这种方式不会改变jQuery集合的结构,只是给每个DOM元素附加num属性,既保留jQuery所有原生方法,又能获取额外数据:

(function($) {
  var origInit = $.fn.init;

  $.fn.init = function(selector, context, root) {
    // 调用原始构造函数获取标准jQuery实例
    var $instance = new origInit(selector, context, root);
    
    // 给每个DOM元素添加num属性
    $instance.each(function(index) {
      this.num = index + 1; // 对应你例子中的num从1开始计数
    });

    $instance.constructor = $.fn.init;
    return $instance;
  };

  // 保持原型链一致,确保jQuery方法正常工作
  $.fn.init.prototype = $.fn;
})(jQuery);

测试使用:

var $divs = $('div');
console.log($divs[0].num); // 输出1
$divs[0].click(); // 原生DOM方法正常生效
$divs.find('p').each(function() {
  console.log(this.num); // 子元素也会带有num属性
});

方案2:将DOM元素包裹为自定义对象(需兼容jQuery方法)

如果你确实需要把每个元素替换为{索引: DOM元素, num: 数值}的结构,需要注意:这种方式会导致直接调用DOM方法(如$obj[0].click())失效,必须通过$obj[0][索引]访问原始DOM元素。代码如下:

(function($) {
  var origInit = $.fn.init;

  $.fn.init = function(selector, context, root) {
    var $instance = new origInit(selector, context, root);
    
    // 遍历替换每个元素为自定义对象
    for (var i = 0; i < $instance.length; i++) {
      $instance[i] = {
        [i]: $instance[i],
        num: i + 1
      };
    }

    $instance.constructor = $.fn.init;
    return $instance;
  };

  $.fn.init.prototype = $.fn;
})(jQuery);

测试使用:

var $divs = $('div');
console.log($divs[0]); // 输出 {0: <div>, num: 1}
$divs[0][0].click(); // 需通过索引访问原始DOM元素才能调用方法

关键说明

  1. jQuery的核心构造逻辑在$.fn.init中,重写它才能覆盖所有返回jQuery集合的方法(包括$()、find、filter等)。
  2. 必须保持$.fn.init.prototype = $.fn,否则jQuery的原型方法(如each、click)会失效。
  3. 方案1是更稳妥的选择,因为它完全兼容jQuery的所有原生功能;方案2仅适用于你明确需要自定义对象结构且能接受DOM方法调用方式改变的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:45:05