Действительно ли возможно добавить к innerHTML, не уничтожая слушателей события потомков?

, глядя на исходный код Request.java , он заметно заявляет:

/**
 * Default encoding for POST or PUT parameters.
 * See {@link #getParamsEncoding()}.
**/
private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";

убедитесь, что файл с исходным кодом (как правило, имеет небольшой индикатор внизу прямо в Android Studio) и размещенный контент имеет кодировку UTF-8 (это довольно распространенная проблема в веб-разработке, которая может также применяться здесь). в случае, если контент не имеет кодировки UTF-8, его необходимо преобразовать перед публикацией, чтобы не получить заменяющий символ . см. этот пример для преобразования String.

также проверяют кодировку сценария, соединение с базой данных и базу данных на стороне сервера один раз; если какой-либо из них не поддерживает UTF-8, он не будет работать. это не обязательно проблема на стороне клиента (которая должна поддерживать UTF-8 из коробки).

98
задан Brian Tompsett - 汤莱恩 21 August 2019 в 18:52
поделиться

4 ответа

К сожалению, присвоение на innerHTML причины разрушение всех дочерних элементов, даже при попытке добавить. Если Вы захотите сохранить дочерние узлы (и их обработчики событий), то необходимо будет использовать функции DOM :

function start() {
    var myspan = document.getElementById("myspan");
    myspan.onclick = function() { alert ("hi"); };

    var mydiv = document.getElementById("mydiv");
    mydiv.appendChild(document.createTextNode("bar"));
}

Редактирование: решение Bob's, из комментариев. Отправьте свой ответ, Bob! Получите кредит для него.:-)

function start() {
    var myspan = document.getElementById("myspan");
    myspan.onclick = function() { alert ("hi"); };

    var mydiv = document.getElementById("mydiv");
    var newcontent = document.createElement('div');
    newcontent.innerHTML = "bar";

    while (newcontent.firstChild) {
        mydiv.appendChild(newcontent.firstChild);
    }
}
115
ответ дан Ben Blank 24 November 2019 в 05:15
поделиться

Как небольшое (но связанный) в стороне, если Вы пользуетесь библиотекой JavaScript, такой как jQuery (v1.3), чтобы сделать Ваше dom управление, можно использовать прямые трансляции, посредством чего Вы настраиваете обработчик как:

 $("#myspan").live("click", function(){
  alert('hi');
});

и это будет применено к тому селектору в любом случае во время любого вида управления jQuery. Поскольку прямые трансляции видят: docs.jquery.com/events/live для управления jQuery видит: docs.jquery.com/manipulation

2
ответ дан Cargowire 24 November 2019 в 05:15
поделиться

Потеря обработчиков событий, IMO, ошибка в способе, которым JavaScript обрабатывает DOM. Для предотвращения этого поведения можно добавить следующее:

function start () {
  myspan = document.getElementById("myspan");
  myspan.onclick = function() { alert ("hi"); };

  mydiv = document.getElementById("mydiv");
  clickHandler = mydiv.onclick;  // add
  mydiv.innerHTML += "bar";
  mydiv.onclick = clickHandler;  // add
}
0
ответ дан Yes - that Jake. 24 November 2019 в 05:15
поделиться

Я ленивый программист. Я не использую DOM, потому что это кажется лишним набором текста. Для меня чем меньше кода, тем лучше. Вот как я бы добавил «bar», не заменяя «foo»:

function start(){
var innermyspan = document.getElementById("myspan").innerHTML;
document.getElementById("myspan").innerHTML=innermyspan+"bar";
}
-3
ответ дан 24 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

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