【发布时间】: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