Как правильно писать HTML, используя Javascript? - PullRequest
63 голосов
/ 07 октября 2009

В некоторых сообщениях я вижу, что люди не одобряют использование document.write() в javascript при написании динамического HTML.

Почему это? и что такое правильный способ?

Ответы [ 12 ]

45 голосов
/ 07 октября 2009

document.write() будет работать только при первоначальном анализе страницы и создании DOM. Как только браузер доходит до закрывающего тега </body> и DOM готов, вы больше не можете использовать document.write().

Я бы не сказал, что использование document.write() является правильным или неправильным, это зависит только от вашей ситуации. В некоторых случаях вам просто нужно иметь document.write() для выполнения задачи. Посмотрите, как аналитика Google внедряется в большинство веб-сайтов.

После того, как DOM готов, у вас есть два способа вставить динамический HTML (при условии, что мы собираемся вставить новый HTML в <div id="node-id"></div>):

  1. Использование innerHTML на узле:

    var node = document.getElementById('node-id');
    node.innerHTML('<p>some dynamic html</p>');
    
  2. Использование методов DOM:

    var node = document.getElementById('node-id');
    var newNode = document.createElement('p');
    newNode.appendChild(document.createTextNode('some dynamic html'));
    node.appendChild(newNode);
    

Использование методов DOM API может быть пуристическим способом сделать что-то, но было доказано, что innerHTML гораздо быстрее и используется в таких библиотеках JavaScript, как jQuery.

Примечание: <script> должен быть внутри вашего тега <body>, чтобы это работало.

27 голосов
/ 07 октября 2009

document.write() не работает с XHTML. Он выполняется после , когда страница закончила загрузку и ничего не делает, кроме как выписывает строку HTML.

Поскольку фактическим представлением HTML в памяти является DOM, лучший способ обновить данную страницу - это напрямую управлять DOM.

То, как вы это сделаете, будет программно создавать ваши узлы, а затем присоединять их к существующему месту в DOM. Для [целей надуманного] примера, предполагая, что у меня есть элемент div, поддерживающий атрибут ID заголовка, я мог бы ввести некоторый динамический текст, выполнив это:

// create my text
var sHeader = document.createTextNode('Hello world!');

// create an element for the text and append it
var spanHeader = document.createElement('span');
spanHeader.appendChild(sHeader);

// grab a reference to the div header
var divHeader = document.getElementById('header');

// append the new element to the header
divHeader.appendChild(spanHeader);
10 голосов
/ 08 октября 2009

Возможно, хорошей идеей является использование jQuery в этом случае. Он предоставляет удобную функциональность, и вы можете делать такие вещи:

$('div').html('<b>Test</b>');

Для получения дополнительной информации посмотрите http://docs.jquery.com/Attributes/html#val.

9 голосов
/ 08 октября 2009
  1. Методы DOM, как описано Томом.

  2. innerHTML, как упомянуто iHunger.

Методы DOM очень предпочтительны, чем строки для установки атрибутов и содержимого. Если вы когда-нибудь пишете innerHTML= '<a href="'+path+'">'+text+'</a>', вы на самом деле создаете новые дыры в безопасности межсайтовых сценариев на стороне клиента, что немного грустно, если вы потратили какое-то время на защиту серверной части.

Методы DOM традиционно описываются как «медленные» по сравнению с innerHTML. Но это еще не все. Медленная вставка множества дочерних узлов:

 for (var i= 0; i<1000; i++)
     div.parentNode.insertBefore(document.createElement('div'), div);

Это означает, что DOM находит нужное место в своем списке узлов, чтобы вставить элемент, переместить другие дочерние узлы вверх, вставить новый узел, обновить указатели и т. Д.

С другой стороны, установка значения существующего атрибута или данных текстового узла выполняется очень быстро; вы просто меняете строковый указатель и все. Это будет намного быстрее, чем сериализация родительского объекта с помощью innerHTML, его изменение и повторный анализ (и при этом не будут потеряны ваши несериализуемые данные, такие как обработчики событий, ссылки JS и значения форм).

Существуют техники для выполнения DOM-манипуляций без столь медленной прогулки по дочерним узлам. В частности, следует помнить о возможностях cloneNode и использовании DocumentFragment. Но иногда innerHTML действительно быстрее. Вы все еще можете получить лучшее из обоих миров, используя innerHTML, чтобы написать свою базовую структуру с заполнителями для значений атрибутов и текстового содержимого, которые вы затем заполняете, используя DOM. Это избавляет вас от необходимости писать собственную функцию escapehtml(), чтобы обойти проблемы экранирования / безопасности, упомянутые выше.

3 голосов
/ 07 октября 2009

Вместо этого можно изменить innerHTML или outerHTML элемента на странице.

2 голосов
/ 07 октября 2009

Я не особенно хорош в JavaScript или его лучших практиках, но document.write() вместе с innerHtml() в основном позволяет выписывать строки, которые могут или не могут быть допустимым HTML; это просто персонажи. Используя DOM, вы гарантируете надлежащий, совместимый со стандартами HTML, который не даст вашей странице сломаться из-за явно плохого HTML.

И, как упоминал Том, JavaScript выполняется после загрузки страницы; вероятно, было бы лучше, чтобы первоначальная настройка для вашей страницы выполнялась через стандартный HTML (через файлы .html или все, что делает ваш сервер [т.е. php]).

1 голос
/ 07 июня 2018

element.InnerHtml= allmycontent: перепишет все внутри элемента. Вы должны использовать переменную let allmycontent="this is what I want to print inside this element" для хранения всего содержимого, которое вы хотите внутри этого элемента. Если не каждый раз, когда вы будете вызывать эту функцию, содержимое вашего элемента будет удалено и заменено последним вызовом, который вы из него сделали.

document.write(): можно использовать несколько раз, каждый раз, когда содержимое будет напечатано в месте вызова на странице.

Но учтите: document.write () метод только полезен для вставки содержимого при создании страницы. Поэтому используйте его, чтобы не повторять при наличии большого количества данных для записи в виде каталога продуктов или изображений.

Вот простой пример: все ваши li для вашего дополнительного меню хранятся в массиве «tab», вы можете создать js-скрипт с тегом script прямо на html-странице, а затем использовать метод write в итерационная функция, в которую вы хотите вставить эти li на странице.

<script type="text/javascript">
document.write("<ul>");
for (var i=0; i<=tab.length; i++){
    document.write(tab[i]);
    }document.write("</ul>");
</script>`

Это работает, потому что Js интерпретируется линейно во время загрузки. Поэтому убедитесь, что ваш скрипт находится в нужном месте на вашей html-странице. Вы также можете использовать внешний файл Js, но опять же вы должны объявить его там, где вы хотите, чтобы он был интерпретирован.

По этой причине document.write нельзя вызывать для записи чего-либо на вашей странице в результате "взаимодействия с пользователем" (например, щелчка или наведения), потому что тогда DOM создан, и метод write, как сказано выше, напишет новую страницу (очистит реальный стек выполнения и запустит новый стек и новое дерево DOM). В этом случае используйте:

element.innerHTML=("Myfullcontent");

Чтобы узнать больше о методах документа: откройте консоль: document; затем откройте: __proto__: HTMLDocumentPrototype

Вы увидите свойство функции «запись» в объекте документа. Вы также можете использовать document.writeln , который добавляет новую строку в каждом операторе. Чтобы узнать больше о функции / методе, просто напишите ее имя в консоли без скобок: document.write; Консоль вернет описание вместо вызова.

1 голос
/ 08 октября 2009

Наверняка, лучший способ - вообще не использовать тяжелые HTML создания в вашем JavaScript? Разметка, отправляемая с сервера, должна содержать большую ее часть, которой вы можете затем манипулировать, используя CSS, а не грубой силой, удаляя / заменяя элементы, если это вообще возможно.

Это не применяется, если вы делаете что-то «умное», например, эмулируете систему виджетов.

1 голос
/ 07 октября 2009

Существует множество способов написания HTML с помощью JavaScript.

document.write полезен только тогда, когда вы хотите написать на страницу до того, как она действительно загрузится. Если вы используете document.write () после загрузки страницы (при событии onload), она создаст новую страницу и перезапишет старый контент. Также он не работает с XML, включая XHTML.

С другой стороны, другие методы нельзя использовать до создания DOM (загрузки страницы), поскольку они работают напрямую с DOM.

Эти методы:

  • node.innerHTML = "Что бы то ни было";
  • document.createElement ( 'DIV'); и node.appendChild () и т. д.

В большинстве случаев node.innerHTML лучше, так как он быстрее, чем функции DOM. В большинстве случаев это также делает код более читабельным и меньшим.

0 голосов
/ 20 мая 2017

Используйте jquery, посмотрите, как это просто:

    var a = '<h1> this is some html </h1>';
    $("#results").html(a);

       //html
    <div id="results"> </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...