2014-12-01 2 views
0

Я следую этому примеру из книги, но я не получаю те же результаты, что и в книге.Не получать ожидаемые результаты - javascript

Две HTML-страницы.

calcfactorialtopframe.html

<!DOCTYPE html> 
<html> 

<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <script type="text/javascript"> 

    function calcFactorial(factorialNumber) { 

     var factorialResult = 1; 

     for (; factorialNumber > 0; factorialNumber--) { 
      factorialResult = factorialResult * factorialNumber; 
     } 

     return factorialResult; 

    } 

    </script> 
</head> 

<body> 

<frameset cols="100%,*"> 
    <frame name="fraCalcFactorial" src="calcfactorial.html"></frame> 
</frameset> 

</body> 
</html> 

calcfactorial.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <script type="text/javascript"> 

     function butCalculate_onclick() { 
      try { 

       if (window.top.calcFactorial == null) { 
        throw "This page is not loaded within the correct frameset"; 
       }; 

       if (document.form1.txtNum1.value == "") { 
        throw "!Please enter a value before you calculate its factorial"; 
       }; 

       if (isNaN(document.form1.txtNum1.value)) { 
        throw "!Please enter a valid number"; 
       }; 

       if (document.form1.txtNum1.value < 0) { 
        throw "!Please enter a positive number"; 
       }; 

       document.form1.txtResult.value = window.parent.calcFactorial(document.form1.txtNum1.value); 
      } 
      catch (exception) { 
       if (typeof(exception) == "string") { 

        if (exception.charAt(0) == "!") { 

         alert(exception.substr(1)); 
         document.form1.txtNum1.focus(); 
         document.form1.txtNum1.select(); 

        } else { 
         alert(exception); 
        } 

       } else { 
        alert("The following error occurred " + exception.message); 
       } 
      } 
     } 
    </script> 
</head> 
<body> 

    <form action="" name="form1"> 

     <input type="text" name="txtNum1" size="3" /> factorial is 
     <input type="text" name="txtResult" size="25" /><br /> 
     <input type="button" value="Calculate Factorial" name="butCalculate" onclick="butCalculate_onclick()" /> 

    </form> 

</body> 
</html> 

Я получаю сообщение об ошибке "Эта страница не загружается в правильном фрейме".

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

Благодаря

+2

Это довольно сложный способ объяснить, как работает 'try ... catch'! Причина, по которой вы получаете этот результат, заключается в том, что 'window.top.calcFactorial' _is_' null', поэтому исключение - 'throw'n в вашем' try' -запросе, выводя (или _referring_) его в 'catch'. На самом деле я не думаю, что iFrames может получить доступ к функции javascript своих родителей, поэтому, очевидно, это будет «null». Для хорошего объяснения 'try ... catch', проверьте MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch – somethinghere

+0

Ваша попытка поймать работает как «if (window.top.calcFactorial == null)» вызывает ошибку – ConfusedShark

+0

У меня будет прочитанная ссылка. Спасибо за вашу помощь. –

ответ

0

Хорошо, мой комментарий по-прежнему очень актуальна, но я нашел проблему: вы на самом деле не относится к родителю, для этого вам нужен iframe. Измените следующий код:

<frameset cols="100%,*"> 
    <frame name="fraCalcFactorial" src="calcfactorial.html"></frame> 
</frameset> 

к этому:

<iframe name="fraCalcFactorial" src="calcfactorial.html"></iframe> 

Теперь window.top доступна дочернем фрейме! Я буду честен, я не уверен почему это, поскольку мои знания о наборах фреймов очень ограничены, и я забыл, как к ним обращаться много лет назад.

А если серьезно, это не похоже на хорошую книгу, если она учит вас делать что-то, используя <frameset> ... Я не видел их почти 20 лет! Ваш лучший друг и ресурс - Mozilla Developer Network. Я нахожу, что их код действительно хорошо объяснен, и он содержит огромное количество современной, современной сети!

+0

Спасибо. Это решило проблему. Да, я согласен с тем, что в этой книге используются старые методы ведения дел. –

Смежные вопросы