简体   繁体   English

无法添加监听器?

[英]Can't add listener?

Here I am again with another problem. 在这里,我再次遇到另一个问题。 The problem is that I can't add event listeners on the URLs I'm adding manually. 问题是我无法在手动添加的URL上添加事件侦听器。 Is there something I am missing? 我有什么想念的吗? I thought this was the proper way of adding elements to DOM. 我认为这是向DOM添加元素的正确方法。

popup.js popup.js

window.addEventListener('DOMContentLoaded', function() {
  var urls= document.querySelectorAll('a.url');
  for(i=0,len=urls.length;i<len; i++) {
    urls[i].addEventListener('click', function() {
      chrome.tabs.create({url: this.href});
    }, false);
  }
}, false);

chrome.storage.local.get(['bookmarks'], function(data) {
  var jsonString = JSON.stringify(data);
  var resultObject = JSON.parse(jsonString);
  //var body = document.body;
  for(var i in resultObject.bookmarks) {
    var bookmark = resultObject.bookmarks[i];
    var div = document.createElement('div');
    var a = document.createElement('a');
    var body = document.body;
    body.appendChild(div);
    div.appendChild(a);
    a.setAttribute('class', 'url');
    a.setAttribute('href', bookmark.url);
    a.innerHTML = bookmark.title;
  }
});

I also have an HTML file I used to have the URLs in, but I removed those in favour of the javascript file allowing users to add URLs manually. 我也有一个HTML文件,以前曾经在其中添加URL,但是我删除了那些支持JavaScript文件的文件,该文件允许用户手动添加URL。

Regards, 问候,

You can add event listeners to DOM elements you add manually, but you either have to add the event listeners AFTER you've created the DOM elements or you have to switch to using delegated event handling on a parent object or change the timing of when you add the event listeners in your current loop until all your dynamic links are already created. 您可以将事件侦听器添加到手动添加的DOM元素中,但是要么在创建DOM元素后添加事件侦听器,要么必须切换到对父对象使用委托事件处理,或者更改何时在当前循环中添加事件侦听器,直到所有动态链接都已创建。

In this case, I'd suggest that you just add the event handler right when you create the new links. 在这种情况下,建议您仅在创建新链接时添加事件处理程序。

function linkClick() {
    chrome.tabs.create({url: this.href});
}

window.addEventListener('DOMContentLoaded', function() {
  var urls= document.querySelectorAll('a.url');
  for(i=0,len=urls.length;i<len; i++) {
    urls[i].addEventListener('click', linkClick, false);   // <== change this
  }
}, false);

chrome.storage.local.get(['bookmarks'], function(data) {
  var jsonString = JSON.stringify(data);
  var resultObject = JSON.parse(jsonString);
  //var body = document.body;
  for(var i in resultObject.bookmarks) {
    var bookmark = resultObject.bookmarks[i];
    var div = document.createElement('div');
    var a = document.createElement('a');
    var body = document.body;
    body.appendChild(div);
    div.appendChild(a);
    a.setAttribute('class', 'url');
    a.setAttribute('href', bookmark.url);
    a.innerHTML = bookmark.title;
    a.addEventListener('click', linkClick, false);   // <== add this
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM