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

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

API配置

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

Modal插件核心功能的開發(fā)

導出

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

使用對象和函數(shù)創(chuàng)建實例

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

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

配置項

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

命令模式init()執(zhí)行邏輯

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

創(chuàng)建DOM

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

對參數(shù)進行處理

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

creatDom() { let {title, template, buttons} = this.options //如果用creatElement插入DOM,每一次動態(tài)插入,都會導致DOM的回流,非常消耗性能,所以最外面使用createElement創(chuàng)建,內(nèi)部使用字符串的方式拼寫進去,創(chuàng)建好了之后放到最外層的容器當中,只引起一次回流 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只需要往頁面中插入一次,減少回流次數(shù) 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() //基于事件委托,實現(xiàn)點擊事件的處理 this.dpnDialog.addEventListener(’click’, (ev)=>{let target = ev.target, {tagName,className}= targetconsole.log([target])//點擊的關(guān)閉按鈕if(tagName===’I’&&className.includes(’dpn-close’)){ this.close() return}//點擊的是底部按鈕if(tagName===’BUTTON’ && target.parentNode.className.includes(’dpn-handle’)){ let index = target.getAttribute(’index’) //讓傳過來的函數(shù)執(zhí)行,并且函數(shù)中的this還必須是當前實例 let func = this.options.buttons[index][’click’] if(typeof func===’function’){ func.call(this) } return} }) },

基于發(fā)布訂閱實現(xiàn)回調(diào)函數(shù)的監(jiān)聽(生命周期)

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

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

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

完整代碼

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

使用

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

使用示例1:

//使用:const modal1 = ModalPlugin({ //提示的標題信息 title: ’系統(tǒng)提示’, //內(nèi)容模板 字符串 /模板字符串/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(’我被關(guān)閉了’)})modal1.open()

使用示例2:

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

github

完整代碼github

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

標簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜桃久久av| 麻豆一区二区在线| 99久久视频| 亚洲不卡视频| 欧美二区视频| 免费一级欧美片在线观看网站 | 日本一二区不卡| 亚洲欧洲免费| 99久久精品费精品国产| 69堂精品视频在线播放| japanese国产精品| 久久久精品区| 日韩欧美高清一区二区三区| 黄毛片在线观看| 欧美有码在线| 久久国产电影| 日韩1区在线| 国产精品久久久久av蜜臀| 日韩中文字幕亚洲一区二区va在线| 香蕉精品久久| 免费日韩av片| 久久av日韩| 亚洲欧美专区| 国产精品久久国产愉拍| 欧美a级片一区| 精品国模一区二区三区| 福利精品一区| 国产精品115| 青草国产精品久久久久久| 亚洲精品激情| 五月婷婷六月综合| 欧美99久久| 久久蜜桃资源一区二区老牛| 中文在线资源| 久久婷婷国产| 免费在线播放第一区高清av| 日本成人中文字幕在线视频| 国产精品美女| 免费成人性网站| 亚洲在线网站| 夜久久久久久| 午夜电影一区| 亚洲区欧美区| 亚洲美女91| 日本vs亚洲vs韩国一区三区二区| 激情久久中文字幕| 国产韩日影视精品| 视频一区免费在线观看| 免费看黄色91| 日韩一区二区三区高清在线观看| 视频一区国产视频| 亚洲18在线| 免费看黄色91| 国产精品tv| 国产91欧美| 亚洲第一区色| 国产麻豆综合| 国产精品免费大片| av中文字幕在线观看第一页| 国产综合精品| 丝袜国产日韩另类美女| 日韩极品在线观看| 国产精品久久久久久久久久久久久久久| 韩国女主播一区二区三区| 国产在线不卡| 国产精品一卡| 日韩激情一区| 亚洲人成在线影院| 国产精品久久久久久久久久久久久久久 | 老司机免费视频一区二区三区| 精品国产乱码久久久久久樱花| 久久久久久色 | 国产探花一区在线观看| av最新在线| 合欧美一区二区三区| 日韩福利视频一区| 九色porny丨国产首页在线| 亚洲免费影院| 成人一二三区| 日韩美女国产精品| 蜜桃视频在线网站| 日本成人精品| 99久久亚洲精品蜜臀| 国产一级成人av| 在线视频观看日韩| 精品伊人久久| 欧美专区18| 精品久久影院| 一区二区亚洲精品| 91p九色成人| 日韩欧美二区| 国产精品久久久久久久久久久久久久久 | 精品三级久久久| 久久一区二区三区电影| 人人精品人人爱| 中文字幕人成乱码在线观看 | 99免费精品| 视频一区二区三区中文字幕| 国产一区二区三区不卡av | 精品无人区麻豆乱码久久久| 免费欧美日韩| 国产精选在线| 久久精品国产久精国产| 正在播放日韩精品| 欧美激情在线精品一区二区三区| 夜夜嗨av一区二区三区网站四季av| 日韩一区欧美| 成人日韩精品| 另类专区亚洲| 精品香蕉视频| 国产精品一页| 免费在线观看精品| 国产精品日韩久久久| 亚洲特色特黄| 日本久久黄色| 九九九精品视频| 日韩综合在线| 成人亚洲欧美| 播放一区二区| 在线视频观看日韩| 91精品国产成人观看| 亚洲国产专区| 狠狠爱成人网| 蜜臀久久99精品久久久画质超高清| 欧美日韩三区| 99国产一区| 亚洲深深色噜噜狠狠爱网站 | 午夜影院欧美| 成人在线超碰| 日韩久久视频| www.com.cn成人| 亚洲成人国产| 日韩精品免费一区二区夜夜嗨 | av在线最新| 国产成人精品亚洲线观看| 色婷婷久久久| 999视频精品| 国产一在线精品一区在线观看| 亚洲黄色网址| 欧美日韩国产在线一区| 一二三区精品| 亚洲精品高潮| 精品日韩在线| 日本高清不卡一区二区三区视频| 亚洲免费高清| 日韩激情精品| 精品丝袜久久| аⅴ资源天堂资源库在线| 国际精品欧美精品| 欧美69视频| 日韩一区二区三区在线看| 免费日韩av片| 久久99国产精品视频| 欧美1区二区| 国产字幕视频一区二区| 亚洲欧美日韩综合国产aⅴ| 中文不卡在线| av资源中文在线天堂| 免费视频久久| 精品精品99| 久久国产成人| 日韩欧美一区二区三区免费观看| 亚洲另类av| 精品国产免费人成网站| 亚洲精品极品少妇16p| 欧美日本精品| 欧美激情日韩| 在线亚洲自拍| 国产一区二区三区探花| 综合色一区二区| 91日韩欧美| 蜜桃视频一区二区| 国内精品伊人| 国产在线观看www| 日韩精品一区二区三区中文| 国内精品伊人| 日韩不卡一二三区| 一区二区三区国产在线| 91欧美极品| 免费欧美一区| 激情国产在线| 免费观看日韩电影| 激情综合在线| 国产精品久久久久久久免费软件| 国产视频一区在线观看一区免费| 国产在线视频欧美一区| 久久国产精品99国产| 国产一区日韩| 欧美1区2区3| 日韩高清在线不卡| 亚洲精品伊人| 蜜臀久久99精品久久久画质超高清| 成人国产精品一区二区免费麻豆| 日韩高清三区| 亚洲欧美日韩一区在线观看| 亚洲成av人片一区二区密柚| 国产精品a级| 青青草91视频| 青草久久视频| 亚洲精品看片|