【发布时间】:2012-01-27 17:59:33
【问题描述】:
我怀疑 Javascript 中的“调用”功能。我有这个 jQuery 插件:
(function($) {
var methods = {
method1 : function( settings, callback ) {
// do stuff
if($.isFunction(callback)){
callback.call(this, $(list));
}
},
method2 : function( settings, callback ) {
// do stuff
if($.isFunction(callback)){
callback.call(this, $(list));
}
},
method3 : function( settings, callback ) {
// do stuff
if($.isFunction(callback)){
callback.call(this, $(list));
}
},
};
$.fn.jPlugin = function( method ) {
if ( methods[method] ) {
return methods[method].apply( this, Array.prototype.slice.call(arguments, 1));
}
else if ( typeof method === 'object') {
$.error( 'Expected two (2) parameters: parameter 1 must be the method name to call. Parameter 2 must be an object containing the settings for this method.' );
}
else {
$.error( 'Method ' + method + ' does not exist' );
}
};
而且我对 jQuery 插件文档中的这一行有点困惑:
return methods[method].apply( this, Array.prototype.slice.call(arguments, 1));
插件按预期工作,没有通过回调。但是如果我这样调用插件,我应该怎么做才能将回调传递给正确的方法呢?
$('#my-div').jPlugin('method1', settings);
回调函数应该是设置对象的一部分,还是我可以调整插件来接受这个?
$('#my-div').jPlugin('method1', settings, callback);
谢谢你们!
【问题讨论】:
-
$('#my-div').jPlugin('method1', settings, callback);将适用于您当前的插件代码。你到底有什么问题? -
我只是不完全理解“呼叫”部分。我认为 (arguments, 1) 指的是 $('#my-div').jPlugin('method1', settings);,... 的第二个参数,所以是“设置”。我不知道是否应该在其他地方添加回调。
-
我猜,“参数”本身是指调用的所有参数,所以设置和回调,就这样?
-
抱歉,对我来说同时信息太多,... slice 表示从第二个开始的每个元素...
-
arguments不是数组,它只是类数组。slice函数返回从您提供的索引开始的子数组。所以Array.prototype.slice.call(arguments, 1)将slice应用于arguments,因此将其视为一个数组。如果arguments是一个数组,它将与arguments.slice(1)相同,这意味着从数组中的第二个元素开始获取所有元素。它基本上是删除方法名称并将所有剩余的参数传递给您的方法。
标签: jquery jquery-plugins callback