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)?

15.12.2008 00:40:10
Я просто попытался добавить идентификатор и имя, и это не помогло. Я могу сделать так, чтобы он исчез из обоих, если вместо этого я использую insertBefore (t, document.body.firstChild).
some 15.12.2008 01:56:30
Что раздражает, так это то, что сохранение работы пользователя должно быть по умолчанию в любом хорошем браузере, а не то, что работает только с нестандартными взломами.
ShreevatsaR 27.09.2011 16:28:28
4 ОТВЕТА
РЕШЕНИЕ

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

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

5
15.12.2008 02:42:15
Нет, это не так. document.write () с радостью добавит к существующему контенту на странице.
ShreevatsaR 15.12.2008 02:44:24
На самом деле, так и будет, если вы не находитесь в начальной загрузке страницы. Если вы сделаете это позже, скажем, когда Ajax-вызов вернется, страница будет стерта.
Chase Seibert 15.12.2008 02:47:01
Chase Seibert прав, что он удалит страницу, если она вызывается после загрузки страницы.
some 15.12.2008 03:39:30
Чейз Сейберт также прав, что поведение зависит от браузера, и я добавляю, что это также зависит от настроек в браузере. Поэтому вы не должны зависеть от этой функциональности.
some 15.12.2008 03:42:17
Речь идет о состоянии открытия / закрытия / записи документа, и это похмелье очень ранней технологии сценариев - она ​​по сути устарела при вставке DOM и должна редко использоваться.
annakata 15.12.2008 11:11:02

Можно ли было бы добавить хук, который вы могли бы использовать для нацеливания на новую текстовую область? например. <div>

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

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

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

0
15.12.2008 10:40:21

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

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

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

4
21.12.2008 19:42:25

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

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

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

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

0
27.09.2011 16:07:37