Ответ 1
Когда вы работаете с битами HTML-документа, вы должны стремиться работать с объектами Node, которые являются содержимым, которое видит браузер, а не строками HTML.
Чтобы получить HTML, браузер должен посмотреть Узлы и сериализовать их в строку. Затем, когда вы назначаете этот HTML для другой части документа (с помощью innerHTML
или jQuery html(...)
), вы сообщаете обозревателю об уничтожении всего содержимого, которое было ранее в элементе, кропотливо разбирайте строку HTML обратно в новую набор объектов Node и вставить эти новые узлы в элемент.
Это медленно, расточительно и теряет любой аспект исходных объектов Node, которые не могут быть выражены в сериализованном HTML, например:
- функции/прослушиватели событий (вот почему ваши редакторы ломаются)
- ссылки на переменные другого кода JavaScript для узлов (также разрывает скрипты)
- значения поля формы (кроме, частично, в IE из-за ошибки)
- пользовательские свойства
Итак - и это касается того, используете ли вы jQuery или просто DOM - не бросайте HTML! Возьмите исходные объекты Node и вставьте их в нужное место (они покинут место, из которого они первоначально были автоматически). Ссылки остаются неизменными, поэтому скрипты будут работать.
// contents() gives you a list of element and text node children
var working = $("#working_pane").contents();
var ref = $("#reference_pane").contents();
// append can be given a list of nodes to append instead of HTML text
$("#working_pane").append(ref);
$("#reference_pane").append(working);