关于JS动态创建元素监听事件委托及遇到的问题

问题
在Js基础课上类似操作Dom评价的案例遇到的一个动态创建元素获取不到的问题,当时没考虑用委托事件。

  1. 当这样写的时候怎么也获取不到!这必须用到事件委托的方式后面有解决办法
<div>
    <textarea id="tfff" rows="10" cols="10"
              placeholder="请输入你的评价"></textarea>
    <input type="button" id="fbtn" value="发表">
</div>
<div id="evaluate"></div>

<script>
    window.onload = function () {
        var tff = document.getElementById('tfff');
        var fbtn = document.getElementById('fbtn');
        var evaluate = document.getElementById('evaluate');
        fbtn.onclick = function () {
            if (tff.value.length == 0) {
                alert("请输入内容呀");
                tff.focus();
                return;
            }
            var s_p = document.createElement("p");
            s_p.innerHTML = tff.value + "<span>删除</span>";
            con.appendChild(s_p);
            tff.value = "";
        };
        var ia = document.getElementsByTagName("span");
        for (let x = 0; x < ia.length; x++) {
            ia[x].onclick = function () {
                this.parentNode.parentNode.removeChild(this.parentNode);
            };
        }
        ;

    }

</script>
  1. 动态监听事件委托的方式解决
window.onload = function () {
        var tff = document.getElementById('tfff');
        var fbtn = document.getElementById('fbtn');
        var evaluate = document.getElementById('evaluate');
        fbtn.onclick = function () {
            if (tff.value.length == 0) {
                alert("请输入内容呀");
                tff.focus();
                return;
            }
            var s_p = document.createElement("p");
            s_p.innerHTML = tff.value + "<span>删除</span>";
            evaluate.appendChild(s_p);
            tff.value = "";
        };
        //父元素,子元素操作删除事件,注释掉的方法好像不是委托事件,之前学jquery老用这个方法删除元素
         evaluate.addEventListener('click', function (e) {
            // var span = document.getElementsByTagName("span")[0];
            // span.setAttribute('class', 'del');
            // var del = document.getElementsByClassName('del')[0];
            // del.parentNode.parentNode.removeChild(del.parentNode);
            e = e || window.event;
            var target=e.target||e.srcElement;
            evaluate.removeChild(target.parentNode);
        })
    }
  1. 最后一种解决方式就是在创建新元素的节点的下面写事件这样也是解决的
window.onload = function () {
        var tff = document.getElementById('tfff');
        var fbtn = document.getElementById('fbtn');
        var evaluate = document.getElementById('evaluate');
        fbtn.onclick = function () {
            if (tff.value.length == 0) {
                alert("请输入内容呀");
                tff.focus();
                return;
            }
            var s_p = document.createElement("p");
            s_p.innerHTML = tff.value + "<span>删除</span>";
            con.appendChild(s_p);
            tff.value = "";
            var ia = document.getElementsByTagName("span");
            for (let x = 0; x < ia.length; x++) {
                ia[x].onclick = function () {
                    this.parentNode.parentNode.removeChild(this.parentNode);
                };
            };
        };
    }

在这里插入图片描述
最后就放一个邋遢的效果图。
我是一个成长的小白,每天进步一点点把,虽然不知道能坚持到什么时候!
不懂就评价问总有大神帮我们解答嘻嘻;

JavaScript,为动态创建元素添加事件监听器时,需要特别注意事件绑定的时机。通常,如果我们直接在元素创建之后使用`addEventListener`方法,可能会发现事件并没有按预期工作,因为此时可能还没有完成元素的添加到DOM。为了解决这个问题,我们可以使用事件委托的方式或者确保在DOM元素已经渲染后再进行事件绑定。 使用事件委托的方式,我们可以将事件监听器添加到一个已经存在于DOM的父元素上,并且利用事件冒泡的特性来处理目标元素上的事件。示例如下: ```javascript // 假设有一个已存在的父元素容器 var container = document.getElementById('container'); // 动态创建一个按钮并添加到容器 var button = document.createElement('button'); button.textContent = '点击我'; container.appendChild(button); // 通过事件委托的方式为动态创建的按钮添加点击事件监听器 container.addEventListener('click', function(event) { // 检查事件目标是否是我们想要的按钮 if (event.target === button) { alert('按钮被点击了!'); } }); ``` 在这个例子,我们没有直接在动态创建的按钮上添加事件监听器,而是将监听器添加到了按钮的父容器上。这样,当按钮上的事件发生时,事件会冒泡到父容器,并由父容器上的监听器处理。 另一种方法是在将元素添加到DOM后立即添加事件监听器: ```javascript // 动态创建一个按钮 var button = document.createElement('button'); button.textContent = '点击我'; // 将按钮添加到容器 var container = document.getElementById('container'); container.appendChild(button); // 确保按钮已经添加到DOM后,为其添加事件监听器 button.addEventListener('click', function() { alert('按钮被点击了!'); }); ``` 这种方法要求我们确保在添加事件监听器时元素已经被渲染到DOM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值