日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

基于原生JS封裝的Modal對話框插件的示例代碼

瀏覽:246日期:2024-04-21 09:39:22

基于原生JS封裝Modal對話框插件,具體內容如下所示:

原生JS封裝Modal對話框插件,個人用來學習原理與思想,只有簡單的基本框架的實現,可在此基礎上添加更多配置項

API配置

//基本語法 let modal = ModalPlugin({ //提示的標題信息 title:’系統提示’, //內容模板 字符串 /模板字符串/DOM元素對象 template:null, //自定義按鈕信息 buttons:[{ //按鈕文字 text:’確定’, click(){//this:當前實例 } }] }) modal.open()//=>打開 modal.close()//=>關閉//基于發布訂閱,實現回調函數的監聽 modal.on(’input/open/close/dragstart/dragmove/dragend’,[func])modal.fire(...) modal.off(...)

Modal插件核心功能的開發

導出

(function () { function ModalPlugin() { return } // 瀏覽器直接導入,這樣的方法是暴露到全局的 window.ModalPlugin = ModalPlugin; //如果還需要支持ES6Module/CommonJS模塊導入規范,在react項目當中,vue項目當中也想用 if (typeof module !== ’undefined’ && module.exports !== ’undefined’) {//如果module不存在,typeof不會出錯,會返回undefined module.exports = ModalPlugin;//CommonJS規范,只有在webpack環境下才支持 }})()

使用對象和函數創建實例

想使用創建對象的方式new ModalPlugin()創建實例或當做普通函數執行ModalPlugin(),創建實例,需要這樣做

(function () { function ModalPlugin() { return new init() }//想使用創建對象的方式`new ModalPlugin()`創建實例或當做普通函數執行`ModalPlugin()`,創建實例,需要這樣做 //類的原型: 公共的屬性方法 ModalPlugin.prototype = { constructor: ModalPlugin } function init() {} init.prototype = ModalPlugin.prototype; // 瀏覽器直接導入,這樣的方法是暴露到全局的 window.ModalPlugin = ModalPlugin; //如果還需要支持ES6Module/CommonJS模塊導入規范,在react項目當中,vue項目當中也想用 if (typeof module !== ’undefined’ && module.exports !== ’undefined’) {//如果module不存在,typeof不會出錯,會返回undefined module.exports = ModalPlugin;//CommonJS規范,只有在webpack環境下才支持 }})()

配置項

//封裝插件的時候,需要支持很多配置項,有的配置項不傳遞有默認值,此時我們千萬不要一個個定義形參,用對象的方式傳形參,好處是可以不傳,而且可以不用考慮順序 function ModalPlugin(options) { return new init(options) }//想使用創建對象的方式創建實例new ModalPlugin()或當做普通函數執行也能創建實例ModalPlugin(),需要這樣做 ModalPlugin.prototype = { constructor: ModalPlugin } function init(options) { //接下來將所有的操作全部寫在init里面 //參數初始化:傳遞進來的配置項替換默認的配置項 options = Object.assign({ title:’系統提示’, template:null, frag:true, buttons:[{text:’確定’,click(){} }] },options) }

命令模式init()執行邏輯

基于原生JS封裝的Modal對話框插件的示例代碼

創建DOM

//創建DOM結構 creatDom(){ //如果用creatElement插入DOM,每一次動態插入,都會導致DOM的回流,非常消耗性能,所以最外面使用createElement創建,內部使用字符串的方式拼寫進去,創建好了之后放到最外層的容器當中,只引起一次回流 let frag = document.createDocumentFragment() let dpnDialog = document.createElement(’div’) dpnDialog.className = ’dpn-dialog’ dpnDialog.innerHTML = ` <div class='dpn-title'>系統溫馨提示<i class='dpn-close'></i> </div> <div class='dpn-content'> </div> <div class='dpn-handle'><button>確定</button><button>取消</button> </div>` frag.appendChild(dpnDialog) let dpnModel = document.createElement(’div’) dpnModel.className = ’dpn-model’ frag.appendChild(dpnModel) document.body.appendChild(frag)//使用frag只需要往頁面中插入一次,減少回流次數 frag = null this.dpnDialog = dpnDialog//掛載到實例上,便于其他方法的控制隱藏,并且是私有的實例, this.dpnModel = dpnModel }

對參數進行處理

基于原生JS封裝的Modal對話框插件的示例代碼

creatDom() { let {title, template, buttons} = this.options //如果用creatElement插入DOM,每一次動態插入,都會導致DOM的回流,非常消耗性能,所以最外面使用createElement創建,內部使用字符串的方式拼寫進去,創建好了之后放到最外層的容器當中,只引起一次回流 let frag = document.createDocumentFragment() let dpnDialog = document.createElement(’div’) dpnDialog.className = ’dpn-dialog’ dpnDialog.innerHTML = ` <div class='dpn-title'>${title}<i class='dpn-close'>X</i> </div> <div class='dpn-content'>${template && typeof template === ’object’ && template.nodeType === 1? template.outerHTML: template} </div> ${buttons.length > 0? `<div class='dpn-handle'> ${buttons.map((item, index) => { return `<button index='${index}'>${item.text}</button>`}).join(’’)} </div>`: ’’ } ` frag.appendChild(dpnDialog) let dpnModel = document.createElement(’div’) dpnModel.className = ’dpn-model’ frag.appendChild(dpnModel) document.body.appendChild(frag)//使用frag只需要往頁面中插入一次,減少回流次數 frag = null this.dpnDialog = dpnDialog//掛載到實例上,便于其他方法的控制隱藏,并且是私有的實例, this.dpnModel = dpnModel },

控制隱藏與顯示

//控制他顯示 open() { this.dpnDialog.style.display = ’block’ this.dpnModel.style.display = ’block’ }, //控制隱藏 close() { this.dpnDialog.style.display = ’none’ this.dpnModel.style.display = ’none’ }

基于事件委托處理點擊事件

基于原生JS封裝的Modal對話框插件的示例代碼

init() { this.creatDom() //基于事件委托,實現點擊事件的處理 this.dpnDialog.addEventListener(’click’, (ev)=>{let target = ev.target, {tagName,className}= targetconsole.log([target])//點擊的關閉按鈕if(tagName===’I’&&className.includes(’dpn-close’)){ this.close() return}//點擊的是底部按鈕if(tagName===’BUTTON’ && target.parentNode.className.includes(’dpn-handle’)){ let index = target.getAttribute(’index’) //讓傳過來的函數執行,并且函數中的this還必須是當前實例 let func = this.options.buttons[index][’click’] if(typeof func===’function’){ func.call(this) } return} }) },

基于發布訂閱實現回調函數的監聽(生命周期)

基于原生JS封裝的Modal對話框插件的示例代碼

基于原生JS封裝的Modal對話框插件的示例代碼基于原生JS封裝的Modal對話框插件的示例代碼

//使用:基于原生JS封裝的Modal對話框插件的示例代碼基于原生JS封裝的Modal對話框插件的示例代碼

完整代碼

//modalplugin.js(function () { //封裝插件的時候,需要支持很多配置項,有的配置項不傳遞有默認值,此時我們千萬不要一個個定義形參,用對象的方式傳形參,好處是可以不穿,而且可以不用考慮順序 function ModalPlugin(options) { return new init(options) }//想使用創建對象的方式創建實例new ModalPlugin()或當做普通函數執行也能創建實例ModalPlugin(),需要這樣做 ModalPlugin.prototype = { constructor: ModalPlugin, //相當于大腦,可以控制先干什么在干什么(命令模式) init() { //創建DOM結構 this.creatDom() //基于事件委托,實現點擊事件的處理 this.dpnDialog.addEventListener(’click’, (ev) => {let target = ev.target, {tagName, className} = target//點擊的關閉按鈕if (tagName === ’I’ && className.includes(’dpn-close’)) { this.close() return}//點擊的是底部按鈕if (tagName === ’BUTTON’ && target.parentNode.className.includes(’dpn-handle’)) { let index = target.getAttribute(’index’) //讓傳過來的函數執行,并且函數中的this還必須是當前實例 let func = this.options.buttons[index][’click’] if (typeof func === ’function’) { func.call(this) } return} }) this.fire(’init’)//通知init方法執行成功 }, //創建DOM結構 creatDom() { let {title, template, buttons} = this.options //如果用creatElement插入DOM,每一次動態插入,都會導致DOM的回流,非常消耗性能,所以最外面使用createElement創建,內部使用字符串的方式拼寫進去,創建好了之后放到最外層的容器當中,只引起一次回流 let frag = document.createDocumentFragment() let dpnDialog = document.createElement(’div’) dpnDialog.className = ’dpn-dialog’ dpnDialog.innerHTML = ` <div class='dpn-title'>${title}<i class='dpn-close'>X</i> </div> <div class='dpn-content'>${template && typeof template === ’object’ && template.nodeType === 1? template.outerHTML: template} </div> ${buttons.length > 0? `<div class='dpn-handle'> ${buttons.map((item, index) => { return `<button index='${index}'>${item.text}</button>`}).join(’’)} </div>`: ’’ } ` frag.appendChild(dpnDialog) let dpnModel = document.createElement(’div’) dpnModel.className = ’dpn-model’ frag.appendChild(dpnModel) document.body.appendChild(frag)//使用frag只需要往頁面中插入一次,減少回流次數 frag = null this.dpnDialog = dpnDialog//掛載到實例上,便于其他方法的控制隱藏,并且是私有的實例, this.dpnModel = dpnModel }, //控制他顯示 open() { this.dpnDialog.style.display = ’block’ this.dpnModel.style.display = ’block’ this.fire(’open’)//通知open方法執行成功 }, //控制隱藏 close() { this.dpnDialog.style.display = ’none’ this.dpnModel.style.display = ’none’ this.fire(’close’)//通知close方法執行成功 }, //on向事件池中訂閱方法 on(type, func) { let arr = this.pond[type] if(arr.includes(func)) return arr.push(func) }, //通知事件池中的方法執行 fire(type) { let arr = this.pond[type] arr.forEach(item => {if(typeof item ===’function’){ item.call(this)} }) } } function init(options) { //接下來將所有的操作全部寫在init里面 //參數初始化:傳遞進來的配置項替換默認的配置項 options = Object.assign({ title: ’系統提示’, template: null, frag: true, buttons: [{}] }, options) //把信息掛載到實例上: 在原型的各個方法中,只要this是實例,都可以調用到這些信息 this.options = options; this.pond = { init: [], close: [], open: [] } this.init() } init.prototype = ModalPlugin.prototype; // 瀏覽器直接導入,這樣的方法是暴露到全局的 window.ModalPlugin = ModalPlugin; //如果還需要支持ES6Module/CommonJS模塊導入規范,在react項目當中,vue項目當中也想用 if (typeof module !== ’undefined’ && module.exports !== ’undefined’) {//如果module不存在,typeof不會出錯,會返回undefined module.exports = ModalPlugin;//CommonJS規范,只有在webpack環境下才支持 }})()

使用

使用時需要引入modalpugin.js和modalpugin.css

使用示例1:

//使用:const modal1 = ModalPlugin({ //提示的標題信息 title: ’系統提示’, //內容模板 字符串 /模板字符串/DOM元素對象 template: null, //自定義按鈕信息 buttons: [{ //按鈕文字 text: ’確定’, click() { //this:當前實例 this.close() } }, { //按鈕文字 text: ’取消’, click() { //this:當前實例 this.close() }, }]})modal1.on(’open’,()=>{ console.log(’我被打開了1’)})modal1.on(’open’,()=>{ console.log(’我被打開了2’)})modal1.on(’close’,()=>{ console.log(’我被關閉了’)})modal1.open()

使用示例2:

基于原生JS封裝的Modal對話框插件的示例代碼

github

完整代碼github

到此這篇關于基于原生JS封裝的Modal對話框插件的示例代碼的文章就介紹到這了,更多相關JS封裝Modal對話框插件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜精品婷婷| 国产中文欧美日韩在线| 日韩中文字幕高清在线观看| 黄色欧美在线| 国产成人久久精品麻豆二区| 蜜臀精品一区二区三区在线观看| 欧美国产美女| 久久精品高清| 亚洲人成网站在线在线观看| 亚洲国产福利| 欧美.日韩.国产.一区.二区 | 日韩精品一区二区三区中文| 视频精品一区| 国产三级一区| 精品国产黄a∨片高清在线| 日韩免费久久| 亚洲精品电影| 日韩精品免费视频人成| 国产精品久久久久久久久久久久久久久| 日韩国产一二三区| 免费一区二区三区在线视频| 亚洲欧美高清| 日本aⅴ亚洲精品中文乱码| 国产精品天天看天天狠| 97精品国产一区二区三区| 亚洲第一精品影视| 中文字幕一区二区三区在线视频| 日韩av网站在线观看| 蜜桃久久久久| 欧美日韩在线播放视频| 最新亚洲国产| 久久精品天堂| 91九色精品| 日本v片在线高清不卡在线观看| 日本欧美久久久久免费播放网| 久久三级毛片| 韩日一区二区三区| 欧美亚洲综合视频| 日本不卡免费高清视频在线| 亚洲综合国产| 精品久久电影| 久久成人亚洲| 精品国产亚洲一区二区三区在线| 亚洲高清影视| 久久免费视频66| 乱人伦精品视频在线观看| 老司机精品视频网| 国产亚洲精品v| 精品理论电影在线| 亚洲深爱激情| 精品国产精品国产偷麻豆| 在线午夜精品| 精品国产美女a久久9999| 视频一区二区国产| 日韩免费久久| 久久精品99久久久| 国产高清一区| 丰满少妇一区| 亚洲免费资源| 久久在线视频免费观看| 国产视频网站一区二区三区| 午夜欧美在线| 激情久久99| 日韩国产欧美三级| 美女亚洲一区| 精品理论电影在线| 日韩av中文字幕一区| 美女久久久精品| 中文无码久久精品| 日韩毛片在线| 国产精品永久| 亚洲久久在线| 黑丝一区二区三区| 国产成人精品一区二区免费看京| 色婷婷成人网| 九九在线精品| 欧美三级网址| 精品一区二区三区中文字幕视频 | 狂野欧美性猛交xxxx| 日韩影院在线观看| 亚洲韩日在线| 国产精品原创| 欧美国产另类| 日本久久二区| 视频一区免费在线观看| 欧美精品一区二区三区精品| 久久久久久自在自线| 国产精品一区二区精品 | 高清一区二区三区| 国产精品亚洲综合久久| 亚州av日韩av| 石原莉奈在线亚洲三区| 婷婷激情综合| 亚洲天堂资源| 国模精品一区| 亚洲精品激情| 中文不卡在线| 久久亚洲欧洲| 不卡在线一区| 亚洲午夜黄色| 91精品婷婷色在线观看| 蜜臀久久精品| 国产+成+人+亚洲欧洲在线| 美女久久99| 精品日产乱码久久久久久仙踪林| 国产精品久久久一区二区| 999久久久国产精品| 日韩久久视频| 久久久久久久久成人| 亚洲一区国产| 欧美日韩精品一区二区三区在线观看| 夜夜嗨一区二区三区| 亚洲精品福利| 中文一区二区| 国产精品女主播一区二区三区| 精品国产欧美日韩| 欧美激情三区| 国产亚洲人成a在线v网站| 视频一区日韩精品| 婷婷亚洲成人| 日本不卡在线视频| 91p九色成人| 国产精品午夜av| 欧美激情99| 电影91久久久| 久久蜜桃精品| 国产精品老牛| 综合亚洲色图| 国产欧美三级| 久久久精品区| 亚洲一级少妇| 9色精品在线| 中文一区一区三区免费在线观 | 亚洲一区免费| 伊人久久在线| 韩国一区二区三区视频| 捆绑调教日本一区二区三区| 亚洲免费成人av在线| 涩涩av在线| 国产精品一页| 国产成人精品亚洲线观看| 在线日韩视频| 日韩在线观看不卡| 久久中文字幕av| 亚洲欧美网站| 亚洲精品成人一区| 蜜臀a∨国产成人精品| 亚洲久草在线| 国产精品xxxav免费视频| 国产成人精选| 亚洲精品一区二区在线看| 久热精品在线| 久久精品97| 中文字幕人成乱码在线观看| 激情欧美日韩一区| 日韩专区欧美专区| 欧美日本不卡高清| 日本不卡免费高清视频在线| 自由日本语亚洲人高潮| 日韩一级网站| 精品高清久久| bbw在线视频| 一区免费在线| 日本少妇精品亚洲第一区| 国产精品蜜月aⅴ在线| 精品入口麻豆88视频| 午夜欧美精品| 国产伦精品一区二区三区视频| 免费看av不卡| 日韩精品一卡二卡三卡四卡无卡| 久久精选视频| 日韩午夜视频在线| 欧美成人a交片免费看| 蜜桃av一区二区在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 久久高清一区| 欧美天堂一区| 国产99久久| 欧美色综合网| 亚洲一级黄色| 国产乱码精品一区二区三区四区| 丝袜美腿一区| 日本一区二区中文字幕| 免费一二一二在线视频| 亚洲美女91| 国产v综合v| 日韩国产在线一| 999精品色在线播放| 国产精品久久久久久久久免费高清| re久久精品视频| 精品久久91| 日本亚洲三级在线| 久久精品中文| 狂野欧美性猛交xxxx| 亚洲欧洲美洲国产香蕉| 成人看片网站| 免费一区二区三区在线视频| 水蜜桃久久夜色精品一区的特点| 精品久久不卡| 欧美中文一区|