Как вы останавливаете браузер от «песочных часов», когда Javascript DONE (остановка пульсирующего)? - PullRequest
3 голосов
/ 20 мая 2011

Записывая небольшую веб-страницу HTML с очень простым Javascript, я заметил, что после того, как это было сделано, круг продолжал вращаться (firefox). Я видел это много раз на других страницах и всегда думал, что это ошибка Javascript или проблема с циклом, но эта программа, которую я запускал, была точно завершена.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Grade Tester</title>
    <script language="javascript" type="text/javascript">       
      function calculate()
      {
       var grade = document.getElementById("grade").value.toUpperCase();        
        switch (grade)
        {
         case "A":
           document.write("Outstanding Achievement");
           break;

         case "B":
           document.write("Above Average");
           break;

         case "C":
           document.write("Average Achievement");
           break;

          case "D":
            document.write("Low Passing Grade");
           break;

         case "F":
           document.write("Failing Grade");
            break;
        }
      }
    </script>       
    </head>
  <body>
    Grade:<input type="text" id="grade" />
    <br /><input type="button" value="Get Result" onclick="calculate()" />
  </body>
</html>

Мне удалось остановить его, нажав «стоп» (щелчок правой кнопкой мыши и остановка).

Что мне нужно сделать, чтобы Javascript прекратил обработку (или браузер прекратил обработку) после завершения сценария?

Примечание 1: это произошло в FF4.01, а не в IE или Chrome (для этого примера кода).

Примечание 2: Я попробовал функцию window.stop () после оператора switch, и он не остановил пульсатор.

Согласно ответу Лекенштейна, document.close () после оператора switch решил эту проблему, но вот пример, который вообще не пульсирует и не использует document.close ().

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Lab 9.1</title>
  </head>
  <body>
    <script language="javascript" type="text/javascript">
      var phrase = "Every good boy does fine goes on the line."
      document.write(phrase.length + "<br />");
      for(var i = 0; i < phrase.length; i++)
      {
        document.write(phrase.charCodeAt(i) + " ");
      }
        document.write("<br />");
        document.write(phrase.toLowerCase() + "<br />");
        document.write(phrase.toUpperCase() + "<br />");
    </script>
  </body>
</html>

1 Ответ

1 голос
/ 20 мая 2011

После вызова document.write() вы должны позвонить document.close(), если документ ранее не был закрыт.

В основном это происходит:

  1. Страница обрабатывается
  2. Сценарии обработаны
  3. Страница закрыта (document.close())

Если на шаге 2 вызывается document.write(), он будет завершен на шаге 3. Помимо шага 3, если вы позвоните document.write, вы снова откроете страницу, но страница не закроется в FF (не уверена в других). Вы должны закрыть его, позвонив document.close().

Я обнаружил это, когда мне нужно было открыть окно и быстро написать в него в FF.

var win = window.open();
win.document.write("something");
// the next line is required to finish the page
win.document.close();

То же относится и к вашему делу:

<script type="text/javascript">
function calculate()
{
    var grade = document.getElementById("grade").value.toUpperCase();
    switch (grade)
    {
    case "A":
        document.write("Outstanding Achievement");
        break;
    // removed some cases
    case "F":
        document.write("Failing Grade");
        break;
    }
    // finish the document
    document.close();
}
</script>
...