简易遮罩弹窗层+JSON美化

一些后台系统,需要后端人员兼职前端进行一些建议的实现,年后回来针对年前 JSON 字符串的展示做了小小改动,特此记录。

样式文件如下:

/*定义表格边框*/
table,tr,th, td {
    border: 1px solid;
}
thead th {
    background-color: green;
}
/*遮罩层样式*/
.shadow{
    position:fixed;
    z-index:998;/*定义层级*/
    width:100%;
    height:100%;
    left:0;
    top:0;
    background-color:#000;
    opacity:0.6; /*设置不透明度*/
    display:none;
}

/*定义弹窗*/
.insurance_request_box{
    /*
     * 定义绝对固定定位:https://developer.mozilla.org/zh-CN/docs/Web/CSS/position;
     * absolute 相对整个文本流进行绝对定位;
     * fixed 相对窗口进行绝对定位
     */
    position:fixed;
    z-index:999; /*定义层级,注意:要比遮罩高*/
    width:50%;
    max-height:70%;
    overflow-y: auto;
    margin:5% auto;
    left:25%;
    top:5%;
    padding:28px;
    border:1px #111 solid;
    background-color: #fff;
    display:none;            /* 默认对话框隐藏 */
}
/*定义弹窗关闭按钮*/
.insurance_request_box .x{ 
    font-size:18px; 
    text-align:right; 
    display:block;
}
/*定义 pre 标签格式化展示样式*/
.insurance_request_box pre{
    width:80%; 
    font-size:18px; 
    margin-top:18px;
}

JavaScript 文件如下:

function msgbox(obj,n){
    /*关闭弹窗时,置空弹窗中的内容*/
    var title = document.getElementById('insurance_request_title');
    var content = document.getElementById('insurance_request');
    if(n == 0) {
        title.innerText = content.innerText = "";
        document.getElementsByClassName("insurance_request_box")[0].style.display = 'none';
        document.getElementsByClassName("shadow")[0].style.display = 'none';
        return false;
    }

    /*没有报文*/
    var order_id = obj["dataset"]["id"];
    var request_data = obj["dataset"]["text"];
    if(request_data == '') {
        request_data = "订单 "+ order_id + " 未向xxx发起请求,暂无报文!";
        alert(request_data); // 控制台:[Violation]'click' handler took xxxxms https://segmentfault.com/q/1010000038411154
        return false;
    }
    
    /*存在报文*/
    document.getElementsByClassName("insurance_request_box")[0].style.display = 'block';
    document.getElementsByClassName("shadow")[0].style.display = 'block';
    title.innerText = order_id + " 报文如下:"
    content.innerText = JSON.stringify(JSON.parse(request_data), null, 4);
    /*window.scrollTo(0, document.documentElement.clientHeight);*/ // 自动滑到页面底部,显示报文
    return true;
}

HTML 文件如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="./test.css">
<title>简易遮罩弹窗层+JSON美化</title>
</style>
</head>
<body>
<!-- 测试数据 -->
<table>
    <thead>
        <tr>
            <th>序号</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <!-- https://stackoverflow.com/questions/7755088/what-does-href-expression-a-href-javascript-a-do -->
            <td align="center"><a href="javascript:;" onclick="msgbox(this,1);" data-text='{"errcode":"suc","errmsg":"ok","guid":"test","run_time":2.68,"data":{"quotations":{"trans_id":"test","serial_number":"ste"},"policy":{"policy_no":"test","currency":"6","total_premium":"8.00","status":"1","policy_file":"","batch":[{"trans_id":"test","batch_no":"test","premium":"8.00"}]}}}' data-id="test_order_1_axa_insurance">查看报文</a></td>
        </tr>
        <tr>
            <td>2</td>
            <td align="center"><a href="javascript:;" onclick="msgbox(this,1);" data-text='' data-id="test_order_2_axa_insurance">查看报文</a></td>
        </tr>
    </tbody>
</table>

<!-- 定义遮罩弹窗 -->
<div class="shadow" onclick="msgbox(null,0)"></div>
<div class='insurance_request_box'>
    <a class='x' onclick="msgbox(null,0)">关闭</a>
    <span id="insurance_request_title"></span>
    <!-- 注意:此处要用 pre 标签来展示,如果用 div 或 p 标签展示格式化后的 JSON 空格是会被缩减的 -->
    <pre id="insurance_request"></pre>
</div>
</body>
<script type="text/javascript" src="./test.js"></script>
</html>

扩展阅读的问题

1. position:fixedposition:absolute 有什么区别?

position:fixedposition:absolute 都是用于元素绝对定位的属性,使用它们会导致元素会被移出正常文档流,并不为元素预留空间。

  • absolute 通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。
  • fixed 通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置,元素的位置在屏幕滚动时不会改变。

即:在没有滚动条的情况下两者其实没有差异,但是在有滚动条后,fixed始终会在定好的位置不动,而absolute会随参照对象元素的宽高变化为移动。

2. JavaScript 的 onclick 事件报:[Violation]'click' handler took xxxms

无意间发现了这个报错信息,一开始以为是在 onclick 事件中用了什么导致,后来直接 onclick="alert(111);" 发现也有这个问题,查了一些网上信息得到了原因:alert 阻塞了 click 事件的执行,导致事件渲染事件过长,浏览器自身的机制觉得当前的 click 事件耗时太长,所以给个警告,当我们把 alert 换成 console.log 或 alter 事件触发后立即迅速点击 Enter 键,该警告信息就不会出现了。

3. a 标签中的 href=”javascript:somefunc(this);” 是无法传递 this 对象的,href 希望的是用户将其传递一个链接信息。详细可阅读:What does href expression <a href="javascript:;"></a> do?

4. HTML 显示 JSON 字符串并且进行格式化 - HTML 要用 pre 标签进行展示,如果用 div 或 p 标签展示格式化后的 JSON 空格是会被缩减的 - 转换JSON字符串,要先用 JSON.parse() 转换为 JSON 对象,然后再使用 JSON.stringify() 进行格式化

转载请声明出处: MinsonLee的博客:https://minsonlee.github.io

扫描下方二维码,关注公众号,接收更多实时内容

新猿呓码

打赏一个呗

取消

感谢客官打赏,您的打赏使我动力十足!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