【问题标题】:Javascript addEventListener not working for a specific elementJavascript addEventListener 不适用于特定元素
【发布时间】:2017-12-09 10:17:47
【问题描述】:

我遇到了一个奇怪的问题:我使用 Javasript 创建了 8 个不同的 HTML 元素(每个元素的方式几乎完全相同)并向它们添加事件侦听器,但是 1 个特定元素没有添加事件侦听器。

这是运行良好的元素之一的代码:

var primaryProductImageLink = document.createElement("a");
primaryProductImageLink.setAttribute("id", "primaryProductImageLink");
primaryProductImageLink.setAttribute("href", result.primaryProduct.pageLink);
primaryProductImageLink.setAttribute("data-resultRequestID", getResultResponse.resultRequestID);
primaryProductImageLink.setAttribute("data-linkName", "primaryProduct");
primaryProductImageLink.addEventListener("click", clickedLinkInResultSection);

这里是没有应用任何事件监听器的元素的代码:

var primaryProductNameLink = document.createElement("a");
primaryProductNameLink.setAttribute("id", "primaryProductNameLink");
primaryProductNameLink.setAttribute("href", result.primaryProduct.pageLink);
primaryProductNameLink.setAttribute("data-resultRequestID", getResultResponse.resultRequestID);
primaryProductNameLink.setAttribute("data-linkName", "primaryProduct");
primaryProductNameLink.addEventListener("click", clickedLinkInResultSection);

当我清除缓存、上传更改并查看页面时,我运行以下命令并确认事件侦听器已添加到第一个元素而不是第二个元素:

getEventListeners(document.getElementById("primaryProductImageLink"));
{点击:数组(1)}
getEventListeners(document.getElementById("primaryProductNameLink"));
{}

但是,如果我将以下代码添加到 Javascript 的最后,事件侦听器将成功添加到 primaryProductNameLink 元素:

document.getElementById("primaryProductNameLink").addEventListener("click", clickedLinkInResultSection);

验证:

getEventListeners(document.getElementById("primaryProductNameLink"));
{点击:数组(1)}

我已尝试向此元素添加不同的事件侦听器,但均未奏效。我也添加了测试属性,它们显示得很好。测试代码:

var primaryProductNameLink = document.createElement("a");
primaryProductNameLink.setAttribute("id", "primaryProductNameLink");
primaryProductNameLink.setAttribute("href", result.primaryProduct.pageLink);
primaryProductNameLink.setAttribute("data-resultRequestID", getResultResponse.resultRequestID);
primaryProductNameLink.setAttribute("data-linkName", "primaryProduct");
primaryProductNameLink.addEventListener("mouseover", function() { console.log("test"); });
primaryProductNameLink.addEventListener("mouseout", function() { console.log("test"); });
primaryProductNameLink.addEventListener("click", clickedLinkInResultSection);
primaryProductNameLink.setAttribute("data-test", "test");

结果: .

我已经浏览了整个 Javascript 文件,并且没有其他对“primaryProductNameLink”的引用可能会删除任何事件侦听器。

我知道有一些解决方法(比如我通过在脚本末尾添加事件侦听器来展示的解决方法),但我真的很好奇并且很想知道是什么导致了这个问题。谢谢!

编辑:完整的 Javascript 可以在这里找到:https://jsfiddle.net/fbchm4ov/(我的帖子中描述的元素只有在回答了 4 个问题后才会生成。)

【问题讨论】:

  • 抱歉现在评论了三遍。 jsFiddle 会很棒,我很想深入研究。
  • 也许clickedLinkInResultSection 在您绑定的范围内未定义?我只能猜测 atm。
  • @Syntac 我添加了一个带有完整 javascript 文件的 jsfiddle 链接。生成这些元素的代码在函数“getProductSelectorResultCallback”中。
  • 我仍在努力,试图找出确切的问题。到目前为止我发现了什么:当你开始修改 primaryProductInfoDiv.innerHTML 时,事情就开始崩溃了。为什么这是个问题?好吧,您首先添加真正的 DOM 元素,然后您再次开始将 primaryProductInfoDiv.innerHTML 处理为纯文本,我相信这会破坏您之前掌握的有关 EventListeners 的信息。一般来说,在这种程度上使用innerHTML 是不好的做法。我鼓励你根本不要使用它,我相信这会解决你的问题。
  • 由于图像primaryProductImageLink 不是primaryProductInfoDiv 的子图像,因此不受该问题的影响。这就是原因,它工作得很好。另一件事:后来添加 EventListener 起作用的原因是您在更改 innerHTML 之后添加了它,所以这次在编辑 innerHTML 时它没有丢失。

标签: javascript addeventlistener


【解决方案1】:

从我读到的小提琴中,您将primaryProductNameLink 附加到primaryProductInfoDiv,之后您使用primaryProductInfoDiv.innerHTML += 修改primaryProductInfoDiv

当您设置innerHTML 属性时,您将覆盖在那里设置的现有 HTML。

在做

 primaryProductInfoDiv.innerHTML += '<br>';

基本上是使用当前的innerHTML 结构加上&lt;br&gt; 创建一个新的HTML 结构并将其分配给innerHTML。您的事件处理程序附加到旧的 innerHTML,而不是新的。

因此,我们可以使用createElementappendChild 来避免这种问题,而不是进行串联。

【讨论】:

  • 你成功了。我通过创建和附加元素替换了所有“primaryProductInfoDiv.innerHTML +=" 行,现在在primaryProductNameLink 上找到了监听器。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 2017-07-10
  • 1970-01-01
  • 2015-12-04
  • 2019-06-28
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多