在前端飞速发展的时代,虽然jquery已经要步入暮年,但是不得不承认它曾经创造的辉煌,回到那个一个人写java写jsp页面的时候,jquery简直是神器一样的存在,灵活的api可以操作你想操作的任何dom元素,所拥有的插件也可以说是不计其数,网上随便一搜一大把jquery插件,有的人忍不住想问,到底插件是怎么写的呢,话不多说,下面来缅怀一下那些年我们曾写过的插件。
一、jquery插件开发的方式,这里主要写出博主最喜欢也是最常用的两种书写方式
1、通过$.extend()方法来扩展jQuery
这种方式是用$.extend()来向jQuery添加了一个say的方法,通过$.say()就可以调用
// 向jquery添加一个say的方法
$.extend({
say: function(name) {
console.log("你好啊,我叫:" + name)
}
})
// 运行起来
$(function() {
$.say("小明")
})
2、通过$.fn 向jQuery添加新的方法
下面这种是绑定到元素上,来对元素进行操作,并在插件内部返回了this,这样就可以实现链式调用啦,就像$(".text").changeColor().fadeOut().fadeIn();
(function() {
$.fn.changeColor = function(options) {
// 配置的默认插件参数
var DEFAULTS = {
'color': 'red',
};
// 使用$.extend({},arg1,arg2,...)可以合并对象到第一个{}里
var settings = $.extend({}, DEFAULTS, options);
// 循环每个元素,分别设置颜色
return this.each(function() {
$(this).css({
color: settings.color
})
})
}
})();
// 运行起来
$(function() {
// 使用
$(".demo").changeColor({
color: "blue"
});
})
二、以上的书写方式是最常用的简单的方式,写了两种方式,相信对插件的写法有了一个直观的认识,下面是使用bootstrap的插件思想写出来的一个完整一点的例子:
<!DOCTYPE html>
<html>
<head>
<meta chart="utf-8" />
<title>jquery插件例子</title>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script>
+(function ($) {
// 使用严格模式
'use strict';
// 插件的默认参数配置
const PLUGIN_DEFAULTS = {
color: "red"
};
// 插件对象
var ChangeColor = function (element, options) {
this.$element = $(element);
this.settings = $.extend({}, PLUGIN_DEFAULTS, options);
};
/*
* 改变颜色
*/
ChangeColor.prototype.change = function () {
/* 这里因为在插件调用Plugin方法的时候已经new过ChangeColor这个对象,并传入了构造参数,所以在这里取的时候已经有了
* this.$element和this.settings的值
*/
this.$element.css("color", this.settings.color)
};
/*
* 定义插件
*/
function Plugin(options) {
return this.each(function () {
// 当前循环中元素对象
var $this = $(this);
// 获得并合并传递的参数
var settings = $.extend({}, PLUGIN_DEFAULTS, $this.data(), typeof options == 'object' && options)
// 存储当前插件对象,因为当前是在循环里,所以ChangeColor对象只需要创建一次就够了,这里用jquery的data()方法来存储
var data = $this.data("changeColor");
if (!data) $this.data("changeColor", (data = new ChangeColor($this, settings)));
// 如果传递的string,则可以判断为是要调用对象的某个方法,用data[options]();即可实现调用
if (typeof options == "string") {
data[options]();
} else {
// 如果options是参数对象,则会直接调用change方法
data.change();
}
});
}
// 保存旧的插件属性
var old = $.fn.changeColor;
// 定义插件,并重新设置插件构造
$.fn.changeColor = Plugin;
// 暴露类名,可以通过这个未插件做自定义扩展
$.fn.changeColor.Constructor = ChangeColor;
// 防止冲突处理
$.fn.changeColor.noConflict = function () {
$.fn.changeColor = old;
return this;
}
})(jQuery);
/*
* 让插件例子运行起来吧
*/
$(document).ready(function () {
// 可以传递调用的插件方法名字
$(".demo").changeColor("change");
// 可以传递改变插件的参数
$(".demo1").changeColor({
color: "blue"
})
});
</script>
</head>
<body>
<div class="demo">通过主动调用change()方法改变颜色</div>
<div class="demo1">传递参数改变颜色</div>
</body>
</html>