• 原生js 自定义confirm


    本文参考博客园另一篇文章:https://www.cnblogs.com/hzj680539/p/5374052.html,在此感谢。

    在实际开发当中,考虑到原生js组件,包括alert、confirm等的体验较差,很多公司会考虑将这些组件进行重写、疯转。

    本文参考的文章里,作者所实现的自定义confirm有一些比较明显缺点,当然也有其优点。

    我这篇文章是按照我的设想,对齐进行了改造。

    改造点1:在实际应用中,css命名规则容易被其它样式名干扰,所以改造为所有css带有前缀:dialog;代码如下

     1  <style>
     2     html,
     3     body {
     4         margin: 0;
     5         padding: 0;
     6         font-family: "Microsoft YaHei";
     7     }
     8 
     9     .wrap-dialog {
    10         position: fixed;
    11         top: 0;
    12         left: 0;
    13         width: 100%;
    14         height: 100%;
    15         font-size: 16px;
    16         text-align: center;
    17         background-color: rgba(0, 0, 0, .4);
    18         z-index: 999;
    19     }
    20 
    21     .dialog {
    22         position: relative;
    23         margin: 10% auto;
    24         width: 300px;
    25         background-color: #FFFFFF;
    26     }
    27 
    28     .dialog .dialog-header {
    29         height: 20px;
    30         padding: 10px;
    31         background-color: #22b9ff;
    32     }
    33 
    34     .dialog .dialog-body {
    35         height: 30px;
    36         padding: 20px;
    37     }
    38 
    39     .dialog .dialog-footer {
    40         padding: 8px;
    41         background-color: #f5f5f5;
    42     }
    43 
    44     .dialog-btn {
    45         width: 70px;
    46         padding: 2px;
    47         cursor: pointer;
    48     }
    49 
    50     .dialog-hide {
    51         display: none;
    52     }
    53 
    54     .dialog-ml50 {
    55         margin-left: 50px;
    56     }
    57     </style>

    改造点2:js的实现,首先不在依赖jquery,其次不采用dom2的addEventLiistener绑定事件,因为经过测试会产生重复绑定问题;

     1 <script src="http://cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
     2 <script>
     3 $(document).ready(function() {
     4     //自定義部分
     5     window.confirm = function(message, yesCallBack, noCallBack) {
     6 
     7         var message = message || "确认删除此条信息?";
     8       
     9         var choose=function(tag){
    10             return document.querySelector(tag);
    11         }
    12        choose(".dialog-message").innerHTML = message;
    13         // 显示遮罩和对话框
    14        choose(".wrap-dialog").className = "wrap-dialog";
    15         // 确定按钮
    16 
    17        choose("#dialog").onclick= function(e){
    18             if(e.target.className=="dialog-btn"){
    19                  choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
    20                  yesCallBack();
    21             }else if (e.target.className=="dialog-btn dialog-ml50"){
    22                  choose(".wrap-dialog").className = "wrap-dialog dialog-hide";
    23                   noCallBack();
    24             }
    25         };
    26         // 取消按钮
    27 
    28     }
    29     $('#dialog-remove').click(function() {
    30         function text() {
    31            alert(22);
    32         }
    33 
    34         function ttt() {
    35             alert(111);
    36         }
    37         confirm("确认删除", text, ttt);
    38     });
    39 
    40 
    41 
    42 });
    43 </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>
    View Code

    当然,还可以继续改进,比如html改为动态生成,甚至于css也改为动态。这个有兴趣的可以继续。另外我把css的颜色的字母表示改为16进制颜色值。

    本文结束。

  • 相关阅读:
    开发人员要学的Docker从入门到日常命令使用(通俗易懂),专业运维人员请勿点!
    图片文件分布式存储方案设计模式(c#--sqlserver)
    linux下的nginx日志自动备份压缩--日志切割机
    把excel的数据导入到SQLSERVER里面,excel的字符串时间在导入sql库显示datetime 数据类型的转换产生一个超出范围的值
    SQL Server数据库 备份A库,然后删除A库,再还原A库,此时数据库一直显示“正在还原”的解决方法
    Nginx+Keepalived+VIP漂移实现HA高可用技术之详细教程
    Linux for CentOS 下的 keepalived 安装与卸载以及相关命令操作之详细教程
    Linux for CentOS 下的 nginx 绿色安装-超省心安装
    Redis主从复制+Keepalived+VIP漂移实现HA高可用技术之详细教程
    零基础数据挖掘组队学习第四次打卡
  • 原文地址:https://www.cnblogs.com/zhensg123/p/8643208.html
Copyright © 2020-2023  润新知