我仍在尝试了解插件程序 所以我可以写自己的或者适应另一个。
我尝试从这个插件中学习 它使用fn.extend设置方法,然后将自身(使用此)传递给某个函数 在jquery.extend中制作。
jQuery.fn.extend({
everyTime: function(interval, label, fn, times) {
return this.each(function() {
jQuery.timer.add(this, interval, label, fn, times);
});
},
我也看到其他插件没有这样做。
为什么?或者它背后的想法是什么。
(我读了一些其他的解释,说一个用于函数,另一个用于方法,但这对我来说很模糊。)
谢谢,理查德修改
完整的插件代码,使用两种不同的扩展
jQuery.fn.extend({
everyTime: function(interval, label, fn, times) {
return this.each(function() {
jQuery.timer.add(this, interval, label, fn, times);
});
},
oneTime: function(interval, label, fn) {
return this.each(function() {
jQuery.timer.add(this, interval, label, fn, 1);
});
},
stopTime: function(label, fn) {
return this.each(function() {
jQuery.timer.remove(this, label, fn);
});
}
});
jQuery.extend({
timer: {
global: [],
guid: 1,
dataKey: "jQuery.timer",
regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
powers: {
// Yeah this is major overkill...
'ms': 1,
'cs': 10,
'ds': 100,
's': 1000,
'das': 10000,
'hs': 100000,
'ks': 1000000
},
timeParse: function(value) {
if (value == undefined || value == null)
return null;
var result = this.regex.exec(jQuery.trim(value.toString()));
if (result[2]) {
var num = parseFloat(result[1]);
var mult = this.powers[result[2]] || 1;
return num * mult;
} else {
return value;
}
},
add: function(element, interval, label, fn, times) {
var counter = 0;
if (jQuery.isFunction(label)) {
if (!times)
times = fn;
fn = label;
label = interval;
}
interval = jQuery.timer.timeParse(interval);
if (typeof interval != 'number' || isNaN(interval) || interval < 0)
return;
if (typeof times != 'number' || isNaN(times) || times < 0)
times = 0;
times = times || 0;
var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
if (!timers[label])
timers[label] = {};
fn.timerID = fn.timerID || this.guid++;
var handler = function() {
if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
jQuery.timer.remove(element, label, fn);
};
handler.timerID = fn.timerID;
if (!timers[label][fn.timerID])
timers[label][fn.timerID] = window.setInterval(handler,interval);
this.global.push( element );
},
remove: function(element, label, fn) {
var timers = jQuery.data(element, this.dataKey), ret;
if ( timers ) {
if (!label) {
for ( label in timers )
this.remove(element, label, fn);
} else if ( timers[label] ) {
if ( fn ) {
if ( fn.timerID ) {
window.clearInterval(timers[label][fn.timerID]);
delete timers[label][fn.timerID];
}
} else {
for ( var fn in timers[label] ) {
window.clearInterval(timers[label][fn]);
delete timers[label][fn];
}
}
for ( ret in timers[label] ) break;
if ( !ret ) {
ret = null;
delete timers[label];
}
}
for ( ret in timers ) break;
if ( !ret )
jQuery.removeData(element, this.dataKey);
}
}
}
});
jQuery(window).bind("unload", function() {
jQuery.each(jQuery.timer.global, function(index, item) {
jQuery.timer.remove(item);
});
});
答案 0 :(得分:2)
这就是插件机制的工作原理。您可以通过使用自己的函数扩展 jQuery.fn 对象来创建jQuery插件。通过直接向jQuery.fn对象添加函数,或者通过调用jQuery.fn.extend()
这些插件函数总是传递给jQuery对象(即调用它的DOM元素的选择)作为 this 变量。
例如,假设您要创建一个jQuery插件,该插件使用警报显示DOM集中的项目数:
$.fn.showCount = function() {
alert("Count = " + this.length); // "this" is a refernce to the jQuery object
}
或(完全相同):
// $.fn.extend is just a convenience method for extending the jQuery.fn object
// It's also the same as calling $.extend($.fn, { ... })
$.fn.extend( {
showCount: function() {
alert("Count = " + this.length);
}
});
所以当你打电话时:
$("a").showCount();
它会弹出一个提示,告诉您文档中<a>
个标记的数量。
修改强>:
看到你的代码后,我想我知道你得到了什么。
当使用jQuery.extend()(而不是jQuery.fn.extend)时,你不是在创建一个REAL插件。你只是创建一个与jQuery本身无关的全局函数或对象。
事实上,计时器插件可能是这样编写的,它本可以做同样的事情:
var timerPlugin = {
global: [],
guid: 1,
dataKey: "jQuery.timer",
regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
powers: {
// Yeah this is major overkill...
'ms': 1,
'cs': 10,
'ds': 100,
's': 1000,
'das': 10000,
'hs': 100000,
'ks': 1000000
},
timeParse: function(value) {
//...
}
// ...
};
然后(例如)你调用 timerPlugin.remove()而不是 jQuery.timer.remove()。
扩展jQuery.fn对象是为了允许在jQuery对象上调用自己的函数。例如: $(“a”)。myPlugin()
要记住的是jQuery.extend()与jQuery或jQuery插件无关。它只是jQuery库提供的实用程序功能。
答案 1 :(得分:0)
您可以通过多种方式定义插件
$.fn.myFunc=function(opt){
};
$.fn.myOtherFunc=function(opt){
};
与
相同$.fn.extend({
myFunc:function(opt){
},
myOtherFunc:function(opt){
}
});