【问题标题】:Why can an event not be attached in the script but in the console?为什么不能在脚本中附加事件而在控制台中?
【发布时间】:2018-07-29 20:12:30
【问题描述】:

我想用 html 和 javascript 动态创建、填充和清除列表。列表的创建和填充工作正常,但是当我想将删除按钮添加到列表项时,我无法将 onclick 事件附加到新创建的元素。这是我的完整函数,每次printlist 数组发生一些变化时都会调用它:

var printlist = [];
var awesome = document.createElement("i");
awesome.className = "fa fa-minus";

function addToList(stationid, stationname)
{
    var object = {id: stationid, name: stationname};
    printlist.push(object);
    drawList();
}

function removeFromList(id)
{
    printlist.splice(id, 1);
    drawList();
}

function drawList()
{
    if (printlist.length > 0)
    {
        document.getElementById("printListDialog").style.visibility = 'visible';
        var dlg = document.getElementById("DlgContent");
        dlg.innerHTML = "";
        for (var i = 0; i < printlist.length; i++)
        {
            var item = document.createElement("li");
            item.className = "list-group-item";
            var link = document.createElement("a");
            link.href = "#";
            link.dataset.listnumber = i;
            link.style.color = "red";
            link.style.float = "right";
            link.appendChild(awesome);
            link.onclick = function(){onRemove();};
            item.innerHTML = printlist[i].name + " " + link.outerHTML;
            dlg.appendChild(item);
        }
    }
    else
    {
        document.getElementById("printListDialog").style.visibility = 'hidden';
    }
}

function onRemove(e)
{
    if (!e)
        e = window.event;
    var sender = e.srcElement || e.target;
    removeFromList(sender.dataset.listnumber);
}

我试过了:

link.onclick = function(){onRemove();};

还有

link.addEventListener("click", onRemove);

这两行都没有成功从脚本中添加事件。但是,当我从控制台调用上述 2 行中的任何一行时,它可以工作并且事件已附加。

为什么它可以从控制台运行,但不能从脚本运行?

【问题讨论】:

  • 您确实意识到您只能在创建元素时将事件附加到元素。因此,在您实际将元素放入 DOM 之后。
  • 什么是 -> awesome
  • 应该工作:jsfiddle.net/jnwrc5ay/473
  • @Leon So after you actually placed the element in the DOM 元素不需要成为 DOM 的一部分才能附加事件,但当然需要创建.. :)

标签: javascript dom addeventlistener dom-events


【解决方案1】:
link.onclick = function(){onRemove();};

不起作用,因为您没有通过 event 参数。 link.onclick = onRemove 应该与您的 addEventListener 通话一样工作。

但是,由于线路的原因,它们都不起作用

item.innerHTML = printlist[i].name + " " + link.outerHTML;

它破坏了link 元素及其所有动态数据,如.dataset.onclick,并形成一个不包含它们的原始html 字符串。他们迷路了。

不要使用 HTML 字符串!

将行替换为

item.appendChild(document.createTextNode(printlist[i].name + " "));
item.appendChild(link); // keeps the element with the installed listener

【讨论】:

  • 谢谢。用你的 2 行替换 innerhtml 行。但是,除了 onclick 之外的每个属性都事先存在于结果节点中。
  • 啊,对了,所有其他属性都是reflected as attributes,所以它们会被outerHTML接走
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2013-09-17
  • 2013-07-24
  • 2012-07-16
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多