覆盖元素级别的核心jQuery函数

Gor*_*vic 11 jquery overriding element function core

是否有可能在元素级别覆盖核心jQuery函数,因此举个例子,我想仅在一个<select>元素上覆盖val()函数.

如果我做这样的事情

var element = $('select');
var old_val = element.val;
element.val = function () {
  console.log('The new val');
  return old_val.apply(this, arguments);
}
element.val(19);
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但只要我用新的jQuery实例处理相同的字段

var element = $('select');
element.val(19);
Run Code Online (Sandbox Code Playgroud)

它停止工作,因为我们有jQuery对象的新实例.如果我使用$ .fn.val函数,我会改变所有支持val函数的对象的行为,这对我来说有点太多了.

任何帮助将不胜感激.谢谢.

B T*_*B T 5

我做了这个 jquery 扩展来完成你正在谈论的事情:

// overrides a method thats supposed to be called on a single node (a method like val)
$.fn.overrideNodeMethod = function(methodName, action) {
    var originalVal = $.fn[methodName];
    var thisNode = this;
    $.fn[methodName] = function() {
        if (this[0]==thisNode[0]) {
            return action.apply(this, arguments);
        } else {
            return originalVal.apply(this, arguments);
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

对 Dave 答案的奖励 - 您不必污染 jquery 数据名称空间或担心有人覆盖该密钥