Задать вопрос
Ingernirated
@Ingernirated
Романыч

Почему при задавании атрибуты переходит сразу же по ссылке?

Почему при установке атрибута сразу же происходит и переход по ссылке, а не при повторном нажатии?
<a class="a">page</a>
var a = document.querySelector(".a");
function change() {
a.innerHTML = "www.w3s.com";
a.setAttribute("href", "www.w3s.com");
}
a.addEventListener("click", change)
  • Вопрос задан
  • 171 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 4
villiwalla
@villiwalla
HTML-верстка
Потому что не отменено стандартное поведение
Ответ написан
Комментировать
@AntowaKartowa
Потому что клик по ссылке по умолчанию обрабатывается браузером как инструкция для перехода по ссылке. Что вроде бы очевидно) Для отмены действий по умолчанию традиционно ипсользуется конструкция event.preventDefault(); где event объект события. Обработчик события ( в данном случае change ) получает его первым аргументом: function change(event) {...} И возможно стоит сделать фоллбек для старых версий эксплорера event = event || window.event который объект события не передает и значение его можно получить из глобального объекта.

Очевидно событие по умолчанию отрабатывает в конце - после того как все пользовательские обработчики события закончили свое выполнение. Иначе как бы event.preventDefault() мог остановить событие после его выполнения. А значит на момент выполнения действия по умолчанию функция change уже установила аттрибут href. Вроде так
Ответ написан
abyrkov
@abyrkov
JavaScripter
Браузер: О, этот унылый мудак нажал на кнопку.
Браузер: Сгенерирую я-ка событие.
Ты: Обрабатываешь событие
Браузер: О, он не вызвал Event.preventDevaults
Браузер: Так-с, что там у нас по умолчанию? Переход по ссылке? Дай две.
Ответ написан
Комментировать
Omny
@Omny
Думаю так будет понятнее:

var a = document.querySelector(".a");
function change(e) {
	e.preventDefault()
	a.innerHTML = "www.w3s.com";
	a.setAttribute("href", "www.w3s.com");
	a.removeEventListener("click", change);
}
a.addEventListener("click", change)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы