基于原生JS封装的Modal对话框插件的示例代码
基于原生JS封装Modal对话框插件,具体内容如下所示:
原生JS封装Modal对话框插件,个人用来学习原理与思想,只有简单的基本框架的实现,可在此基础上添加更多配置项
API配置
//基本语法 letmodal=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(){ functionModalPlugin(){ return } //浏览器直接导入,这样的方法是暴露到全局的 window.ModalPlugin=ModalPlugin; //如果还需要支持ES6Module/CommonJS模块导入规范,在react项目当中,vue项目当中也想用 if(typeofmodule!=='undefined'&&module.exports!=='undefined'){//如果module不存在,typeof不会出错,会返回undefined module.exports=ModalPlugin;//CommonJS规范,只有在webpack环境下才支持 } })()
使用对象和函数创建实例
想使用创建对象的方式newModalPlugin()创建实例或当做普通函数执行ModalPlugin(),创建实例,需要这样做
(function(){ functionModalPlugin(){ returnnewinit() } //想使用创建对象的方式`newModalPlugin()`创建实例或当做普通函数执行`ModalPlugin()`,创建实例,需要这样做 //类的原型:公共的属性方法 ModalPlugin.prototype={ constructor:ModalPlugin } functioninit(){} init.prototype=ModalPlugin.prototype; //浏览器直接导入,这样的方法是暴露到全局的 window.ModalPlugin=ModalPlugin; //如果还需要支持ES6Module/CommonJS模块导入规范,在react项目当中,vue项目当中也想用 if(typeofmodule!=='undefined'&&module.exports!=='undefined'){//如果module不存在,typeof不会出错,会返回undefined module.exports=ModalPlugin;//CommonJS规范,只有在webpack环境下才支持 } })()
配置项
//封装插件的时候,需要支持很多配置项,有的配置项不传递有默认值,此时我们千万不要一个个定义形参,用对象的方式传形参,好处是可以不传,而且可以不用考虑顺序 functionModalPlugin(options){ returnnewinit(options) } //想使用创建对象的方式创建实例newModalPlugin()或当做普通函数执行也能创建实例ModalPlugin(),需要这样做 ModalPlugin.prototype={ constructor:ModalPlugin } functioninit(options){ //接下来将所有的操作全部写在init里面 //参数初始化:传递进来的配置项替换默认的配置项 options=Object.assign({ title:'系统提示', template:null, frag:true, buttons:[{ text:'确定', click(){ } }] },options) }
命令模式init()执行逻辑
创建DOM
//创建DOM结构 creatDom(){ //如果用creatElement插入DOM,每一次动态插入,都会导致DOM的回流,非常消耗性能,所以最外面使用createElement创建,内部使用字符串的方式拼写进去,创建好了之后放到最外层的容器当中,只引起一次回流 letfrag=document.createDocumentFragment() letdpnDialog=document.createElement('div') dpnDialog.className='dpn-dialog' dpnDialog.innerHTML=`系统温馨提示