本文参考博客园另一篇文章:https://www.cnblogs.com/hzj680539/p/5374052.html,在此感谢。
在实际开发当中,考虑到原生js组件,包括alert、confirm等的体验较差,很多公司会考虑将这些组件进行重写、疯转。
本文参考的文章里,作者所实现的自定义confirm有一些比较明显缺点,当然也有其优点。
我这篇文章是按照我的设想,对齐进行了改造。
改造点1:在实际应用中,css命名规则容易被其它样式名干扰,所以改造为所有css带有前缀:dialog;代码如下
<style>
html,
body {
margin: 0;
padding: 0;
font-family: "Microsoft YaHei";
} .wrap-dialog {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
font-size: 16px;
text-align: center;
background-color: rgba(0, 0, 0, .4);
z-index: 999;
} .dialog {
position: relative;
margin: 10% auto;
width: 300px;
background-color: #FFFFFF;
} .dialog .dialog-header {
height: 20px;
padding: 10px;
background-color: #22b9ff;
} .dialog .dialog-body {
height: 30px;
padding: 20px;
} .dialog .dialog-footer {
padding: 8px;
background-color: #f5f5f5;
} .dialog-btn {
width: 70px;
padding: 2px;
cursor: pointer;
} .dialog-hide {
display: none;
} .dialog-ml50 {
margin-left: 50px;
}
</style>
改造点2:js的实现,首先不在依赖jquery,其次不采用dom2的addEventLiistener绑定事件,因为经过测试会产生重复绑定问题;
<script src="http://cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
//自定義部分
window.confirm = function(message, yesCallBack, noCallBack) { var message = message || "确认删除此条信息?"; var choose=function(tag){
return document.querySelector(tag);
}
choose(".dialog-message").innerHTML = message;
// 显示遮罩和对话框
choose(".wrap-dialog").className = "wrap-dialog";
// 确定按钮 choose("#dialog").onclick= function(e){
if(e.target.className=="dialog-btn"){
choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
yesCallBack();
}else if (e.target.className=="dialog-btn dialog-ml50"){
choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
noCallBack();
}
};
// 取消按钮 }
$('#dialog-remove').click(function() {
function text() {
alert(22);
} function ttt() {
alert(111);
}
confirm("确认删除", text, ttt);
}); });
</script>
jquery是用来测试的,哈哈。
改造点3:直接改写原生的confirm,而不是另起名称。也就是window.confirm;
最后是整体代码:
<!DOCTYPE html> <head>
<meta charset="utf-8">
<title>js confirm弹出框自定义样式</title>
<style>
html,
body {
margin: 0;
padding: 0;
font-family: "Microsoft YaHei";
} .wrap-dialog {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
font-size: 16px;
text-align: center;
background-color: rgba(0, 0, 0, .4);
z-index: 999;
} .dialog {
position: relative;
margin: 10% auto;
width: 300px;
background-color: #FFFFFF;
} .dialog .dialog-header {
height: 20px;
padding: 10px;
background-color: #22b9ff;
} .dialog .dialog-body {
height: 30px;
padding: 20px;
} .dialog .dialog-footer {
padding: 8px;
background-color: #f5f5f5;
} .dialog-btn {
width: 70px;
padding: 2px;
cursor: pointer;
} .dialog-hide {
display: none;
} .dialog-ml50 {
margin-left: 50px;
}
</style>
</head> <body>
<input type="button" value="删除" class="dialog-btn dialog-ml50" id="dialog-remove">
//組件html部分
<div class="wrap-dialog dialog-hide" >
<div class="dialog" id="dialog">
<div class="dialog-header">
<span class="dialog-title">信息确认</span>
</div>
<div class="dialog-body">
<span class="dialog-message">你确认删除此条信息?</span>
</div>
<div class="dialog-footer">
<input type="button" class="dialog-btn" id="dialog-confirm" value="确认" />
<input type="button" class="dialog-btn dialog-ml50" id="dialog-cancel" value="取消" />
</div>
</div>
</div> </body>
<script src="http://cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
//自定義部分
window.confirm = function(message, yesCallBack, noCallBack) { var message = message || "确认删除此条信息?"; var choose=function(tag){
return document.querySelector(tag);
}
choose(".dialog-message").innerHTML = message;
// 显示遮罩和对话框
choose(".wrap-dialog").className = "wrap-dialog";
// 确定按钮 choose("#dialog").onclick= function(e){
if(e.target.className=="dialog-btn"){
choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
yesCallBack();
}else if (e.target.className=="dialog-btn dialog-ml50"){
choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
noCallBack();
}
};
// 取消按钮 }
$('#dialog-remove').click(function() {
function text() {
alert(22);
} function ttt() {
alert(111);
}
confirm("确认删除", text, ttt);
}); });
</script> </html>
当然,还可以继续改进,比如html改为动态生成,甚至于css也改为动态。这个有兴趣的可以继续。另外我把css的颜色的字母表示改为16进制颜色值。
本文结束。