Очищает ли document.body.innerHTML = веб-страницу?

Когда я обновляю страницу ниже в FF 3.0, я ожидал, что веб-страница очистится, но этого не произошло.

Почему document.body.innerHTML = "" не очищает страницу?

ОБНОВЛЕНИЕ: я пытаюсь очистить предыдущий экран во время обновления, пока загружается новая страница. Я действительно хочу, чтобы страница была чистой, подождите, а затем запустится следующий js. Я не хочу очищать экран после загрузки страницы.

...
<body>
    <script type="text/javascript">
        document.body.innerHTML = "";
        for (var i = 0; i < 1000000000; i++) {
        }
    </script>

    <img src="images/web.gif" /><br />

    <script type="text/javascript">
        document.write( "hello<br />");
    </script>

    <img src="images/warning.png" /><br />

</body>

person Tony_Henrich    schedule 12.02.2010    source источник
comment
Еще одно уточнение, которое я уже не вижу в других комментариях. Я полагаю, вы написали цикл for как задержку. Такого рода вещи не работают в JS. JS — это один поток, ничего больше не происходит, пока работает ваш скриптовый раздел, вы просто накачиваете загрузку ЦП.   -  person soger    schedule 09.07.2019


Ответы (7)


document.body.innerHTML = ''; очищает body, да. Но он очищает innerHTML, как на момент запуска кода. Когда вы запускаете код до того, как изображения и скрипт фактически находятся в body, он пытается очистить body, но очищать нечего.

Если вы хотите очистить body, вы должны запустить код после того, как body будет заполнено содержимым. Вы можете сделать это, либо поместив блок <script> в качестве последнего потомка блока body, чтобы все загружалось до запуска кода, либо вам нужно каким-то образом прослушивать событие dom:loaded.

person Douwe Maan    schedule 12.02.2010
comment
Так почему я не вижу этого визуально? Я очищаю экран и жду (код задержки), но на экране все еще есть содержимое предыдущей загрузки. - person Tony_Henrich; 12.02.2010
comment
Поскольку ваш скрипт выполняется до того, как что-либо будет добавлено в тело, вы ничего не очищаете. В приведенном выше примере переместите блок ‹script› в нижнюю часть тега ‹body›. - person Andy Shellam; 12.02.2010
comment
Просто подумал, если когда вы имеете в виду предыдущую загрузку, вы имеете в виду страницу, которая не ваша (т.е. вы заходите в гугл, затем заходите в свой скрипт, и вы все еще видите гугл, пока не прошла ваша задержка), то я не уверен, что это возможно, за исключением, возможно, размещения что-то над вашим блоком ‹script›. - person Andy Shellam; 12.02.2010
comment
Мой скрипт находится внутри тега body, и это первое. Почему он не очищает то, что на экране? В порядке. позвольте мне сформулировать иначе. Как очистить экран в первую очередь в теге body? Я все еще вижу изображения из моей предыдущей загрузки. Я говорю о той же странице, что и моя. Я нажимаю «Обновить» и хочу, чтобы изображения исчезли, прежде чем те же изображения появятся снова. Причина задержки в том, чтобы я мог видеть, как это происходит. в противном случае очистка и повторное появление изображений произойдет слишком быстро, чтобы я мог заметить. Обратите внимание, что это тестовый код, чтобы что-то доказать. - person Tony_Henrich; 12.02.2010
comment
Предыдущая загрузка — это то, что отображается на экране, будь то моя или другая страница. это не должно иметь значения. - person Tony_Henrich; 12.02.2010
comment
Если вы посмотрите на чужие страницы, то они вообще скрипты внизу страницы ставят именно по этой причине, элементы документа подгружаются синхронно сверху вниз (наподобие того, как вы читаете книгу). если ваш скрипт находится в верхней части страницы, он запускается, когда он является единственным элементом в документе, поэтому у него нет других элементов для изменения. - person ThisGuyCantEven; 20.03.2019
comment
Итак, ответ на My script находится внутри тега body, и это первое. Почему он не очищает то, что на экране? заключается в том, что он действительно очищает все, что находится на экране, что ничего не значит, поскольку еще ничего не загружено. - person ThisGuyCantEven; 20.03.2019

Чтобы разъяснить ответ Доувэма, в теге script поместите свой код в загрузку:

<script type="text/javascript">
    window.onload=function(){
       document.body.innerHTML = "";
    }
