【发布时间】:2013-09-22 01:52:18
【问题描述】:
问题
我想知道在保留所有功能的同时包装 jQuery 函数的最佳方式。本质上,我想调用$('#someId'),但通过包装函数、修改参数并将其传递给原始的jQuery函数,让它像$('#' + id + 'someId')一样运行。
动机
我有一段 JS 将重用相同的变量 winId,它被连接并传递给 jQuery。而不是写
$('#' + winId + 'someId').html();
$('#' + winId + 'someOtherId').css();
...
$('#' + winId + 'someThirdId').text();
在整个文件中,我想包装 jQuery 函数,这样我就可以调用了
$('#someId').html();
$('#someOtherId').css();
...
$('#someThirdId').text();
并且在传递给$之前添加了winId。
我的尝试
这是我作为包装器的想法:
(function() {
var fn = $;
return $ = function() {
for ( var i = 0; i < arguments.length; i++ ) {
if ( typeof arguments[i] == 'string') {
arguments[i] = /* code to add in winId, omitted */
}
}
return fn.apply( this, arguments );
}
})();
这很好用,但显然没有像 $.ajax 这样的方法可用:
Uncaught TypeError: Object function () {
for ( var i = 0; i < arguments.length; i++ ) {
if ( typeof arguments[i] == 'string' ) {
arguments[i] = /* code to add in winId, omitted */
}
}
return fn.apply( this, arguments );
} has no method 'ajax'
注意:我知道我可以使用 jQuery.extend($, jQuery) 复制对象,但如果可能的话,我对一个更优雅的解决方案感兴趣。
【问题讨论】:
-
只是不要命名包装函数
$? -
作为最后的手段,您可以改为通过exchanging
$.fn.init执行此操作。 -
@Bergi 我可以将包装器命名为
$以外的名称,但这不是我正在寻找的解决方案。但是,我认为包装$.fn.init是一个很好的解决方案,如果您能发布并回答以便我接受它,我将不胜感激。 -
对我来说听起来像是 x-y 问题
-
我不同意这是一个 x-y 问题,因为我的问题定义明确。我的“动机”仅作为一个示例用例提供;这个问题普遍适用且有价值。
标签: javascript jquery