将方法添加到单个jQuery节点上

时间:2012-01-26 23:20:35

标签: jquery

假设我有两个这样的html节点:

<div class='node a'>one</div>
<input class='node b' value='two'>

我想为$('。node.a')添加一个方法,但不是为节点b添加。我真正想做的是这样的事情:

$('.node.a').addMethod('val', function() {
  return $('.node.b').val();
});

alert($('.node.a').val()); // alerts 'two'

显然,我不想为每个jQuery节点覆盖'val'方法。有可能这样做吗?

*更新*

根据mgibsonbr的建议,我写了一个jQuery插件来为我做这个。如果有问题的节点是被调用的节点,我只运行不同的功能,而不是使用jQuery数据方法。这意味着此表单不适用于匹配多个html节点的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);
        }
    };
};

1 个答案:

答案 0 :(得分:1)

我知道添加节点特定数据的唯一方法是使用data方法:

$('.node.a').data("val", function() {
    return $('.node.b').val();
});

alert($('.node.a').data("val")());

不是您想要的语法,而是完成工作。另一个选择是重载val,正如亚历克斯建议的那样。例如,您可以将两种方法结合起来:

var oldVal = $.fn.val;
$.fn.val = function() {
    var custom = $(this).data("val");
    return custom ? custom.apply(this,arguments) : oldVal.apply(this,arguments);
};

alert($('.node.a').val()); // Now it works as intended

这样,val对于大多数项目都能正常工作,只对那些手动添加方法的项目表现不同。

相关问题