Захват всего события <a>click - программирование
Подтвердить что ты не робот

Захват всего события <a>click

Я собираюсь добавить функцию javascript для захвата всех событий <a> на странице html.

Итак, я добавляю глобальную функцию, которая управляет всеми событиями <a> click, но не добавляет onclick для каждого (ни с помощью .onclick=, ни attachEvent(onclick...), ни inline onclick=). Я оставлю каждый <a> так же просто, как <a href="someurl"> внутри html, не касаясь их.

Я пробовал window.onclick = function (e) {...} но это просто захватывает все клики Как указать только клики на <a> и извлечь ссылки внутри <a>, которые вы нажимаете?

Ограничение. Я не хочу использовать библиотеки exra, такие как jQuery, просто ванильный javascript.

4b9b3361

Ответ 1

Вы можете обрабатывать все щелчки, используя window.onclick, а затем фильтровать с помощью event.target

Пример, который вы задали:

<html>
<head>
<script type="text/javascript">
window.onclick = function(e) { alert(e.target);};
</script>
</head>
<body>
<a href="http://google.com">google</a>
<a href="http://yahoo.com">yahoo</a>
<a href="http://facebook.com">facebook</a>
</body>
</html>

Ответ 2

Используйте что-то вроде:

document.body.onclick = function(e){
  e = e || event;
  var from = findParent('a',e.target || e.srcElement);
  if (from){
     /* it a link, actions here */
  }
}
//find first parent with tagName [tagname]
function findParent(tagname,el){
  while (el){
    if ((el.nodeName || el.tagName).toLowerCase()===tagname.toLowerCase()){
      return el;
    }
    el = el.parentNode;
  }
  return null;
}

Этот метод называется делегирование событий

[ edit] добавлена ​​функция, позволяющая клиенту нажимать на ширину ссылок вложенные html-элементы, например:
<a ...><b><i>link text</i></b></a>

Ответ 4

Вам нужно учесть, что ссылка может быть вложена с другими элементами и хочет пересечь дерево обратно к элементу "a". Это работает для меня:

window.onclick = function(e) {
  var node = e.target;
  while (node != undefined && node.localName != 'a') {
    node = node.parentNode;
  }
  if (node != undefined) {
    console.log(node.href);
    /* Your link handler here */
    return false;  // stop handling the click
  } else {
    return true;  // handle other clicks
  }
}

См. https://jsfiddle.net/hnmdijkema/nn5akf3b/6/

Ответ 5

ваша идея делегировать событие в окно, а затем проверить, является ли "event.target" ссылкой, является одним из способов (лучше будет document.body). Проблема в том, что он не будет работать, если вы нажмете на дочерний элемент node вашего элемента. Подумайте:

<a href="#"><b>I am bold</b></a>

target будет элементом <b>, а не ссылкой. Это означает, что проверка e.target не будет работать. Таким образом, вам нужно будет сканировать все дерево dom, чтобы проверить, является ли элемент с щелчком потоком элемента <a>.

Другим методом, который требует меньше вычислений при каждом щелчке, но стоит больше инициализировать, было бы получить все теги <a> и прикрепить ваше событие в цикле:

var links = Array.prototype.slice.call(
    document.getElementsByTagName('a')
);

var count = links.length;
for(var i = 0; i < count; i++) {
    links[i].addEventListener('click', function(e) {
        //your code here
    });
}

(PS: зачем я конвертирую HTMLCollection в массив? вот ответ.)

Ответ 6

Вы также можете попробовать:

var forEach = Array.prototype.forEach;
var links = document.getElementsByTagName('a');
forEach.call(links, function (link) {
    link.onclick = function () {
        console.log('Clicked');
    }

});

Он работает, я просто тестировал!

Рабочая демонстрация: http://jsfiddle.net/CR7Sz/

Где-то в комментариях вы упомянули, что хотите получить значение "href", которое вы можете сделать с этим:

var forEach = Array.prototype.forEach;
var links = document.getElementsByTagName('a');
forEach.call(links, function (link) {
    link.onclick = function () {
        console.log(link.href); //use link.href for the value
    }

});

Демо: http://jsfiddle.net/CR7Sz/1/

Ответ 7

Попробуйте jQuery и

$('a').click(function(event) { *your code here* });

В этой функции вы можете извлечь значение href таким образом:

$(this).attr('href')

Ответ 8

Я думаю, этот простой код будет работать с jquery.

 $("a").click(function(){
    alert($(this).attr('href'));
});

Без JQuery:

window.onclick = function(e) { 
if(e.target.localName=='a')
    alert(e.target);
};

Вышеприведенный результат даст тот же результат.

Ответ 9

Очень просто:

document.getElementById("YOUR_ID").onclick = function (e) {...} 

Селектор - это то, что вы хотите выбрать, поэтому скажем, что у вас есть кнопка с именем

<a href="#" id="button1">Button1</a>

Код для этого:

document.getElementById("button1").onclick = function (e) { alert('button1 clicked'); }

Надеюсь, что это поможет.