Javascript Vanilla - обработчик событий двойного щелчка на входах / GetElementsByTagName

Проблема: Невозможно назначить обработчик событий двойного щелчка моим сгенерированным входам; это возможно с помощью getElementsByTagName?

Спасибо за любую помощь

Вот код:


Сгенерированные входы

function list_tasks() {
    let container = document.getElementById("todo");
    container.innerHTML = ""

    if (task_array.length > 0) {
        for (let i = 0; i < task_array.length; i++) {
            let input = document.createElement("input");
            input.value = task_array[i];
            input.classList.add("record");
            input.disabled = true;
            container.appendChild(input);
        }
    }
}

Прикрепление события

document.getElementsByClassName("record").addEventListener("dblclick", editTask);

И console.log никогда не вызывается

function editTask(e){
   console.log("double click")
}

Обновление Попытка перебрать массив, но событие двойного щелчка не запускается

let record = document.getElementsByClassName("record");
for(var i = 0; i <= record.length; i++){
    document.getElementsByClassName("record")[i].addEventListener("dblclick", editTask);
}

3 ответа

getElementsByClassName возвращает список узлов, то есть массив. Для доступа к элементу необходимо получить значение из массива.

Попробуй это:

document.getElementsByClassName("record")[0].addEventListener("dblclick", editTask);

Это должно работать.

Причина, по которой это не работает, заключается в том, что вы помечаете входы как отключенные. Отключенные входы не реагируют на некоторые события, и похоже, что двойной щелчок является одним из них.

Кроме того, как писал @Royson, getElementsByClassName() возвращает список из нескольких элементов. Если вы хотите добавить прослушиватель событий для всех них, у вас есть 2 варианта:

Наилучший вариант IMO, если это возможно, это прикрепить его при создании элементов в list_tasks() функция:

let input = document.createElement("input");
input.value = task_array[i];
input.classList.add("record");
input.disabled = true;
input.addEventListener("dblclick", editTask); // <--- here
container.appendChild(input);

Если это невозможно из-за недоступности областей, вы просто зацикливаетесь на результате getElementsByClassName():

Array.from(document.getElementsByClassName("record")).forEach(el => el.addEventListener("dblclick", editTask));

Редактировать: спецификация говорит, что события "щелчка" должны быть отключены на отключенном входе. Несмотря на то, что двойной щелчок не указан напрямую, я предполагаю, что это также подразумевается как щелчок, или он требует, чтобы щелчок был включен, чтобы он мог поймать два быстрых. https://html.spec.whatwg.org/multipage/form-control-infrastructure.html

Способ сделать это состоит в том, чтобы создать элементы как элементы списка, а затем сделать contentEditable для элементов списка по двойному щелчку B-)

Другие вопросы по тегам