2014-12-01 130 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> 

我不斷收到錯誤 「此頁不正確的框架中加載」。

本書中練習的目的是爲了展示try catch拋出的工作原理。

感謝

+2

這是一個相當複雜的方式來解釋'try ... catch'是如何工作的!你得到這個結果的原因是因爲'window.top.calcFactorial' _is_'null',所以'try'語句中的'throw'n異常,將它輸出(或_referring_)到'catch'。我其實不認爲iFrames可以訪問他們父母的javascript函數,所以它顯然是'null'。對於'try ... catch'的一個很好的解釋,查看MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try.catch – somethinghere 2014-12-01 16:53:45

+0

你的try catch正在'if(window.top.calcFactorial == null)'是throwig錯誤 – ConfusedShark 2014-12-01 16:54:45

+0

我將閱讀提供的鏈接。謝謝你的幫助。 – 2014-12-01 17:07:39

回答

0

好了,我的意見還是很重要,但我沒有找到這個問題:你實際上不是指父母,爲你需要一個iframe。下面的代碼更改:

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

這樣:

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

現在window.top是孩子框架訪問!我會說實話,我不確定爲什麼這是因爲我對framesets的知識非常有限,我忘記了多年前如何訪問它們。

但嚴重的是,如果它教你使用<frameset>做事情,這聽起來不像是一本好書...我近20年來沒見過這些人!你最好的朋友和資源是Mozilla Developer Network。我發現他們的代碼很好解釋,它包含了一大堆現代化的,最新的網頁!

+0

謝謝。這解決了這個問題。是的,我同意這本書似乎是用舊的方法做事。 – 2014-12-01 17:07:01