2014-12-01 2 views
0

나는이 예제를 책에서 따르고 있지만 책에 표시된 것과 같은 결과를 얻지는 않습니다.예상되는 결과를 얻지 못했습니다 - javascript

2 개의 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'이기 때문에 예외는'try' 문에'throw'n되어'catch'에 출력 (또는 _referring_)됩니다. 실제로 iFrames가 부모의 자바 스크립트 함수에 액세스 할 수 있다고 생각하지 않으므로 분명 'null'입니다. 'try ... catch'에 대한 좋은 설명을 보려면 MDN을 확인하십시오. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try..catch – somethinghere

+0

시험 잡기 'if (window.top.calcFactorial == null)'이 (가) throw12 오류 인 경우 – 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

감사합니다. 그것으로 문제가 해결되었습니다. 예, 저는이 책이 오래된 방법을 사용하고있는 것 같습니다. –

관련 문제