Отказ от ответственности:
Я слишком часто взлетел здесь, пытаясь обеспечить достаточный контекст, чтобы упредить все вопросы, которые у вас есть у меня. Не пугайтесь по длине этого вопроса: многое из того, что я написал, очень скудно (особенно потенциальные решения, которые я придумал).
Цель:
Эффект, который я надеюсь достичь, отображает один и тот же элемент (и всех потомков) в нескольких местах на одной странице. Мое текущее решение (см. Ниже более подробно) включает в себя клонирование/копирование, а затем добавление во все другие места, которые я хочу, чтобы он отображался в DOM. То, что я прошу здесь, - лучшее (более эффективное) решение. У меня есть несколько идей для потенциально более эффективных решений (см. Ниже). Пожалуйста, судите/критикуйте/увольняйте/дополняйте их или добавляйте свое собственное более-блестящее решение!
"Почему?" вы спрашиваете?
Ну, элемент (и его потомки), который я хочу отображать более одного раза, потенциально имеет множество атрибутов и содержимого - поэтому клонирование и добавление его где-то еще (иногда более чем в одном месте) могут быть довольно манипуляционной работой DOM-манипуляции.
Некоторый контекст:
Я не могу точно описать ситуацию (чертовски NDA!), но по существу у меня есть редактор документов WYSIWYG html. Когда человек редактирует DOM, я фактически сохраняю "оригинальный" node и "измененный" node, обертывая их как в div, скрывая "оригинал", так и позволяя пользователю изменять новый ( "изменено" ) node на их содержание в сердце. Таким образом, пользователь может легко просмотреть изменения, которые они сделали, прежде чем сохранять их.
До этого я просто позволял пользователю перемещаться по "diff divs" и временно скрывать "оригинал" node, чтобы показать изменения "inline". То, что я пытаюсь сделать сейчас, - это позволить пользователю увидеть весь "оригинальный" документ и отредактированный ( "измененный" ) документ в бок о бок. И, возможно, я хотел бы сохранить изменения через несколько сеансов редактирования и одновременно показывать "N" количество версий одновременно.
Текущее решение:
Мое текущее решение для достижения этого эффекта следующее:
Оберните весь dang dom (ну, кроме "панелей инструментов" и всего, что они фактически не редактируют) в div (который я назову "pane1" ), и создайте новый div (что я буду вызовите "pane2" ). Затем глубокое клонирование содержимого pane1 в pane2, а в pane1 отображаются только "оригинальные" узлы, а на панели2 отображаются только "измененные" узлы (в областях различий - все, кроме этого, будет отображаться/скрываться тумблером в панель инструментов). Затем повторите это для панелей 3-через-N.
Проблема с текущим решением:
Если документ, редактируемый пользователем, становится очень длинным или содержит изображения/видео (с различными атрибутами src) или содержит множество необычных элементов стиля (столбцы, таблицы и т.д.), тогда DOM может потенциально получить очень большой/сложный, и попытка клонировать и манипулировать им может привести к медленному сканированию браузера или умению (в зависимости от размера/сложности DOM и количества клонов, а также эффективности браузера/машины, на которой он работает). Если размер проблемы, я могу, конечно, сделать что-то вроде удаления на самом деле скрытых узлов из DOM, но это еще больше операций манипулирования DOM с помощью ресурсов hogging.
Потенциальные решения:
1. Найдите способ сделать DOM более простым/легким
так что клонирование/манипулирование, которое я сейчас делаю, более эффективно. (конечно, я пытаюсь сделать это как можно больше, но, возможно, все, что я действительно могу сделать).
2. Создавайте статические представления версий с элементами Canvas или чем-то.
Я слышал там трюк, в котором вы можете обернуть HTML в элементе SVG, а затем использовать его как источник изображения и нарисовать на холсте. Я думаю, что эти статические холсты (canvi?) Будут иметь гораздо меньший объем памяти, чем клонированные узлы DOM. И манипулирование DOM (скрытие/отображение соответствующих узлов), затем рисование изображения (полоскание и повторение) должно быть более быстрым и эффективным, чем клонирование node и манипулирование клонами. (может быть, я ошибаюсь в этом? Пожалуйста, скажите мне!)
Я пробовал это в ограниченной емкости, но обертываю свой HTML в беспорядках SVG тем, как он отображался в нескольких странных случаях - возможно, мне просто нужно немного сообщить о элементах, чтобы они отображались правильно.
3. Найдите волшебный элемент
который просто ссылается на другой node и выглядит/действует как он, не будучи настоящим клоном (и, следовательно, как-то волшебным намного более легким). Даже если это означало, что я не мог манипулировать этим волшебным элементом отдельно от node его "ссылки" (или его поддельных детей) - в этом случае я все еще мог бы использовать это для неизменных частей и, надеюсь, сбрил бы использование памяти /DOM Manipulation.
4. Выполните некоторые шаги на стороне сервера.
У меня есть возможность выполнять код на стороне сервера, так что, возможно, это намного эффективнее (некоторые из моих пользователей могут быть на мобильных или старых устройствах), чтобы получить все ajax-y и отправить соответствующую часть DOM (может быть "корнем" документа, который пользователь редактирует, или просто особо "diff divs" ) на клонированный/управляемый сервер, затем запрашивать "клоны", управляемые сервером, и вставлять их в соответствующие области/места.
5. Подделайте его, чтобы сделать его "более комфортным"
Вместо того, чтобы выполнять эти операции за один раз и заставляя браузер ждать, пока не будут выполнены операции для повторного рисования пользовательского интерфейса, я мог бы выполнять операции в "кусках" и позволить браузеру повторно отображать и перехватывать передышку раньше делая следующий кусок. Вероятно, это на самом деле приведет к увеличению времени, но для обычного пользователя он может "чувствовать" быстрее (ха-ха, глупые дураки...). В конце концов, я полагаю, именно это очень важно для пользователей.
Сноска:
Опять же, я NDA'd, который мешает мне публиковать фактический код здесь, насколько я бы хотел. Я думаю, что я подробно объяснил ситуацию (возможно, слишком тщательно - если такая вещь существует), поэтому вам не нужно будет видеть код, чтобы дать мне общий ответ. В случае необходимости, я полагаю, я мог бы написать примерный код, который достаточно отличается от моего IP-адреса компании и публикует его здесь. Дайте мне знать, если вы хотите, чтобы я сделал это, и я буду рад обязать (ну, на самом деле, но я все равно сделаю это).