如何解决:jquery生成DOM append之后无法显示的问题?(本提问包含2个问题)

最近在练习做一个弹框,

===============[part 1]================================
先放代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- <meta name="viewport" content="width=device-width, initial-scale=1"> -->
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>弹窗试验</title>
        <!-- Bootstrap -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">

            .pop_wrap {
                z-index: 1400;
                width: 1360px;
                position: absolute;
                top: 150px;
                display: none;
            }
            .pop_con {
                width: 500px;
                height: 200px;
                margin: 0 auto 0;
                background: #fafafa
            }
            .pop_p {
                font-size: 20px;
                margin-top: 50px;
                text-align: center;
            }
            .pop_row {
                margin-top: 50px;
            }
            .pop_btn {
                text-align: center;
                height: 30px;
            }
            .w_200 {
                width: 200px;
            }
            .pop_mask {
                z-index:1300;
                position: absolute;
                top:0px;
                left:0px;
                background:#000000;
                opacity:0.5;
                width:1920px;
                height:2052px;
                display: none;
            }
        </style>
    </head>
    <body>
        <div class="pop_wrap" id="confirm_pop">
            <div class="container pop_con">
                <p class="pop_p">确定要取消么?</p>
                <div class="row pop_row">
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_x" class="btn btn-lg btn-default w_200">算了</button>
                    </div>
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_o" class="btn btn-lg btn-primary w_200">确定</button>
                    </div>
                </div>
            </div>
        </div>
        <input id="enter" type="button" value="点击">
        <div class="pop_mask" id="pop_mask"></div>

        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

        <script type="text/javascript">

            $(function(){

                $('#enter').on("click", function(){
                    $("#pop_mask").show();
                    $("#confirm_pop").show();
                    $("#btn_x").on("click", function(){
                        alert("NO");
                        $("#confirm_pop").hide();
                        $("#pop_mask").hide();
                    });
                    $("#btn_o").on("click", function(){
                        alert("yes");
                        $("#confirm_pop").hide();
                        $("#pop_mask").hide();
                    }); 
                });
            });

        </script>
    </body>
</html>

发现第一个问题:
【问题 1】我是用 “弹框div + mask div”的办法做“模态弹框”的,方法是用 JQUERY 让弹框/mask一起show、一起hide。<< 为了调试方便,我给每一个弹框按钮(NO和YES)都加了alert()

这里出了个问题:第一次弹出后我按动按钮,alert跳出一次、弹框和mask都hide; 第二次我再按动按钮并点击弹框里的按钮,alert跳出两次、弹框和mask--hide!第三次,则alert跳三次......

。。。。。。。。。。。。。。》》》 求问原因

===============[part 2]================================
【问题 2】
然后,我懂了、需要用jquery生成DOM 再append到DOM中去,然后、每次点击yes OR no之后,要remove这个弹框部分(.pop_wrap的div及其子div)!

so,继续放代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- <meta name="viewport" content="width=device-width, initial-scale=1"> -->
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>弹窗试验</title>
        <!-- Bootstrap -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">

            .pop_wrap {
                z-index: 1400;
                width: 1360px;
                position: absolute;
                top: 150px;
                display: none;
            }
            .pop_con {
                width: 500px;
                height: 200px;
                margin: 0 auto 0;
                background: #fafafa
            }
            .pop_p {
                font-size: 20px;
                margin-top: 50px;
                text-align: center;
            }
            .pop_row {
                margin-top: 50px;
            }
            .pop_btn {
                text-align: center;
                height: 30px;
            }
            .w_200 {
                width: 200px;
            }
            .pop_mask {
                z-index:1300;
                position: absolute;
                top:0px;
                left:0px;
                background:#000000;
                opacity:0.5;
                width:1920px;
                height:2052px;
                display: none;
            }
        </style>
    </head>
    <body>
        <!-- <div class="pop_wrap" id="confirm_pop">
            <div class="container pop_con">
                <p class="pop_p">确定要取消么?</p>
                <div class="row pop_row">
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_x" class="btn btn-lg btn-default w_200">算了</button>
                    </div>
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_o" class="btn btn-lg btn-primary w_200">确定</button>
                    </div>
                </div>
            </div>
        </div> -->
        <input id="enter" type="button" value="点击">
        <div class="pop_mask" id="pop_mask"></div>

        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

        <script type="text/javascript">

            $(function(){

                $('#enter').on("click", function(){
                    $("#pop_mask").show();
                    var pop = $('<div class="pop_wrap" id="confirm_pop"><div class="container pop_con"><p class="pop_p">确定要取消么?</p><div class="row pop_row"><div class="col-xs-6 pop_btn"><button type="button" id="btn_x" class="btn btn-lg btn-default w_200">算了</button></div><div class="col-xs-6 pop_btn"><button type="button" id="btn_o" class="btn btn-lg btn-primary w_200">确定</button></div></div></div></div>');
                    $('body').prepend(pop);
                    // $("#confirm_pop").show();
                    $("#btn_x").on("click", function(){
                        $("#confirm_pop").hide();
                        $("#pop_mask").remove();
                    });
                    $("#btn_o").on("click", function(){
                        $("#confirm_pop").hide();
                        $("#pop_mask").remove();

                    }); 
                });
            });

        </script>
    </body>
