Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно указать обработчик события? (https://javascript.ru/forum/misc/65768-kak-pravilno-ukazat-obrabotchik-sobytiya.html)

Ostic 06.11.2016 22:09

Как правильно указать обработчик события?
 
есть код, создающий следующую структуру:
<div>
  <p>
      <a>ссылка1</a>
  </p>
  <p>
      <a>ссылка2</a>
  </p>
  <p>
      <a>ссылка3</a>
  </p>
</div>

вот, собственно, скрипт:
var arr = localStorage.list ? JSON.parse(localStorage.list) : [];
var len = arr.length;
 
(function createHTML(){
    var div = document.createElement('div');
    div.className = "links-domain";
    document.body.appendChild(div);
    var p;
    var a;
    for (var i=0; i < len; i++){
        p = document.createElement('p');
        p.innerText = (i+1) + ".";
        div.appendChild(p);
        a = document.createElement('a');
        a.href = "http://www." + arr[i].domain;
        a.id = a.innerText = arr[i].name;
        p.appendChild(a);
    }
})();
 
document.addEventListener('DOMContentLoaded', addListener);
function addListener(){
    for (var j=0; j < len; j++){
            var elem = document. getElementById(arr[j].name);
            elem.onclick = clickHandler(elem.href);//function(){chrome.tabs.create({url: elem.href})};
                        //если сделать как в коментарии выше, то открывается только последняя ссылка
    };
}
 
function clickHandler(url_){
        chrome.tabs.create({url: url_});
}

почему открываются сразу все вкладки или
только какая-то одна при клике на любой ссылке?
как в подобных случаях правильно создавать обработчики, да и, вообще, структуры, указанные выше?

Aetae 06.11.2016 22:24

clickHandler() - скобочки в конце имени функции значат вызов этой функции прямо сейчас. В elem.onclick попадает уже результат вызова данной функции(тут: undefined), тогда как сама функция сразу вызывается в цикле.

function addListener(){
  for (var j=0; j < len; j++){
    var elem = document. getElementById(arr[j].name);
    elem.onclick = clickHandler;
  };
}

function clickHandler(event){  
  chrome.tabs.create({url: this.href}); //this - ссылка на вызвавший событие elem
}

Ostic 06.11.2016 23:10

да, Вы правы.


Часовой пояс GMT +3, время: 06:19.