Javascript jQuery插件编写和/或构造函数注入
我已经编写了一个插件,它构造了一个富UI控件。我希望有一种方法可以让我在查询这个元素时以某种方式改变jQuery的操作方式 我希望jQuery能够忽略此控件的内部结构,但这并不是一个很难满足的要求。我想做的是将Javascript jQuery插件编写和/或构造函数注入,javascript,jquery,Javascript,Jquery,我已经编写了一个插件,它构造了一个富UI控件。我希望有一种方法可以让我在查询这个元素时以某种方式改变jQuery的操作方式 我希望jQuery能够忽略此控件的内部结构,但这并不是一个很难满足的要求。我想做的是将$('#richucontrolid').val()的含义更改为其他函数,因为#richucontrolid是此控件的包装器元素(可能我使用css类来标识该元素) 目前,我必须调用插件函数$('#richucontrolid').richucontrolid().val(),该函数将返回带
$('#richucontrolid').val()的含义更改为其他函数,因为#richucontrolid
是此控件的包装器元素(可能我使用css类来标识该元素)
目前,我必须调用插件函数$('#richucontrolid').richucontrolid().val()
,该函数将返回带有必要更改的jQuery对象val()
在这种情况下执行我希望它执行的操作
然而,如果我能够在没有额外函数调用的情况下维护jQuery接口,它将允许我继续使用熟悉的模式,在我的例子中它具有巨大的重用价值
// I want to change val() depending on some property of the selector #RichUIControlID
$('#RichUIControlID').val()
能做到吗
编辑1:
感谢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()
的每次调用都不必检查它是否是#richucontrolid元素,如果可能的话,我宁愿在构造期间连接它
编辑2:
就是这样,浏览源代码时,实际上可以用同样的方式控制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;
}
})();
您可以重写JQuery的val()方法(请参阅)来实现自己的逻辑,如果目标对象是标准对象,则可以保留对原始方法的回退 很好!我的插件的公共接口相当小,但如果我继续这样做的话,我将提供该API作为附加插件。我有像get_selectedItem和get_selectedItems这样的东西。现在考虑到可能有多个插件想要更改val方法的场景,我担心它会导致一个大混乱,而不是在jQuery对象被构造为包装器元素时添加/重写该方法。有什么想法吗?嗨,John,我想到的第一个想法是:可以创建类似“extVal()”的东西来实现自定义逻辑,并在重写的val()中检查extVal()是否已定义。如果为true,则应用扩展方法,否则应用标准val(),这是一个更优雅的解决方案……关键是使实现不透明。检查我的编辑2,您将看到我如何以类似的方式更改init函数(构造函数)。