摘要:的編寫并沒有想象中的難,下面通過編寫一個擁有屬性和一些回調(diào)函數(shù)的簡單插件介紹下如何編寫。
在當(dāng)前這個前端mv**框架盛行的年代,翻譯這樣一篇關(guān)于如何編寫jquery插件的文章好像顯得有點多余和那么的不接時代,不過還是自私點,努力翻譯一把起碼可以提高自己(<_>)。
jquery非常棒,它兼容性好,入門簡單,讓我們在處理終端交互的時候來的輕而易舉,同時他還有非常龐大的插件庫,幾乎你能想到的功能都能找到對應(yīng)的插件。
但是,我們的業(yè)務(wù)需求是千變?nèi)f化的,萬一我們需要的功能找不到或者說找不到非常合適的插件的時候,我們該怎么辦?或者當(dāng)項目漸漸龐大起來的時候,你想把通用的功能封裝起來的時候,我們該怎么辦(這個時候請你假裝忘記:amd,cmd,es6module)?按照jquery的思路,這個時候就可以通過自定義插件來解決了。
jquery plugin的編寫并沒有想象中的難,下面通過編寫一個擁有屬性和一些回調(diào)函數(shù)的簡單插件介紹下如何編寫jquery plugin。
創(chuàng)建文件目錄# 準備基本環(huán)境 mkdir jquery-plugin-sample cd jquery-plugin-sample mkdir src cd src echo "" > index.js # 文件結(jié)構(gòu)如下 . ├── LICENSE ├── src │?? └── index.js # 這文件就是用來編寫插件具體內(nèi)容插件的代碼結(jié)構(gòu)
;(function($){ $.fn.helloWorld = function(){ //Future home of "Hello, World!" } })(jQuery)
上面的代碼干了3件事情
代碼被封裝在一個 (function(){}) self-enclosed 中,這樣保證了內(nèi)部變量不會和全局環(huán)境相互影響
我們將jQuery作為參數(shù)傳遞給了內(nèi)部函數(shù),這樣做的目的是避免和其他庫也聲明了 $相互沖突
我們通過$.fn定義了我們的插件,并且命名為helloWorld
在插件中實線一些功能在編寫功能之前,先基于webpack構(gòu)建一個本地調(diào)試環(huán)境 本地環(huán)境構(gòu)建
// src/index.js ;(function($){ $.fn.helloWorld = function(){ this.each(function(){ //1 $(this).text("Hello World")//2 }) } })(jQuery);
上面的代碼需要注意2個地方
1處的this代表就是jqueryDom 對象對象本身,因此不需要 $(this)來進行轉(zhuǎn)換
2處的this由于遍歷時候的回調(diào)中的this指向dom本身,因此需要$(this)轉(zhuǎn)換為jquery對象
// 測試插件功能 // demo/demo.js import $ from "jquery"; import "../src"; $(document).ready(()=>{ // 找到頁面的dom $(".demo-wrap li").helloWorld(); })
此時,對應(yīng)的瀏覽器頁面應(yīng)該會出現(xiàn)如圖一樣的結(jié)果,OK,一個非常簡單的插件構(gòu)建完成,該插件的功能就是將選中的dom的text 替換為Hello World, 這個插件合格嗎?
我們都知道jquery還有一個非常好的特性,就是api支持鏈式調(diào)用$("div").text("hell").addClass("red");那么我們自己寫的插件是否滿足這個特性呢?通過測試代碼很明顯,這個helloWorld插件不滿足這個特性,因此不是一個合格的插件,需要稍微處理下才能滿足
// 修改 src/index.js ;(function($){ $.fn.helloWorld = function(){ return this.each(function(){ $(this).text("Hello World") }) } })(jQuery);
OK,到這里為止,一個jquery插件才算真正到完成。
擴展插件,讓插件可以接收參數(shù);(function($){ $.fn.helloWorld = function(customText){ return this.each(function(){ $(this).text(customText) }) } })(jQuery);
OK,現(xiàn)在可以將選中到dom到內(nèi)容修改為你傳入到任何東西了
終極插件雖然上面我們擴展了插件,可以滿足根據(jù)輸入到內(nèi)容修改匹配到dom的內(nèi)容,但是如果需要樣式呢?需要修改字體大小呢?需要添加回調(diào)函數(shù)呢?所以,參數(shù)必須是個對象的形式,Ok,立馬修改代碼
;(function($){ $.fn.helloWorld = function(options){ var settings = $.extend({ text:"Hello World", color:null, fontStyle:null, complete:null },options) return this.each(function(){ $(this).text(settings.text); if(settings.color){ $(this).css( "color", settings.color ); } if(settings.fontStyle){ $(this).css( "font-style", settings.fontStyle ); } if ( $.isFunction( settings.complete ) ) { settings.complete.call( this ); } }) } })(jQuery);
// 測試代碼 demo/demo.js import $ from "jquery"; import "../src"; $(document).ready(()=>{ // 找到頁面的dom $(".demo-wrap li").helloWorld({ color:"red", complete:()=>{ console.log("sds") } }).addClass(); })總結(jié)
靈活封裝jquery插件,不但可以抽取公用代碼同時可以很好的保證全局環(huán)境的干凈。另外,這篇文字雖然是翻譯的文字,不過demo是自己手寫的,有需要的可以去github上下載 jquery-plugin-sample,也可以通過 npm install xxw-jquery-plugin-sample 來測試代碼
本地環(huán)境構(gòu)建cd jquery-plugin-sample npm init -y yarn add webpack webpack-dev-server babel-core babel babel-preset-env html-webpack-plugin babel-loader -D mkdir demo cd demo echo "" > index.ejs echo "" > demo.js # 文件結(jié)構(gòu)如下 . ├── LICENSE ├── demo │?? ├── demo.js │?? └── index.ejs ├── package.json ├── readme.md ├── src │?? └── index.js └── yarn.lock
// 編寫webpack.config.js const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const babel_options ={ presets:[ ["env",{ "targets": { "browsers": ["last 4 versions", "safari >= 7"] } }] ] } module.exports = { entry:"./demo/demo.js", output:{ path:path.resolve(__dirname,"./dist"), filename:"index.js" }, module:{ rules:[ // es6 語法解析 { test:/.js$/, exclude: /(node_modules|bower_components)/, use:[ { loader:"babel-loader", options:babel_options } ] } ] }, plugins:[ new HtmlWebpackPlugin({ template:"./demo/index.ejs", filename:"index.html" }) ], externals: { "jquery": "jQuery" }, devServer: { host: "127.0.0.1", port: 3000 } };
// 編寫ejs,添加jquery cdntest jquery pllugin
# 啟動項目 yarn webpack-dev-server Project is running at http://127.0.0.1:3000/ webpack output is served from / Hash: 137d7a562cabec2c7996 Version: webpack 3.10.0 Time: 1053ms Asset Size Chunks Chunk Names index.js 324 kB 0 [emitted] [big] main index.html 266 bytes [emitted]
在瀏覽器中輸入 http://127.0.0.1:3000/ 訪問測試頁面
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90618.html
摘要:前端知識點總結(jié)什么是第三方的極簡化的操作的函數(shù)庫第三方下載極簡化是操作的終極簡化個方面增刪改查事件綁定動畫效果操作學(xué)習(xí)還是在學(xué),只不過簡化了函數(shù)庫中都是函數(shù),用函數(shù)來解決一切問題為什么使用操作的終極簡化解決了大部分瀏覽器兼容性問題凡是讓用的 前端知識點總結(jié)——JQ 1.什么是jQuery: jQuery: 第三方的極簡化的DOM操作的函數(shù)庫 第三方: 下載 極簡化: 是DOM操作的...
摘要:所以要先了解一下插件的三種開發(fā)方式通過來擴展通過向添加新的方法通過應(yīng)用的部件工廠方式創(chuàng)建第三種方法是用來開發(fā)更高級的部件的。 jQuery插件開發(fā)模式 說到j(luò)Query插件的編寫,起初我把它當(dāng)做封裝一個方法那樣簡單,這顯然是錯的,因為這讓我一開始完全不知道如何下手去編寫一個插件。所以要先了解一下jQuery插件的三種開發(fā)方式: 通過$.extend()來擴展jQuery 通過$.fn...
摘要:示例合并和,修改并返回。例如我們插件里面需要有個方法來檢測用戶調(diào)用插件時傳入的參數(shù)是否符合規(guī)范。私有方法,檢測參數(shù)是否合法調(diào)用調(diào)用調(diào)用者覆蓋插件暴露的共公方法調(diào)用自定義高亮插件 本文實例講述了jQuery插件編寫步驟。分享給大家供大家參考,具體如下: 如今做web開發(fā),jquery 幾乎是必不可少的,就連vs神器在2010版本開始將Jquery 及ui 內(nèi)置web項目里了。至于使用jq...
摘要:本教程可能不是最精品的,但一定是最細致的。插件開發(fā)下面我們就來看第二種方式的插件開發(fā)。然后我們的插件代碼在這個方法里面展開。 要說jQuery 最成功的地方,我認為是它的可擴展性吸引了眾多開發(fā)者為其開發(fā)插件,從而建立起了一個生態(tài)系統(tǒng)。這好比大公司們爭相做平臺一樣,得平臺者得天下。蘋果,微軟,谷歌等巨頭,都有各自的平臺及生態(tài)圈。 學(xué)會使用jQuery并不難,因為它簡單易學(xué),并且相信你接觸...
jQuery 實現(xiàn)Ajax應(yīng)用 使用load()方法異步請求數(shù)據(jù) 使用load()方法通過Ajax請求加載服務(wù)器中的數(shù)據(jù),并把返回的數(shù)據(jù)放置到指定的元素中,它的調(diào)用格式為: load(url,[data],[callback]) 參數(shù)url為加載服務(wù)器地址,可選項data參數(shù)為請求時發(fā)送的數(shù)據(jù),callback參數(shù)為數(shù)據(jù)請求成功后,執(zhí)行的回調(diào)函數(shù) 使用getJSON()方法異步加載JSON格式數(shù)...
閱讀 1278·2021-09-22 15:18
閱讀 2607·2021-09-22 15:17
閱讀 2231·2019-08-30 15:55
閱讀 1576·2019-08-30 15:54
閱讀 1049·2019-08-30 13:12
閱讀 628·2019-08-30 13:12
閱讀 1681·2019-08-29 11:33
閱讀 1443·2019-08-26 17:04