JS的事件动态绑定机制

动态添加标签+动态添加事件

  window.οnlοad=function(){

    (已存在元素节点)事件绑定;

    (未来元素节点)事件绑定;

  }

  它会扫描元素节点,如果元素节点存在(静态写好的),就可以绑定了;如果元素节点不存在,是后来动态添加的就不会执行。

  所以,我们不能将后来添加的元素的事件绑定像已存在元素节点的绑定一样,他的元素节点的添加要和事件绑定的代码放在一起。

代码实现:微博发布功能,微博最新发布的在上边,可以删除。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            /*动态添加样式,可以先静态设置,然后删除标签元素节点进行动态添加,样式保留,
        这样的话添加元素节点之后,如果样式是class,则要给元素节点添加样式,
        如果样式是标签  那就不用对添加的标签进行修改了*/
            
            * {
                margin: 0;
                padding: 0;
            }
            
            #box {
                width: 600px;
                border: 1px solid gray;
                /*border  可以不给高度,让高度通过儿子元素撑起来*/
                margin: 0 auto;
                padding: 30px 0;
            }
            
            textarea {
                width: 450px;
                height: 200px;
                resize: none;
                outline: none;
            }
            
            #box ul {
                list-style: none;
            }
            
            #box ul li {
                width: 450px;
                line-height: 30px;
                border-bottom: 1px dashed #ccc;
                margin-left: 80px;
            }
            
            #box ul li a {
                float: right;
                font: 400 12px/30px "微软雅黑";
                color: gray;
            }
        </style>
        <script type="text/javascript">
            window.onload = function() {
                function getClass(classname) {
                    if(document.getElementsByClassName) {
                        return document.getElementsByClassName(classname);
                    }

                    var classNameArr = [];
                    var dom = document.getElementsByTagName("*");
                    for(var i = 0; i < dom.length; i++) {
                        var classArr = dom[i].className.split(" ");
                        console.log(typeof classArr);
                        console.log(classArr.length);
                        for(var j = 0; j < classArr.length; j++) {
                            if(classArr[j] == classname) {
                                classNameArr.push(dom[i]);
                                break;
                            }
                        }
                    }
                    return classNameArr;
                }

                function $(id) {
                    return document.getElementById(id);
                }

                var newul = document.createElement("ul");
                $("box").appendChild(newul); //点击之前把ul创建好  不然会点击一次创建一次ul

                $("btn").onclick = function() {
                        var txts = document.getElementsByName("txt");
                        if(txts[0].value == "") {
                            alert("你还没有输入内容!");
                            return;
                        } else {
                            var ul = $("box").getElementsByTagName("ul")[0];
                            var ul_childs = ul.children;
                            var li = document.createElement("li");
                            //                        var a=document.createElement("a");
                            //                        a.innerText="删除";
                            //                        a.href="javascript:;";
                            //                        li.appendChild(a);
                            //                        li.innerHTML=txts[0].value;
                            //                        还可以这么添加a标签
                            li.innerHTML = txts[0].value + "<a href='javascript:;'>删除</a>";
                            txts[0].value = "";
                            if(ul_childs == null) { //ul_childs.length==0
                                ul.appendChild(li);
                            } else {
                                ul.insertBefore(li, ul_childs[0]);
                            }
                        }
                        var as = $("box").getElementsByTagName("a");
                        for(var i = 0; i < as.length; i++) {
                            as[i].onclick = function() { //因为a是动态添加的 所以会绑定失效
                                //直接移除a标签的父亲即可  
                                //                        this.parentNode
                                var ul = $("box").getElementsByTagName("ul")[0];
                                ul.removeChild(this.parentNode);
                            }
                        }
                    }
                    //不执行原因是    因为a是动态添加的,而window.onload是一开始就要搜扫描的,
                    //                扫描到的话就可以绑定,例如按钮的绑定事件
                    //                扫描不到的话,就不能绑定,比如a标签的onclick
                var as = $("box").getElementsByTagName("a");
                for(var i = 0; i < as.length; i++) {
                    as[i].onclick = function() { //因为a是动态添加的 所以会绑定失效
                        //直接移除a标签的父亲即可  
                        //                        this.parentNode
                        var ul = $("box").getElementsByTagName("ul")[0];
                        ul.removeChild(this.parentNode);
                    }
                }
            }
        </script>
    </head>

    <body>
        <div id="box">
            微博发布:
            <textarea name="txt" rows="" cols=""></textarea>
            <button id="btn">发布</button>
        </div>
    </body>

</html>

 

转载于:https://www.cnblogs.com/sylz/p/5745984.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值