您的位置:首页 > Web前端 > JQuery

jquery的插件机制

2017-02-07 14:37 267 查看
参考文章: https://mart.coding.net/projects
       http://www.jcodecraeer.com/a/jquery_js_ajaxjishu/2012/0628/290.html

 jQuery.extend()

为了方便用户创建插件,jquery提供了jQuery.extend()和jQuery.fn.extend()方法

1. jQuery.extend() 方法有一个重载。

*jQuery.extend(object) ,一个参数的用于扩展jQuery类本身,增加新的函数或者叫做静态方法

2.重载版本:jQuery.extend([deep], target, object1, [objectN])

用一个或多个其他对象来扩展一个对象,返回被扩展的对象;objectN覆盖objectN-1.....以此类推
最终覆盖 object1.

*这个重载的方法,我们一般用来在编写插件时用自定义插件参数去覆盖插件的默认参数。

jQuery.fn.extend(object)

1.jQuery.fn.extend(object)扩展 jQuery 元素集来提供新的方法(通常用来制作插件)。

问:首先我们来看fn
是什么东西呢?

答:原来
jQuery.fn = jQuery.prototype,也就是jQuery对象的原型。

则:那jQuery.fn.extend()方法就是扩展jQuery对象的原型方法。

      (扩展原型上的方法,就相当于为对象添加”成员方法“;

     
 类的”成员方法“要类的对象才能调用,所以使用jQuery.fn.extend(object)扩展的方法;

jQuery.fn.extend(object)和jQuery.extend(object)方法一定要区分开来)

自执行的匿名函数/闭包

 1. 什么是自执行的匿名函数?     

  它是指形如这样的函数: (function {// code})();

 2. 疑问 为什么(function {// code})();可以被执行, 而function {// code}();却会报错?

 3. 分析     

    (1). 首先, 要清楚两者的区别:     (function {// code})是表达式, function {// code}是函数声明.     

    (2). 其次, js"预编译"的特点:     js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.     

    (3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;     

    当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

   另外, 函数转换为表达式的方法并不一定要靠分组操作符(),我们还可以用void操作符,~操作符,!操作符……

 eg:   

bootstrap 框架中的插件写法:

   !function($){

  //do something;

   }(jQuery);

   和 

   (function($){

  //do something;

   })(jQuery); 是一回事。

*匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。
例如:
     var a=1;
     (function()(){
    var a=100;
  })();
      alert(a); //弹出 1

一步一步的封装jquery插件

1.定一个闭包区域,防止插件"污染"




//闭包限定命名空间
(function ($) {

})(window.jQuery);


2.jQuery.fn.extend(object)扩展jquery 方法,制作插件


//闭包限定命名空间
(function ($) {
$.fn.extend({
"highLight":function(options){
//do something
}
});
})(window.jQuery);


3.给插件默认参数,实现 插件的功能

//闭包限定命名空间
(function ($) {
$.fn.extend({
"highLight": function (options) {
var opts = $.extend({}, defaluts, options); //使用jQuery.extend 覆盖插件默认参数
this.each(function () {  //这里的this 就是 jQuery对象
//遍历所有的要高亮的dom,当调用 highLight()插件的是一个集合的时候。
var $this = $(this); //获取当前dom 的 jQuery对象,这里的this是当前循环的dom
//根据参数来设置 dom的样式
$this.css({
backgroundColor: opts.background,
color: opts.foreground
});
});

}
});
//默认参数
var defaluts = {
foreground: 'red',
background: 'yellow'
};
})(window.jQuery);


*但是我们上面的插件,就不能这样链式调用了。比如:$("p").highLight().css({marginTop:'100px'}); //将会报找不到css方法,原因在与我的自定义插件在完成功能后,没有将
jQuery对象给返回出来。方案:(其实很简单,就是执行完我们插件代码的时候将jQuery对像return 出来,和上面的代码没啥区别)

4.暴露公共方法
给别人来扩展你的插件(如果有需求的话)

5.插件私有方法

6.其他的一些设置,如:为你的插件加入元数据插件的支持将使其变得更强大

all end

完整的高亮插件代码如下:

//闭包限定命名空间
(function ($) {
$.fn.extend({
"highLight": function (options) {
//检测用户传进来的参数是否合法
if (!isValid(options))
return this;
var opts = $.extend({}, defaluts, options); //使用jQuery.extend 覆盖插件默认参数
return this.each(function () {  //这里的this 就是 jQuery对象。这里return 为了支持链式调用
//遍历所有的要高亮的dom,当调用 highLight()插件的是一个集合的时候。
var $this = $(this); //获取当前dom 的 jQuery对象,这里的this是当前循环的dom
//根据参数来设置 dom的样式
$this.css({
backgroundColor: opts.background,
color: opts.foreground
});
//格式化高亮文本
var markup = $this.html();
markup = $.fn.highLight.format(markup);
$this.html(markup);
});

}
});
//默认参数
var defaluts = {
foreground: 'red',
background: 'yellow'
};
//公共的格式化 方法. 默认是加粗,用户可以通过覆盖该方法达到不同的格式化效果。
$.fn.highLight.format = function (str) {
return "<strong>" + str + "</strong>";
}
//私有方法,检测参数是否合法
function isValid(options) {
return !options || (options && typeof options === "object") ? true : false;
}
})(window.jQuery);


//调用
//调用者覆盖 插件暴露的共公方法
$.fn.highLight.format = function (txt) {
return "<em>" + txt + "</em>"
}
$(function () {
$("p").highLight({ foreground: 'orange', background: '#ccc' }); //调用自定义 高亮插件
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: