document.write() против вставки узлов DOM: сохранить информацию формы?

Рассмотрим две веб-страницы со следующим текстом в теле соответственно:

<body>
<script>
document.writeln('<textarea></textarea>')
</script>
</body>

а также

<body>
<script>
var t = document.createElement('textarea');
document.body.appendChild(t);
</script>
</body>

(думайте о них как о части чего-то большего, где текстовые области должны создаваться из JavaScript и не могут быть жестко закодированы на странице). Оба они производят одинаковый результат, но первый считается «плохим», а второй считается «правильным» способом сделать это. (Верно?)

С другой стороны, если вы напечатаете что-то на странице, а затем либо обновите это, либо перейдете куда-нибудь еще и нажмете «Назад», то в первом случае то, что вы набрали в текстовой области, сохраняется, а в более позднем — теряется. (По крайней мере, в Firefox.)

Есть ли способ использовать последний метод и по-прежнему иметь полезную функцию, заключающуюся в том, что то, что пользователь ввел в форму, сохраняется, даже если он случайно нажал кнопку «Обновить» или вернулся с помощью кнопки «Назад» (по крайней мере, в Firefox)?


person ShreevatsaR    schedule 15.12.2008    source источник
comment
Я просто пытался добавить идентификатор и имя, и это не помогло. Я могу заставить его исчезнуть из обоих, если вместо этого использую insertBefore(t,document.body.firstChild).   -  person some    schedule 15.12.2008
comment
Что раздражает, так это то, что сохранение работы пользователя должно быть по умолчанию в любом хорошем браузере, а не чем-то, что работает только с нестандартными хаками.   -  person ShreevatsaR    schedule 27.09.2011


Ответы (4)


Я считаю, что версия document.write фактически уничтожает существующий контент на странице. Т.е. тегов body и script уже не будет. Вот почему люди обычно используют appendChild.

Сохранять текст или нет, очень зависит от браузера. Я бы не поспорил, что Firefox не изменит свое поведение в будущей версии. Я бы предложил реализовать диалоговое окно предупреждения, когда пользователь пытается уйти со страницы, а в полях редактирования есть несохраненный контент. Обычно это делается с помощью события разгрузки.

person Chase Seibert    schedule 15.12.2008
comment
Нет это не правда. document.write() с радостью добавит существующий контент на странице. - person ShreevatsaR; 15.12.2008
comment
На самом деле, это будет, если вы не находитесь в начальной загрузке страницы. Если вы сделаете это позже, скажем, когда вызов Ajax вернется, он сотрет страницу. - person Chase Seibert; 15.12.2008
comment
Chase Seibert прав, что он удалит страницу, если он будет вызван после загрузки страницы. - person some; 15.12.2008
comment
Чейз Зайберт также прав в том, что поведение зависит от браузера, и я добавляю, что оно также зависит от настроек в браузере. Поэтому вы не должны зависеть от этой функциональности. - person some; 15.12.2008
comment
речь идет об открытом/закрытом/записывающем состоянии документа и является пережитком очень ранней технологии написания сценариев - она ​​по существу устарела из-за вставки DOM и должна использоваться редко. - person annakata; 15.12.2008

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

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

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

person Andy Hume    schedule 21.12.2008

Не могли бы вы добавить крючок, который вы могли бы использовать для нацеливания на новую текстовую область? например. ‹див›

<div id="addtextarea"></div>

var e = document.getElementByID('addtextarea');
e.innerHTML = '<textarea></textarea>';

Затем, если вам нужно запомнить содержимое, вы можете взять либо значение innerHTML, чтобы включить HTML, либо просто значение текстового узла текстовой области для извлечения текста.

person roborourke    schedule 15.12.2008

Обычно я предпочитаю создавать элемент DOM и вставлять его, особенно потому, что я могу вставить его именно в то место на странице, которое мне нужно (например, использовать object.appendChild или body.appendChild). Также не имеет значения, происходит ли вставка во время загрузки страницы или позже, поэтому я могу использовать обобщенную функцию вставки и использовать ее в любое время, во время или после полной загрузки страницы.

Однако во время процесса загрузки, если вы вставляете содержимое, которое включает javascript (т. е. последовательность SCRIPT type="text/javascvript"......./SCRIPT), вы ДОЛЖНЫ использовать document.write, чтобы скрипт выполнять.

  • Использование document.body.appendChild(theInsertionObject) правильно добавит вставку в текущей точке процесса загрузки, включая последовательность тегов SCRIPT, но НЕ выполнит javascript.

  • Если вы используете document.write(theInsertionCode), код будет вставлен в текущую точку процесса загрузки, а любая встроенная последовательность тегов SCRIPT будет выполнена до загрузки остальной части страницы.

person DrDave    schedule 27.09.2011