</html>

好了,这下弹框都不显示了!!.....F12里面能看到,这个DOM已经被加入到DOM了,但是鼠标hover在element代码上,屏幕里面没有任何高亮显示的色块,也就是 >>> 这个弹框的DOM、理论上存在,实际上不存在!.....

。。。。。。。。。。。。。。》》》 求问原因

阅读 4.6k
2 个回答

第一个问题,姑且把它叫做嵌套注册事件吧,就是你在注册事件处理的时候,不要嵌套着去写,你这个的问题就在于你把两个需要hide的事件处理都写进一个click里边了,这样相当于你每次click时、都会给相应的DOM绑上一次事件处理,所以就会出你这样的问题,就是因为你重复的绑了很多。这里你不要把这个on理解成是事件发生时要干嘛干嘛,这个on更像是一种事先约定,提前讲好,如果事件发生了,那我跑一段function,但是你重复注册当然就会跑上好几次。
第二个问题,手机答题所以没跑你的代码,感觉你可以换成.append()方法再试试吧,HTML代码里、越靠上层级越低。

因为你给按钮重复绑定了事件,所以点击的次数越多,弹出的次数就越多
对于不是动态生成的dom元素,事件可以放到enter的click事件外面去绑定,对于动态生成的元素,可以用委托

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- <meta name="viewport" content="width=device-width, initial-scale=1"> -->
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>弹窗试验</title>
        <!-- Bootstrap -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">

            .pop_wrap {
                z-index: 1400;
                width: 1360px;
                position: absolute;
                top: 150px;
                display: none;
            }
            .pop_con {
                width: 500px;
                height: 200px;
                margin: 0 auto 0;
                background: #fafafa
            }
            .pop_p {
                font-size: 20px;
                margin-top: 50px;
                text-align: center;
            }
            .pop_row {
                margin-top: 50px;
            }
            .pop_btn {
                text-align: center;
                height: 30px;
            }
            .w_200 {
                width: 200px;
            }
            .pop_mask {
                z-index:1300;
                position: absolute;
                top:0px;
                left:0px;
                background:#000000;
                opacity:0.5;
                width:1920px;
                height:2052px;
                display: none;
            }
        </style>
    </head>
    <body>
        <div class="pop_wrap" id="confirm_pop">
            <div class="container pop_con">
                <p class="pop_p">确定要取消么?</p>
                <div class="row pop_row">
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_x" class="btn btn-lg btn-default w_200">算了</button>
                    </div>
                    <div class="col-xs-6 pop_btn">
                        <button type="button" id="btn_o" class="btn btn-lg btn-primary w_200">确定</button>
                    </div>
                </div>
            </div>
        </div>
        <input id="enter" type="button" value="点击">
        <div class="pop_mask" id="pop_mask"></div>

        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

        <script type="text/javascript">

            $(function(){
                $('#enter').on("click", function(){
                    $("#pop_mask").show();
                    $("#confirm_pop").show();
                });
                $("body").on("click", "#btn_x" ,function(){
                        alert("NO");
                        $("#confirm_pop").hide();
                        $("#pop_mask").hide();
                    });
                $("body").on("click", "#btn_o", function(){
                    alert("yes");
                    $("#confirm_pop").hide();
                    $("#pop_mask").hide();
                });
            });

        </script>
    </body>
</html>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题