鍍金池/ 問答/HTML/ 如何解決:jquery生成DOM append之后無法顯示的問題?(本提問包含2

如何解決:jquery生成DOM append之后無法顯示的問題?(本提問包含2個問題)

最近在練習(xí)做一個彈框,

===============[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標簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! -->
        <title>彈窗試驗</title>
        <!-- Bootstrap -->
        <link  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 插件。你也可以根據(jù)需要只加載單個插件。 -->
        <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>

發(fā)現(xiàn)第一個問題:
【問題 1】我是用 “彈框div + mask div”的辦法做“模態(tài)彈框”的,方法是用 JQUERY 讓彈框/mask一起show、一起hide。<< 為了調(diào)試方便,我給每一個彈框按鈕(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,繼續(xù)放代碼:

<!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標簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! -->
        <title>彈窗試驗</title>
        <!-- Bootstrap -->
        <link  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 插件。你也可以根據(jù)需要只加載單個插件。 -->
        <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已經(jīng)被加入到DOM了,但是鼠標hover在element代碼上,屏幕里面沒有任何高亮顯示的色塊,也就是 >>> 這個彈框的DOM、理論上存在,實際上不存在!.....

。。。。。。。。。。。。。?!贰贰? 求問原因

回答
編輯回答
安于心

因為你給按鈕重復(fù)綁定了事件,所以點擊的次數(shù)越多,彈出的次數(shù)就越多
對于不是動態(tài)生成的dom元素,事件可以放到enter的click事件外面去綁定,對于動態(tài)生成的元素,可以用委托

<!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標簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! -->
        <title>彈窗試驗</title>
        <!-- Bootstrap -->
        <link  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 插件。你也可以根據(jù)需要只加載單個插件。 -->
        <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>
2017年1月13日 14:23
編輯回答
舊城人

第一個問題,姑且把它叫做嵌套注冊事件吧,就是你在注冊事件處理的時候,不要嵌套著去寫,你這個的問題就在于你把兩個需要hide的事件處理都寫進一個click里邊了,這樣相當于你每次click時、都會給相應(yīng)的DOM綁上一次事件處理,所以就會出你這樣的問題,就是因為你重復(fù)的綁了很多。這里你不要把這個on理解成是事件發(fā)生時要干嘛干嘛,這個on更像是一種事先約定,提前講好,如果事件發(fā)生了,那我跑一段function,但是你重復(fù)注冊當然就會跑上好幾次。
第二個問題,手機答題所以沒跑你的代碼,感覺你可以換成.append()方法再試試吧,HTML代碼里、越靠上層級越低。

2017年9月2日 02:46