第8章 高效開發和使用外掛 (二)
8.1.8 封裝 jQuery 外掛
上面幾節就 jQuery 外掛的建立方法進行了詳細講解,一般對外發布的自定義外掛都應該進行封裝,封裝的外掛還應該符合規範,只有這樣所建立的外掛才具有推廣價值,並得到其他使用者的喜愛。
封裝 jQuery 外掛的第一步是定義一個獨立域,程式碼如下所示。
- <scripttype="text/javascript">
- (function($){
- //自定義外掛程式碼
- })(jQuery);//封裝外掛
- </script>
確定建立外掛型別,選擇建立方式。例如,建立一個設定元素字型顏色的外掛,則應該建立 jQuery 物件方法。考慮到 jQuery 提供了外掛擴充套件方法 extend() ,呼叫該方法定義外掛會更為規範。程式碼如下。
- (function($){
- $.extend($.fn,{//jQuery物件方法擴充套件
- //函式列表
- });
- })(jQuery);//封裝外掛
- (function($){
- $.extend($.fn,{//jQuery物件方法擴充套件
- color:function(options){//自定義外掛名稱
- varoptions=$.extend({//引數選項物件處理
- bcolor:"white",//背景色預設值
- fcolor:"black"//前景色預設值
- },options);
- //函式體
- }
- });
- })(jQuery);//封裝外掛
- (function($){
- $.extend($.fn,{//jQuery物件方法擴充套件
- color:function(options){//自定義外掛名稱
- varoptions=$.extend({//引數選項物件處理
- bcolor:"white",//背景色預設值
- fcolor:"black"//前景色預設值
- },options);
- returnthis.each(function(){//返回匹配的jQuery物件
- $(this).css("color",options.fcolor);//遍歷設定每個DOM元素的字型顏色
- $(this).css("backgroundColor",options.bcolor);//遍歷設定每個DOM元素的背景色
- });
- }
- });
- })(jQuery);//封裝外掛
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){//自定義外掛名稱
- varoptions=$.extend({//引數選項物件處理
- bcolor:"white",//背景色預設值
- fcolor:"black"//前景色預設值
- },options);
- returnthis.each(function(){//返回匹配的jQuery物件
- $(this).css("color",options.fcolor);//遍歷設定每個DOM元素的字型顏色
- $(this).css("backgroundColor",options.bcolor);//遍歷設定每個DOM元素的背景顏色
- });
- }
- });
- })(jQuery);//封裝外掛
- $(function(){//頁面初始化
- $("h1").color({//設定標題的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- });
- });
- </script>
- </head>
- <body>
- <h1>標題文字</h1>
8.1.9 優化 jQuery 外掛 -- 開放公共引數
優秀的 jQuery 外掛,應該以開放性的姿態滿足不同個性化的設計要求,同時還應該做好封閉性,避免外界有意或無意的破壞。
首先,可以考慮開發外掛的預設設定,這對於外掛使用者來說,會更容易使用較少的程式碼覆蓋和修改外掛。
繼續以上面的程式碼為例進行說明,把其中的引數預設值作為 $.fn.color 物件的屬性單獨進行設計,然後藉助 jQuery.extend() 方法覆蓋原來引數選項即可。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);
- returnthis.each(function(){//返回匹配的jQuery物件
- $(this).css("color",options.fcolor);//遍歷設定每個DOM元素的字型顏色
- $(this).css("backgroundColor",options.bcolor);//遍歷設定每個DOM元素的背景顏色
- });
- }
- });
- $.fn.color.defaults={//獨立設定$.fn.color物件的預設引數值
- bcolor:"white",
- fcolor:"black"
- };
- })(jQuery);//封裝外掛
- $(function(){//頁面初始化
- $("h1").color({//設定標題的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- });
- });
- </script>
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);
- returnthis.each(function(){//返回匹配的jQuery物件
- $(this).css("color",options.fcolor);//遍歷設定每個DOM元素的字型顏色
- $(this).css("backgroundColor",options.bcolor);//遍歷設定每個DOM元素的背景顏色
- });
- }
- });
- $.fn.color.defaults={//獨立設定$.fn.color物件的預設引數值
- bcolor:"white",
- fcolor:"black"
- };
- })(jQuery);//封裝外掛
- $(function(){//頁面初始化
- $.fn.color.defaults={//預設預設的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $("h1").color();
- $("p").color({bcolor:"#fff"});//為段落文字設定預設色,同時覆蓋背景色為白色
- $("div").color();//為盒子設定預設色
- });
- </script>
- </head>
- <body>
- <h1>標題文字</h1>
- <p>段落文字</p>
- <div>盒子</div>
- </body>
8.1.10 優化jQuery外掛 -- 開放部分功能
用過 Cycle 外掛外掛的讀者可能會知道,它是一個滑動顯示外掛,支援很多內部變換功能,如滾動、滑動和漸變消失等。實際上,在封裝外掛時,我們無法把所有功能都封裝進去,也沒有辦法定義滑動變化上每一種型別的變化效果。但是 Cycle 外掛通過開放部分功能,允許使用者重寫 transitions 物件,這樣就可以新增自定義變化效果,從而使該外掛滿足不同使用者的不同需求。
Cycle 外掛是這樣開放部分功能的,程式碼如下。
- $.fn.cycle.transitions={
- //擴充套件方法
- };
例如,繼續以上一節的示例為基礎,我們為其新增一個格式化的擴充套件功能,這樣使用者在設定顏色的同時,還可以根據需要適當進行格式化功能設計,如加粗、斜體、放大等功能操作。擴充套件的 color() 外掛程式碼如下所示。
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);//覆蓋原來引數
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//獲取當前元素包含的HTML字串
- _html=$.fn.color.format(_html);//呼叫格式化功能函式對其進行格式化
- $(this).html(_html);//使用格式化的HTML字串重寫當前元素內容
- });
- }
- });
- $.fn.color.defaults={//獨立設定$.fn.color物件的預設引數值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//開放的功能函式
- returnstr;
- }
- })(jQuery);//封裝外掛
例如,下面的示例呼叫了 color() 外掛,同時在呼叫時分別擴充套件了它的格式化功能。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);//覆蓋原來引數
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//獲取當前元素包含的HTML字串
- _html=$.fn.color.format(_html);//呼叫格式化功能函式對其進行格式化
- $(this).html(_html);//使用格式化的HTML字串重寫當前元素內容
- });
- }
- });
- $.fn.color.defaults={//獨立設定$.fn.color物件的預設引數值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//開放的功能函式
- returnstr;
- }
- })(jQuery);//封裝外掛
- $(function(){//頁面初始化
- $.fn.color.defaults={//預設預設的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $.fn.color.format=function(str){//擴充套件color()外掛的功能,使內部文字加粗顯示
- return"<strong>"+str+"</strong>";
- };
- $("h1").color();
- $("p").color({bcolor:"#fff"});//為段落文字設定預設色,同時覆蓋背景色為白色
- $.fn.color.format=function(str){//擴充套件color()外掛的功能,使內部文字放大顯示
- return"<spanstyle='font-size:30px;'>"+str+"</span>";
- };
- $("div").color();//為盒子設定預設色
- });
- </script>
- </head>
- <body>
- <h1>標題文字</h1>
- <p>段落文字</p>
- <div>盒子</div>
- </body>
8.1.11 優化 jQuery 外掛 -- 保留外掛隱私
優秀的外掛,不僅僅要追求開放性,還應該留意外掛的隱私性,對於不該暴露的部分,如果不注意保護,很容易被外界入侵,從而破壞外掛的功能。因此,在設計外掛時必須考慮外掛實現中不應該暴露的部分。一旦被暴露,就需要銘記任何對於引數或者語義的改動也許會破壞向後的相容性。如果不能確定不應該暴露的特定函式,那麼就必須考慮如何進行保護的問題。
若外掛包含很多函式,在設計時我們希望這麼多函式不攪亂名稱空間,也不會被完全暴露,惟一的方法就是使用閉包。為了建立閉包,可以將整個外掛封裝在一個函式中。
繼續以上節示例進行講解,為了驗證使用者在呼叫 color() 方法時所傳遞的引數是否合法,我們不妨在外掛中定義一個引數驗證函式,但是該驗證函式是不允許外界侵入或者訪問的,此時我們可以藉助閉包把它隱藏起來,只允許在外掛內部進行訪問。實現的程式碼如下。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){
- if(!filter(options))//呼叫隱私方法驗證引數,不合法則返回
- returnthis;
- varoptions=$.extend({},$.fn.color.defaults,options);//覆蓋原來引數
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//獲取當前元素包含的HTML字串
- _html=$.fn.color.format(_html);//呼叫格式化功能函式對其進行格式化
- $(this).html(_html);//使用格式化的HTML字串重寫當前元素內容
- });
- }
- });
- $.fn.color.defaults={//獨立設定$.fn.color物件的預設引數值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//開放的功能函式
- returnstr;
- }
- functionfilter(options){//定義隱私函式,外界無法訪問
- //如果引數不存在,或者存在且為物件,則返回true,否則返回false
- return!options||(options&&typeofoptions==="object")?true:false;
- }
- })(jQuery);//封裝外掛
- $(function(){//頁面初始化
- $.fn.color.defaults={//預設預設的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $.fn.color.format=function(str){//擴充套件color()外掛的功能,使內部文字加粗顯示
- return"<strong>"+str+"</strong>";
- };
- $("h1").color();
- $("p").color({bcolor:"#fff"});//為段落文字設定預設色,同時覆蓋背景色為白色
- $.fn.color.format=function(str){//擴充套件color()外掛的功能,使內部文字放大顯示
- return"<spanstyle='font-size:30px;'>"+str+"</span>";
- };
- $("div").color();//為盒子設定預設色
- });
- </script>
- </head>
- <body>
- <h1>標題文字</h1>
- <p>段落文字</p>
- <div>盒子</div>
- </body>
- $(function(){
- $("p").color("#fff");
- });
8.1.12 優化 jQuery 外掛 -- 非破壞性操作
在特定情況下,jQuery 物件方法可能會修改 jQuery 物件匹配的 DOM 元素,這時就有可能破壞方法返回值的一致性。為了遵循 jQuery 框架的核心設計理念,我們應該時刻警惕任何修改 jQuery 物件的操作。
例如,定義一個 jQuery 物件方法 parent() ,用來獲取 jQuery 匹配的所有 DOM 元素的父元素。實現程式碼如下。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- parent:function(){//擴充套件jQuery物件方法,獲取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍歷匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入臨時陣列
- });
- arr=$.unique(arr);//在臨時陣列中過濾重複的元素
- returnthis.setArray(arr);//把變數arr打包為陣列型別返回
- }
- });
- })(jQuery);//封裝外掛
- </script>
下面我們就用這個新方法為所有 p 元素的父元素新增一個邊框,示例程式碼如下所示。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- parent:function(){//擴充套件jQuery物件方法,獲取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍歷匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入臨時陣列
- });
- arr=$.unique(arr);//在臨時陣列中過濾重複的元素
- returnthis.setArray(arr);//把變數arr打包為陣列型別返回
- }
- });
- })(jQuery);//封裝外掛
- $(function(){
- var$p=$("p");//獲取所有p元素,並儲存到變數$p中
- $p.parent().css("border","solid1pxred");//呼叫parent()方法獲取p元素的父元素,並設定它們的邊框樣式
- });
- </script>
- </head>
- <body>
- <divstyle="width:400px;height:200px;">大盒子
- <p>段落文字1</p>
- <divstyle="width:200px;height:100px;">小盒子
- <p>段落文字2</p>
- </div>
- </div>
- </body>
- $(function(){
- var$p=$("p");//獲取所有p元素,並儲存到變數$p中
- $p.parent().css("border","solid1pxred");//呼叫parent()方法獲取p元素的父元素,並設定它們的邊框樣式
- $p.hide();//隱藏所有p元素,即當前jQuery物件
- });
上面示例僅僅是破壞性操作的一種表現,如果要避免此類隱性修改 jQuery 物件的行為,建議採用非破壞性操作。例如,在本例中我們可以使用 pushStack() 方法建立一個新的 jQuery 物件,而不是修改 this 所引用的 jQuery 物件,這樣可以避免破壞性操作行為,同時 pushStack() 方法還允許呼叫 end() 方法操作新建立的 jQuery 物件方法。把上面的示例的 jQuery 物件方法進行優化,程式碼如下所示。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- parent:function(options){//擴充套件jQuery物件方法,獲取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍歷匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入臨時陣列
- });
- arr=$.unique(arr);//在臨時陣列中過濾重複的元素
- returnthis.pushStack(arr);//返回新建立的jQuery物件,而不是修改後的當前jQuery物件
- }
- });
- })(jQuery);//封裝外掛
- $(function(){
- var$p=$("p");//獲取所有p元素,並儲存到變數$p中
- $p.parent().css("border","solid1pxred");//呼叫parent()方法獲取p元素的父元素,並設定它們的邊框樣式
- $p.hide();//隱藏所有p元素,即當前jQuery物件
- });
- </script>
- </head>
- <body>
- <divstyle="width:400px;height:200px;">大盒子
- <p>段落文字1</p>
- <divstyle="width:200px;height:100px;">小盒子
- <p>段落文字2</p>
- </div>
- </div>
- </body>
針對上面的程式碼,我們就可以採用連續行為進行編寫了,程式碼如下所示。
- $(function(){
- var$p=$("p");//獲取所有p元素,並儲存到變數$p中
- $p.parent().css("border","solid1pxred").end().hide();
- });
相關文章
- 第8章 高效開發和使用外掛 (一)
- 第8章 高效開發和使用外掛 (三)
- 小程式外掛的開發和使用
- Java高效開發-常用idea外掛JavaIdea
- Vue如何使用混合Mixins和外掛開發Vue
- 使用pgrx開發postgre外掛
- VS Code外掛開發介紹(二)
- 「jQuery外掛開發日記」(二)高階外掛理念 – [翻譯]jQuery
- Eclipse外掛開發(原書第3版)Eclipse
- 用於前端開發的十種高效Chrome外掛前端Chrome
- 使用 Java 開發 Gradle 外掛JavaGradle
- 使用Python開發Chrome外掛PythonChrome
- 從頭開發一個Flutter外掛(二)高德地圖定位外掛Flutter地圖
- Grafana的Datasource外掛開發實踐二Grafana
- 手把手教你開發jquery外掛(二)jQuery
- 【開發指南】(二)Ionic3開發工具外掛推薦
- VSCode 必裝的 10 個高效開發外掛VSCode
- 高效率開發的Android Studio外掛收集Android
- 使用React.js開發Chrome外掛ReactJSChrome
- Flutter外掛開發Flutter
- Mybatis外掛開發MyBatis
- Webstorm 外掛開發WebORM
- flutter 外掛開發Flutter
- 開發Rhino外掛
- chrome 外掛開發Chrome
- jQuery外掛:jqGrid使用(二)jQuery
- SDK 開發使用 VirtualAPK 實現外掛化APK
- VSCode外掛開發全攻略(二)HelloWordVSCode
- aspnetcore外掛開發dll熱載入 二NetCore
- apisix~lua外掛開發與外掛註冊API
- HtmlWebpackPlugin外掛和HtmlWebpackInlineSourcePlugin外掛的使用HTMLWebPlugininline
- 二、外掛
- [外掛推薦] 使用 PHPStorm 中的 Laravel Plugin 外掛提升開發效率PHPORMLaravelPlugin
- fastclick外掛的使用--移動端vue專案開發(vue常用外掛)ASTVue
- babel 外掛開發案例Babel
- Maven外掛開發教程Maven
- Chrome外掛開發教程Chrome
- Stylus外掛開發教程