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

Я просто попытался добавить идентификатор и имя, но это не помогло. Я могу заставить его исчезнуть из обоих, если вместо этого использую insertBefore (t, document.body.firstChild).

some 15.12.2008 04:56

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

ShreevatsaR 27.09.2011 20:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
2
5 164
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Нет это не правда. document.write () с радостью добавит к существующему содержимому на странице.

ShreevatsaR 15.12.2008 05:44

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

Chase Seibert 15.12.2008 05:47

Чейз Зайберт прав в том, что он сотрет страницу, если он будет вызван после загрузки страницы.

some 15.12.2008 06:39

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

some 15.12.2008 06:42

речь идет о состоянии открытия / закрытия / записи документа и является пережитком очень ранних технологий создания сценариев - они по существу устарели из-за вставки DOM и должны использоваться редко.

annakata 15.12.2008 14:11

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме