為什么要把js功能封裝成插件呢?我覺得有以下幾點吧
1、最基本的原因就是便於代碼復用。
2、便於維護和管理。
3、提升自身的能力。
4、避免各個相同功能組件的干擾,以及一些作用域會相互影響的問題。
jq的標准封裝方式
<script type="text/javascript"> (function ($) { //這里放入插件代碼 })(jQuery); </script>
這是jQuery官方的插件開發規范,這樣寫是作用是:
1. 避免全局依賴。
2. 避免第三方破壞。
3. 兼容jQuery操作符’$’和’jQuery’
這段代碼在被解析時會形同如下代碼:
var jq = function($) { // Code goes here }; jq(jQuery);
然后傳參怎么搞呢,我們一個插件一般有一些必選參數或者可選參數,在我看來可選參數不過就是在插件里面給了默認值罷了。我們傳的參數會覆蓋插件中的默認參數,可以用$.extend({})覆蓋
例如:
$(function ($) { $.fn.getMsg = function (options) { var defaults = { Event : "click", msg : "點擊了插件!" //顯示內容 } var options = $.extend(defaults, options);//繼承默認參數 var $this = $(this); //當然響應事件對象 //綁定事件 $this.on(options.Event, function (e) { alert(options.msg); }); } });
調用方法
$(function () { //綁定元素事件 $("#test").插件名稱({ Event : "click", //觸發響應事件會覆蓋上面defaults里面的Event msg : "插件!" //顯示內容 }); });
html
<button id = "test" >插件調用</button >
知識擴展
官方提供兩個開發插件的方法:
- $.extend(object);為擴展jQuery類本身.為類添加新的方法。
- $.fn.extend(object);給jQuery對象添加方法。
$.extend(object):可以理解為靜態方法,不需要使用到頁面的dom元素,直接使用($.插件名(參數))就可以調用
為jQuery類添加類方法,可以理解為添加靜態方法。如$.ajiax也是一個靜態方法,$.extend(object)相當於新增一個類似$.ajax這樣的靜態方法:
jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; } }); jQuery.min(2,3); // 2 jQuery.max(4,5); // 5
$.fn.extend(object):($.fn =$.prototype.)對jQuery.prototype進得擴展,就是為jQuery類添加“成員函數”。jQuery類的實例可以使用這個“成員函數”。
(function( $ ){ $.fn.tooltip = function( options ) { //內容 }; //等價於 var tooltip = { function(options){ } }; $.fn.extend(tooltip) = $.prototype.extend(tooltip) = $.fn.tooltip })( jQuery );
比如我們要開發一個插件,做一個特殊的編輯框,當它被點擊時,便alert當前編輯框里的內容。可以這么做:
$.fn.extend({ alertWhileClick:function() { $(this).click(function(){ alert($(this).val()); }); } }); $("#input1").alertWhileClick(); // 頁面上