原生组件封装
<body>
<button class="dailog1"></button>
</body>
<script>
class Dailog{
constructor(options){
this.opts = Object.assign({
width:"30%",
height:"250px",
title:"测试标题",
content:"测试内容",
dragable:true,
maskable:true,
isCancel:false,
success(){
console.log('确定')
},
cancel(){
console.log('取消')
}
},options);
this.init();
}
init(){
this.renderView();
this.dailogHtml.onclick = e=>{
switch(e.target.className){
case 'k-close':
this.close();
break;
case 'k-cancel':
this.close();
this.opts.cancel();
break;
case 'k-primary':
this.close();
this.opts.success();
break;
}
}
}
close(){
this.dailogHtml.querySelector(".k-wrapper").style.display="none";
this.dailogHtml.querySelector(".k-dialog").style.display="none";
}
open(){
this.dailogHtml.querySelector(".k-wrapper").style.display="block";
this.dailogHtml.querySelector(".k-dialog").style.display="block";
}
renderView(){
this.dailogHtml = document.createElement("div");
this.dailogHtml.innerHTML = `<div class="k-wrapper"></div>
<div class="k-dialog" style="width:${this.opts.width};height:${this.opts.height};">
<div class="k-header">
<span class="k-title">${this.opts.title}</span><span class="k-close">x</span>
</div>
<div class="k-body">
<span>${this.opts.content}</span>
<input class="input-inner" type="text" />
</div>
<div class="k-footer">
${this.opts.isCancel?'<span class="k-cancel">取消</span>':''}
<span class="k-primary">确定</span>
</div>
</div>`;
document.querySelector("body").appendChild(this.dailogHtml)
}
}
let dailog1 = new Dailog({
width:"40%",
height:"250px",
success(){
console.log('确定了')
},
cancel(){
console.log('取消了')
}
})
document.querySelector(".dailog1").onclick = function(){
dailog1.open();
}
</script>
方法3 通过自定义事件封装(适用于大项目)
<body>
<button class="dailog1"></button>
</body>
<script>
class Dailog extends EventTarget{
constructor(options){
super();
this.opts = Object.assign({
width:"30%",
height:"250px",
title:"测试标题",
content:"测试内容",
dragable:true,
maskable:true,
isCancel:false,
success(){
console.log('确定')
},
cancel(){
console.log('取消')
}
},options);
this.init();
}
let cancel = new Event("cancel");
this.addEventListener("cancel",this.opts.cancel);
this.addEventListener("success",this.opts.success);
init(){
this.renderView();
this.dailogHtml.onclick = e=>{
switch(e.target.className){
case 'k-close':
this.close();
this.trigger("cancel");
break;
case 'k-cancel':
this.close();
this.dispatchEvent(cancel)
break;
case 'k-primary':
this.close();
this.confirm();
break;
}
}
}
confirm(value){
let success = new CustomEvent("success",{
detail:value
});
this.trigger("success");
}
close(){
this.dailogHtml.querySelector(".k-wrapper").style.display="none";
this.dailogHtml.querySelector(".k-dialog").style.display="none";
}
open(){
this.dailogHtml.querySelector(".k-wrapper").style.display="block";
this.dailogHtml.querySelector(".k-dialog").style.display="block";
}
renderView(){
this.dailogHtml = document.createElement("div");
this.dailogHtml.innerHTML = `<div class="k-wrapper"></div>
<div class="k-dialog" style="width:${this.opts.width};height:${this.opts.height};">
<div class="k-header">
<span class="k-title">${this.opts.title}</span><span class="k-close">x</span>
</div>
<div class="k-body">
<span>${this.opts.content}</span>
//<input class="input-inner" type="text" />
</div>
<div class="k-footer">
${this.opts.isCancel?'<span class="k-cancel">取消</span>':''}
<span class="k-primary">确定</span>
</div>
</div>`;
document.querySelector("body").appendChild(this.dailogHtml)
}
}
class ExtendsDailog extends Dailog{
constructor(options){
super(options){
super(options);
this.renderInput();
}
renderInput(){
let myInput = document.createElement("input");
myInput.type = "text";
myInput.classList.add("input-inner");
this.dialogHtml.querySelector(".k-body").appendChild(myInput);
}
confirm(){
let value = this.dialogHtml.querySelector(".input-inner").value;
super.confirm(value);
}
}
}
let dailog1 = new Dailog({
width:"40%",
height:"250px",
success(e){
console.log('确定了',e.detail)
},
cancel(){
console.log('取消了')
}
})
document.querySelector(".dailog1").onclick = function(){
dailog1.open();
}
</script>
自定义事件
<button class="btn"></button>
//把函数当成事件来执行
<script>
function fn1(){
console.log("很多逻辑a");
}
function fn2(){
console.log("很多逻辑b");
}
let handle = {
"myevent":[fn1,fn2]
};
addEvent("myEvent",fn1);
addEvent("myEvent",fn2);
removeEvent("myEvent",fn2);
trigger("myEvent");
function addEvent(eventName,fn){
if(typeof handle[eventName] ==='undefine'){
handle[eventName] = [];
}
handle[eventName].push(fn);
}
function trigger(eventName){
if(!(eventName in handle)){
return ;
}
handle[eventName].foreach(v=>{
v();
})
}
function removeEvent(eventName,fn){
if(!(eventName in handle)){
return ;
}
for(let i=0;i<handle[eventName].length;i++){
if(handle[eventName][i]===fn){
handle[eventName].splice(i,1);
break;
}
}
}
class MyEvent{
constructor(){
this.handle = {};
}
addEvent(eventName,fn){
if(typeof this.handle[eventName] ==='undefine'){
this.handle[eventName] = [];
}
this.handle[eventName].push(fn);
}
trigger(eventName){
if(!(eventName in this.handle)){
return ;
}
this.handle[eventName].foreach(v=>{
v();
})
}
removeEvent(eventName,fn){
if(!(eventName in this.handle)){
return ;
}
for(let i=0;i<this.handle[eventName].length;i++){
if(this.handle[eventName][i]===fn){
this.handle[eventName].splice(i,1);
break;
}
}
}
}
let newEvent = new MyEvent();
newEvent.addEvent("myEvent",fn1);
newEvent.addEvent("myEvent",fn2);
newEvent.removeEvent("myEvent",fn2);
newEvent.trigger("myEvent");
</script>