我正在创建jQuery插件:
$.fn.myGrid = function () {
return ???;
}
我希望myGrid
的返回值包含一个add函数,以便我可以按以下方式使用它;
var grid = $(".myGrid").myGrid();
grid.add();
我该怎么做?我如何声明添加功能?我需要在myGrid
插件中返回什么内容?
我也很乐意拥有像这样的东西;
$.myGrid.add();
有可能吗?
答案 0 :(得分:3)
您可以使用的一种方法就是这个;
$.fn.myGrid = function () {
var that = this;
return {
add: function () {
that.after('<h2>Here I am, adding something'); // Note `that` rather than `this`.
},
remove: function () {
that.next().remove();
}
};
}
捕获this
变量很重要,因为否则return
函数中myGrid()
对象上的方法将无法访问jQuery对象调用了myGrid()
。
请参阅此处的操作代码; http://jsfiddle.net/HpeS8/
答案 1 :(得分:0)
通常,编写插件的最佳惯例是这样的:
$.fn.pluginName = function(){
// return the same object to preserve chainability
// and also apply the plugin's functionality to all the
// dom elements in this jquery collection
return this.each(function(i,el){
// do whatever you want with $(el)
});
};
如果您正在编写一个返回值而不是以某种方式操作当前对象(例如width
工作)的插件,则应返回该值而不是当前对象引用(this
):
$.fn.maxWidth = function(){
var max = 0;
this.each(function(i,el){
var w = $(el).width();
if(w > max)
max = w;
});
return max;
};
如果您想让用户可以访问&amp;修改你的插件功能,你应该保留可链接性(我的意思是返回this
而不是包含你插件的api的其他对象)并通过jQuery元素的data
方法将插件的API公开给用户。登记/>
这是一个例子。让我们说我们正在制作一个视频播放器jquery插件。我们希望保留可链接性,但仍然能够访问此插件的核心功能
执行此操作的正确方法将是这样的:
$.fn.videoPlayer = function(){
var api = {
play : function(){/*...*/},
pause : function(){/*...*/},
stop : function(){/*...*/}
};
return this.each(function(i,el){
$(el).data('videoPlayerApi',api);
});
};
一个用法示例,它说明了我的观点:
$('video')
// initialising the plugin
.videoPlayer()
// the return value is the original jQuery object,
// so we can still call jQuery methods on it
.css('opacity',1)
// select the first video
.eq(0)
// access the first video's plugin api
.data('videoPlayerApi')
// start only the first video
.start();
答案 2 :(得分:0)
(function ($) {
var methods = {
init: function () {
//Initilize
},
var add = {
//Do something
}
$.fn.myGrid= 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 exist on jQuery.myGrid'); }
};
})(jQuery);
像这样打电话
var grid = $(".myGrid").myGrid();
grid.myGrid("add");