Попытка изменить свойства DOM элемента, но изменения игнорируются после того, как я использую document.body.innerHTML + =.Если порядок поменялся, все работает нормально - PullRequest
0 голосов
/ 01 октября 2018

Мне было трудно сформулировать заголовок этого вопроса, но я не смог найти ничего более краткого.

Я хочу прикрепить какое-либо событие oninput к элементу (здесь поле input).Но по какой-то причине это не сработало.Я сузил проблему до схемы MWE (завершите MWE в конце).

addEvent();
document.body.innerHTML += "a";

addEvent() была просто функцией, которая изменяла свойство oninput поля input.Моя проблема заключалась в том, что addEvent() был проигнорирован.

Чтобы убедиться, что addEvent(); работает нормально, я также изменил value поля input и его backgroundColor в теле функции,Тем не менее, когда я запустил код, модификаций oninput и value нигде не было найдено, но backgroundColor был изменен в соответствии с функцией.

Более загадочно, если я напишу

document.body.innerHTML += "a";
addEvent();

Все работает как положено.

Мой вопрос состоит из двух частей:

  • как мне исправить код addEvent(), чтобы не былоимеет значение, если я напишу document.body.innerHTML += "a" до или после, результат будет одинаковым?
  • почему backgroundColor работает нормально, а остальные, кажется, игнорируются?

Вот мой полный MWE ниже:

function addEvent() {
    var fieldScore = document.getElementById("foo");
    fieldScore.style.backgroundColor = "rgb(0,255,0)";
    fieldScore.value = "a";
    fieldScore.oninput = function () {
        console.log("bar");
    }
}

// document.body.innerHTML = buildForm();
addEvent();
document.body.innerHTML += "a";
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
    <form><input type="text" value="" name="foo" id="foo"></form>
    <script type="text/javascript" src="mwe.js"></script>
</body>

</html>

Ожидается: то же самое, но с a в поле input.

1 Ответ

0 голосов
/ 01 октября 2018

innerHTML += почти всегда является анти-паттерном.Это заставляет браузер сделать следующее:

  • Перебрать все дочерние элементы, дочерние элементы и т. Д. Элемента, на котором вы это делаете, и построить строку HTML.
  • Appendтекст этой строки.
  • Уничтожить все эти дочерние элементы (и их дочерние элементы и т. д.), проанализировать строку HTML и заменить их новыми элементами, созданными в результате анализа строки.

При этом обработчики событий и любая другая не HTML-информация об уничтожаемых элементах теряется.

Если вам нужно добавить элемент, используйте appendChild или insertAdjacentHTML.Например:

document.body.appendChild(document.createTextNode("a"));

или

document.body.insertAdjacentHTML("beforeend", "a");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...