Javascript: Проблемы С Событием Щелчка При Использовании Requestanimationframe

Внезапно я столкнулся с забавной проблемой.

Кратко суть можно описать следующим образом.

Допустим, вы используете requestAnimationFrame для динамического изменения цвета текста, например:

  
  
  
  
  
  
   

function render() { element.innerHTML = "<font color='#555'>some text</font>"; requestAnimationFrame(render); }

Если теперь прикрепить к элементу (или всему документу) обработчик события onclick и затем щелкнуть по тексту, то.

ничего не произойдет. Подробнее Итак, давайте создадим div:

<div id="main"></div>

Растянем его на весь экран:

#main { width: 100%; height: 100%; position: absolute; cursor: default; background-color: #CCC; font-size: 30vh; }

Теперь код:

function render() { document.getElementById("main").

innerHTML = "<font color='#555'>click here</font>"; requestAnimationFrame(render); } document.body.addEventListener("click", function(e) { console.log("click"); }); render();

Поиграйтесь с кодом ты можешь здесь .

Результат следующий:

  • при нажатии на текст ничего не происходит, событие не происходит
  • При нажатии в любой другой части main происходит событие, в консоли отображается «клик».

Дополнительные моменты:
  • если убрать шрифт и оставить только текст, то происходит щелчок
  • если заменить шрифт на span, то щелчка все равно не происходит
  • если закомментировать строку requestAnimationFrame(render), то происходит клик
  • другие события, такие как перемещение мыши, происходят как положено, как над текстом, так и без него.

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

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

Создайте класс символов с методом getText, возвращающим текущий цвет символа, примерно так:

// some code symbol.prototype.getText = function() { return "<font color='" + this._color + "'>" + this._text + "</font>"; };

Затем в requestAnimationFrame вставляем пересчет цвета и выводим на экран все символы по одному.

Остается только добавить обработку «щелчка».

Решение Первое, что пришло в голову, — это лобовое решение.

Давайте добавим еще один div:

<div id="click"></div>

Тот же размер, что и основной, но прозрачный и с более высоким индексом z:

#click { width: 100%; height: 100%; position: absolute; cursor: default; opasity: 0; z-index: 100; }

После этого нажатие на текст и за его пределами работает нормально.

Из других вариантов на ум приходит только следующий.

Заранее добавьте элемент span с уникальным индексом для каждого символа и просто измените цвет в requestAnimationFrame с помощью document.getElementById("span_id").

style.color. Мне этот вариант кажется слишком громоздким.

Послесловие Конкретную причину такого поведения щелчка я так и не понял.

Если есть люди, которые понимают, что здесь происходит, поделитесь, пожалуйста, своей мудростью.

Спасибо! Обновлять Как указано Зибкс в комментариях, чтобы событие щелчка произошло, события mousedown и mouseup должны произойти на одном и том же элементе.

Поскольку в этом случае indexinnerHTML постоянно обновляется, этого не происходит. Теги: #JavaScript #requestanimationframe #click #JavaScript

Вместе с данным постом часто просматривают: