jQuery插件编写:基础篇(一)

我相信每个使用过jQuery的朋友都会对它强大的魅力所折服。jquery给我们提供了一组跨浏览器的操作DOM的增强API,这使得我们开发拥有丰富功能的Web应用变得更加简单。另外,jQuery也采用了非常棒的插件机制,在增强了jQuery的功能的同时保持了jQuery核心库的体积很小。实际上,拥有众多插件的支持,也是我们使用jQuery的另一个重要原因。也许是为了项目需要,也许是为了自己能一试身手,我们想要自己开发插件。

jQuery给我们提供的操作方法分为两种,一种是工具型的函数,它们都直接添加到$命名空间上,如$.ajax(). $.trim()等等。另一种是jQuery对象上的方法,如:$("#divDemo").width(400)。同样,我们编写的插件也将分为两类:

(1)直接定义在$命名空间上的工具函数

(2)添加到jQuery包装集(jQuery对象)上的方法

在这一篇中,我们将先介绍如何开发第一种插件。

基于js的动态性,我们很容易就能完成一个简单的插件。

 

[javascript] view plain copy print?
  1. $.sayHello = function() {  
  2.     alert("Hello World!");  
  3. }  
  4. $.sayHello(); // alert "Hello World!"  

但是我们有时不能保证$符号一定指代的是jQuery,用户可能使用了$.noConflict()。因此我们要采用一个小技巧来实现。

[javascript] view plain copy print?
  1. (function($) {  
  2.     // 这里还可以添加插件的私有变量  
  3.       
  4.     $.sayHello = function() {  
  5.         alert("Hello World!");  
  6.     }  
  7. })(jQuery);  
  8. $.sayHello();// alert "Hello World!"  

这里的不同之处是我们把插件代码放在了一个即时执行函数中,把jQuery作为参数传递给了函数内部的$变量中,这下我们就可以放心的使用我们心爱的$符号了。而且这种方式还给我们带来了一个惊喜,我们可以在这个匿名函数中定义一些临时变量,来辅助我们开发一些复杂的插件,而不会污染全局变量环境。如下面的例子所示:

[javascript] view plain copy print?
  1. (function($) {  
  2.     // 这里还可以添加插件的私有变量  
  3.     var title = "警告"; // 默认标题  
  4.     var content = "系统运行错误"; // 默认消息内容  
  5.       
  6.     $.sayHello = function(t, c) {  
  7.         var msg = "";  
  8.         if(t) {  
  9.             msg += "TITLE:" + t;  
  10.         } else {  
  11.             msg += "TITLE:" + title; // 用户没指定就选择默认  
  12.         }  
  13.         msg += "\n";  
  14.         if(c) {  
  15.             msg += "CONTENT:" + c;  
  16.         } else {  
  17.             msg += "CONTENT:" + content; // 默认值  
  18.         }  
  19.         alert(msg);  
  20.     }  
  21. })(jQuery);  
  22. $.sayHello(); // alert TITLE:警告(换行)CONTENT:系统运行错误  
  23. $.sayHello("提示","操作成功"); // alert TITLE:提示(换行)CONTENT:操作成功  

这里就有了一个插件的基本原型了,我们给它添加了默认配置值。插件使用者不传任何参数将以默认值来弹出提示,如果传入了参数就以用户传入的参数进行显示。其实我们所定义的title和content都是插件的配置项。有时候一个插件可能包含几十个配置项,这样一个个去判断用户是否传入参数显然不妥。而且按照这种参数列表的形式提供几十项配置更是不可能。这里我们有另外一个技巧可以解决上述问题。用一个普通JS对象作为函数的参数。

[javascript] view plain copy print?
  1. (function($) {  
  2.     var settings = {  
  3.         title : "警告",  
  4.         secondTitle : "系统警告",  
  5.         content : "系统运行错误"  
  6.     };  
  7.     $.sayHello = function(options) {  
  8.         settings = $.extend(settings, options || {}); // options 中的项会依次覆盖setings中的项  
  9.         var msg = "TITLE:" + settings.title + "\n";  
  10.         msg += "SECOND_TITLE:" + settings.secondTitle + "\n";  
  11.         msg += "CONTENT:" + settings.content;  
  12.         alert(msg);  
  13.     }  
  14. })(jQuery);  
  15. $.sayHello({  
  16.     title:"First",  
  17.     secondTitle:"Scond",  
  18.     content:"Hello"  
  19. }); // 按照这种方式去调用插件,里面的title,secondTitle, content 都是可选的  

这种方式是目前比较常用的插件开发模式。采用一个options对象作为插件函数的参数,便可以提供大量可选的参数配置。而在插件内部使用一个settings对象来列出所有的默认配置值。再借助神奇的$.extend()函数,我们可以很方便的使用options来覆盖Settings中的默认值。关于$.extend()简单举一个例子,比如:

[javascript] view plain copy print?
  1. var settings = {  
  2.     name : "Jim",  
  3.     sex : "Boy"  
  4. }  
  5. var options = {  
  6.     name : "Lucy"  
  7. }  
  8. settings = $.extend(settings, options || {});  
  9. 执行完成后,Settings = {name : "Lucy", sex : "Boy"}  

另外第二个参数采用options || {} 是为了防止options未定义,就用空对象{}去覆盖。$.extend()函数还有其他的一些用法,可以查阅相关文档。

下面给出编写第一类插件(实用函数)的基本框架结构:

[javascript] view plain copy print?
  1. (function($) {  
  2.     var settings = {  
  3.         def1 : "def1",  
  4.         def2 : "def2",  
  5.         //... 更多默认配置  
  6.     };  
  7.     $.myPlugin = function(options) {  
  8.         settings = $.extend(settings, options || {}); // 合并默认和用户配置  
  9.           
  10.         // 这里写你的插件逻辑  
  11.     }  
  12. })(jQuery); 
posted @ 2017-07-17 15:41  SKYisLimit  阅读(88)  评论(0)    收藏  举报