document.write () против вставки DOM-узлов: сохранить информацию о форме? - PullRequest
6 голосов
/ 15 декабря 2008

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

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

и

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 15 декабря 2008

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

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

4 голосов
/ 21 декабря 2008

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

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

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

0 голосов
/ 27 сентября 2011

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

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

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

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

0 голосов
/ 15 декабря 2008

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

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

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

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

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