[英]How to call elements inside user defined methods of an jQuery plugin
I have a jQuery Plugin which accept multiple elements and some methods to be called like: 我有一个jQuery插件,它接受多个元素和一些方法,例如:
(function($){
methods = {
init : function( options, callbacks) {
$.fn.myPlugin.settings = $.extend({
'userDefinedMethod': function() {}
}, options);
return this.each(function(){
$.fn.myPlugin.settings.userDefinedMethod();
}
}
}
$.fn.myPlugin = function(method) {
if ( methods[method] ) {
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exists on jQuery.myPlugin' );
}
}
})(jQuery);
An simple example which will make you understand what I want to achieve: 一个简单的示例将使您理解我想要实现的目标:
$(document).ready(function(){
$('#myElement1, #myElement2, #myElement3').myPlugin({
userDefinedMethod: function() {
// I want here to use the elements in selector
$(this).css('color', 'black');
}
});
});
I know that $(this)
in the example above will represent the jQuery Plugin Object but I want somehow to use each element in the provided selector. 我知道上面示例中的
$(this)
将表示jQuery插件对象,但我想以某种方式使用提供的选择器中的每个元素。
$(document).ready(function () {
$('#myElement1, #myElement2, #myElement3').myPlugin({
userDefinedMethod: function () {
// I want here to use the elements in selector
$(this).css('color', 'red');
}
});
});
(function ($) {
methods = {
init: function (options, callbacks) {
//don't set the settings to shared object
this.settings = $.extend({
userDefinedMethod: $.noop
}, options);
return this.each($.proxy(function (idx, el) {
//use Function.call() to set a custom execution context
this.settings.userDefinedMethod.call(el);
}, this))
}
}
$.fn.myPlugin = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exists on jQuery.myPlugin');
}
}
})(jQuery);
In methods.init
function this
will be the jQuery object obtained by quering the selector. 在
methods.init
函数中, this
将是通过查询选择器获得的jQuery对象。 So, if you want to send this
to userDefinedMethod
just use apply
or call
when you call that function: 所以,如果你想送
this
给userDefinedMethod
只使用apply
或call
,当你调用该函数:
...
var methods = {
init : function( options, callbacks) {
$.fn.myPlugin.settings = $.extend({
'userDefinedMethod': function() {}
}, options);
$.fn.myPlugin.settings.userDefinedMethod.call(this);
// or if you want to send the arguments
// $.fn.myPlugin.settings.userDefinedMethod.apply(this, arguments);
return this;
}
}
...
Also, don't forget that you didn't use var
for declaring methods
. 另外,不要忘记您没有使用
var
来声明methods
。 methods
will become a magic global variable... methods
将成为不可思议的全局变量...
I also corrected the missing )
that was generating a syntax error. 我还纠正了生成语法错误的缺少
)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.