我想知道如何将$(someSelector).someObj.someMethod()
这样的语法与jQuery结合使用?
理念:我不想用一堆自定义函数扩展$.fn
。因此,someObj
包含几种应将this
解析为$(someSelector)
的方法。
我知道我只能使用one custom function which execudes code depending on its argument:
(function( $ ) {
$.fn.customFunc = function( funcSelector ) {
if ( funcSelector === "do this") {
// do this
}
if ( funcSelector === "do that" ) {
// do that
}
};
}( jQuery ));
所以$(someSelector).customFunc(funcSelector)
是一个很好的解决方法。
但我仍然很好奇:是否有可能实现jQuery和自定义对象之间的可链接性?
更新#1:
我喜欢@jfriend00的方法。看他最后的编辑。它也基于将自定义函数名称作为字符串参数传递,但它允许将自定义函数定义为实际函数,而不是将某些代码包含在if / switch语句中。
更新#2:
在答案中查看@barmar的自定义类方法。
答案 0 :(得分:2)
您可以执行以下操作:
$(someSelector).someObj.someMethod()
向someObj
添加属性jQuery.fn
,该属性是包含someObj
的自有方法的对象。
jQuery.fn.someObj = {
someMethod: function() {
// method code here
}
};
但是,当你这样做并像你指定为$(someSelector).someObj.someMethod()
一样调用它时,this
中的.someMethod()
值将是someObj
并且不会是jQuery对象所以这通常不是一件有用的事情,因为你无法访问jQuery对象,这通常是添加jQuery方法的原因。
如果您担心向jQuery名称空间添加太多方法,那么您可以在方法名称上使用自己的前缀,这与您最初从名称空间冲突点请求的内容没有什么不同视图(这只是在两个名称之间使用单个名称的部分之间的_
而不是.
:
$(someSelector).myUniquePrefix_add();
$(someSelector).myUniquePrefix_remove();
$(someSelector).myUniquePrefix_modify();
尝试解决第一个方案中的this
问题的任何解决方案都是混乱的,根本不值得麻烦或开销,因为Javascript不会那样工作。
例如,你可以让它像这样工作:
jQuery.fn.someObj = function(method /* other args */) {
var args = [].slice.call(arguments, 1);
return this.someObj[method].apply(this, args);
}
jQuery.fn.someObj.someMethod = function() {
// method code here
}
// and then call it like this
$(someSelector).someObj("someMethod", "arg1", "arg2");
答案 1 :(得分:0)
为了完整起见,这是执行@ Barmar建议的代码:
// declare wrapper class for custom functions
function Custom() {}
// define custom functions as object methods
Custom.prototype.doThis = function() {
// do something with this.jObj
return this.jObj;
}
Custom.prototype.doThat = function() {
// do something with this.jObj
return this.jObj;
}
// use jQuery's custom function interface to initialize wrapper object
$.fn.custom = function() {
var custom = new Custom();
custom.jObj = this;
return custom;
};
// call your custom functions
$(selector).custom().doThis();
$(selector).custom().doThat();
我不喜欢调用的语法,因此更喜欢@jfriend00的基于参数的解决方案,但是如果你使用伪方法就可以了,那么你手边的自定义函数就有了一个很好的包装类。 / p>
编辑:在自定义()调用上创建自定义对象(请参阅@ jfriend00的评论)。