</script>
person Erik    schedule 12.02.2010

Соглашаясь с ответами Доуве Маана и Эрика, здесь есть еще несколько вещей, которые могут оказаться полезными.

Во-первых, внутри ваших тегов head вы можете ссылаться на отдельный файл JavaScript, который затем можно использовать повторно:

<script language="JavaScript" src="/common/common.js"></script>

где common.js — это файл вашей многократно используемой функции в каталоге верхнего уровня с именем common.

Во-вторых, вы можете отложить выполнение скрипта с помощью setTimeout, например:

setTimeout(someFunction, 5000);

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

person Rich Harding    schedule 04.01.2012
comment
Предпочтите setTimeout(someFunction, 5000);, чтобы избежать eval и принуждения строки к числу. - person mwcz; 30.01.2015
comment
Справедливый комментарий. Ответ изменен. - person Rich Harding; 04.02.2015
comment
Использование таймера работает на моем машинном решении. Что делать, если магу требуется 5 секунд для загрузки? - person ThisGuyCantEven; 20.03.2019

Как говорили другие, простое решение — поместить ваш скрипт внизу страницы, потому что все элементы DOM загружаются синхронно сверху вниз. В противном случае, я думаю, что вы ищете document.onload(() => {callback_body}) или window.onload(() => {callback_body}), как сказал Эрик. Это позволяет вам выполнять ваш скрипт, когда событие dom:loaded запускается, как сказал Доуве Маан. Не уверен насчет свойств window.onload, но document.onload запускается только после загрузки всех элементов, css и скриптов. В твоем случае:

<script type="text/javascript">
    document.onload(() =>
        document.body.innerHTML = "";
    )
</script>

или, если вы используете старый браузер:

<script type="text/javascript">
    document.onload(function() {
        document.body.innerHTML = "";
    })
</script>
person ThisGuyCantEven    schedule 20.03.2019

Я не уверен, чего вы пытаетесь достичь, но вы можете рассмотреть возможность использования jQuery, который позволяет поместить ваш код в тег заголовка или отдельный файл сценария и по-прежнему выполнять код после загрузки DOM.

Затем вы можете сделать что-то вроде:

$(document).ready(function() {
$(document).remove();
});

а также выборочное удаление элементов (все DIV, только DIV с определенными классами и т.д.)

person Andy Shellam    schedule 12.02.2010
comment
Я пытаюсь очистить предыдущий экран во время обновления, пока загружается новая страница. - person Tony_Henrich; 12.02.2010

Использование document.body.innerHTML = ''; действительно работает! Просто говорю, что при использовании HTML (DOM или на function) вы можете использовать
document.writeln('');, но только onClick или onDoubleClick :)

person Community    schedule 14.11.2020
comment
Объясните почему, пожалуйста. - person SherylHohman; 14.11.2020
comment
@SherylHohman: Ну, во-первых, document.body... работает, потому что он ссылается на тело документа или его содержимое. Поскольку содержимое не является полем и объявлено в HTML, мы используем innerHTML. Как вы, наверное, знаете, '' or пусто, поэтому мы говорим, что содержимое пусто. Кроме того, для document.writeln(''); я предполагаю, что вы хотите знать, почему только onClick. Это связано с тем, что лучший способ получить доступ к DOM — использовать атрибут onClick. Он работает только с DOM, потому что writeln с пустым параметром — это специальный аддон DOM, а запись с пустым параметром даст вам подчеркивание. - person ; 05.12.2020
comment
Спасибо. Это объяснение типа, которое должно быть размещено в теле каждого ответа, который вы публикуете. SO предпочитает ответы с пояснениями, чтобы пользователи могли учиться и применять знания к своим проблемам. На самом деле, большинство голосов исходят от будущих посетителей, которые сделали именно это. Попробуйте отредактировать свой пост с информацией из вашего комментария. - person SherylHohman; 11.12.2020

Я очищаю экран, используя функцию, которая

var clear_body = function (){
    var lista = document.body.childNodes;
    for (var i = lista.length - 1; i >= 0 ;i--){
        document.body.removeChild(lista[i])
    }
}
person Miguel Villamizar    schedule 30.12.2016
comment
Если разместить его в верхней части документа, это по-прежнему будет иметь ту же проблему, поскольку не будет дополнительных загруженных дочерних узлов для удаления. - person ThisGuyCantEven; 20.03.2019