Событие
Click имеет свойство isTrusted
, которое получает false
, если клик был инициирован скриптом. Я надеялся, что нажатие на метку тоже покажет false ... но оказалось, что это правда. Вы по-прежнему можете эмулировать поведение метки и использовать isTrusted
, если это не имеет значения для других частей кода.
document.addEventListener("click", function(e) {
let label = e.target.closest(".pseudo-label");
if(!label) return;
if( e.target.closest("#" + label.dataset.for ) ) return;
document.getElementById( label.dataset.for ).click();
});
document.querySelector("#foo").addEventListener("click", function(event) {
console.log(event.isTrusted);
});
.pseudo-label {
border: 1px solid red;
padding: 15px;
user-select: none;
}
<div class="pseudo-label" data-for="foo">Click me to trigger the button <button id="foo">I'm a button</button> </div>
Но это кажется бесполезным))
Вы можете просто разделить код на два разных слушателя и использовать логическую переменную для определить необходимый щелчок:
let labelClicked = false;
first('label[for="foo"]').addEventListener("click", function() {
labelClicked = true;
console.log("label click");
});
first("#foo").addEventListener("click", function(e) {
console.log("general click"); // You might divide this in two...
if( labelClicked ) return labelClicked = false;
console.log("button click"); //...separate function calls.
});
/***/
function first(selector) { return document.querySelector(selector); }
label {
border: 1px solid red;
padding: 15px;
user-select: none;
}
<label for="foo">Click me to trigger the button</label>
<button id="foo">I'm a button</button>