我编写了一个构建丰富UI控件的插件。我希望有一种方法可以让我在查询这个元素时以某种方式改变jQuery的运行方式。
我希望jQuery忘记这个控件的内部结构,但这并不是一个很难的要求。我想做的是将$('#RichUIControlID').val()
的含义更改为其他函数,因为#RichUIControlID
是此控件的包装元素(可能我使用css类来标识该元素)。 / p>
目前我必须调用插件函数$('#RichUIControlID').richUIControlID().val()
,它将返回一个带有必要更改的jQuery对象。 val()
在这种情况下确实是我想要它做的。
但是,如果我可以在没有附加函数调用的情况下维护jQuery接口,那么我将继续使用熟悉的模式,这种模式在我的情况下具有巨大的重用价值。
// I want to change val() depending on some property of the selector #RichUIControlID
$('#RichUIControlID').val()
可以吗?
由于mamoo提供的链接,这样做的一种方法就是这样做:
(function() {
var val = jQuery.fn.val;
jQuery.fn.val = function() {
if (this.is('#RichUIControlID'))
return this.richUIControlID().val()
else
return val.apply(this, arguments);
}
})();
然而,感觉有点过于干扰。对val()
的每次调用都不应该检查它是否是#RichUIControlID元素,如果可能的话,我宁愿在构造期间将其挂起。
这就是东西,浏览源代码实际上可以以相同的方式控制jQuery构造函数。这里需要注意的是,如果您要做的第一件事就是不将调用转发给默认构造函数,那么最终会出现一个麻烦的调用堆栈。
(function() {
var init = jQuery.fn.init;
jQuery.fn.init = function() {
var q = init.apply(this, arguments); // call this first
if (q.data('RichUIControlID'))
return q.richUIControlID();
else
return q;
}
})();
答案 0 :(得分:2)
您可以覆盖JQuery的val()方法(请参阅http://www.bennadel.com/blog/1624-Ask-Ben-Overriding-Core-jQuery-Methods.htm)以实现您自己的逻辑,如果目标对象是标准对象,则保留对原始方法的回退。