假设我有两个这样的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);
}
};
};
答案 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
对于大多数项目都能正常工作,只对那些手动添加方法的项目表现不同。