美文网首页让前端飞
js中用单例模式创建一个弹窗

js中用单例模式创建一个弹窗

作者: 顾川眉 | 来源:发表于2017-10-11 17:28 被阅读0次

    历史

    在开发中,动态创建一个弹层(暂且命名为box)是很常见的需求。因为如果在html中始终渲染这些box,代价可能会比较高,如果是纯文字还好,复杂点的涉及到ajax,图片,那就不太好了。然而如果每次用户一个动作(click或者mouseover)就动态创建一个box,移出就删除box,那么效率也不算很高,需要频繁绘制dom,性能不好。那么,如何比较高效、完美地创建一个弹窗呢?本文演示了用单例模式来创建。

    演示

    一个createWindow方法,用于创建box:

    createWindow函数立即执行,返回了一个匿名函数,匿名函数中保持了createWindow闭包中对div的引用,若div已经存在,则直接返回div,如果不存在,才会重新创建。然后监听按钮事件,只需切换display状态就好了。

    完整demo代码

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            .common-box {
                background: rgb(233, 90, 90);
                width: 100px;
                height: 100px;
                overflow: hidden;
            }
        </style>
    </head>
    
    <body>
        <button id="btn1">
            点我创建新窗口
        </button>
        <button id="hide">
            点我隐藏
        </button>
        <script>
            const btn1 = document.querySelector('#btn1');
            const createWindow = (() => {
                let div;
                return (words) => {
                    if (!div) {
                        console.log('重新创建');
                        div = document.createElement('div');
                        div.innerHTML = words || '我是默认的语句';
                        div.className = 'common-box';
                        div.style.display = 'none';
                        document.body.appendChild(div);
                    }
                   
                    return div;
                }
            })();
    
            btn1.addEventListener('click', ()=>{
                let box = createWindow(`我是文字  ${Date.now()}`);
                box.style.display = 'block';
            }, false);
            
            //隐藏
            document.querySelector('#hide').addEventListener('click', ()=>{
                document.querySelector('.common-box').style.display = 'none';
            }, false);
        </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

        本文标题:js中用单例模式创建一个弹窗

        本文链接:https://www.haomeiwen.com/subject/gfnwyxtx.html