2013-04-30 1 views
1

JavaScript 프레임에서 국가 이름 목록이 채워진 왼쪽 프레임이있는 웹 페이지에 2 개의 프레임이 있습니다. 각 국가는 주요 개체 내의 개체이기도하며 4 개의 이름/값 속성을 가지고 있습니다. 나는 몸의 온로드에 부착 된 다음과 같은 기능을 사용하고 있습니다 :firefox Javascript document.write (onclick) 참조 오류 정의되지 않은 함수

 function populateList() { 
      var list = top.frames[0].document; 
      list.open() 
      list.write("<h2>Countries</h2><ul>"); 
      for (name in euMem){ 
       if(typeof name !== 'object'){ 
        list.write('<li><a href=\"\" onclick=\"updateFrame(\'' + name + '\');\">' + name + '</a></li>'); 
       } 
      } 
      list.write("</ul>"); 
      list.close(); 
     } 

사용자가 국가 이름 중 하나를 클릭 할이이 기능을 실행하기위한 것입니다 왼쪽 :

 function updateFrame(country) { 
      var infoFrame = top.frames[1].document; 
      infoFrame.open(); 
      var size = Object.size(euMem[country]); 
      infoFrame.writeln("<h1>Information for " + country + "</h1>"); 
      for(prop in euMem[country]){ 
       infoFrame.writeln(prop + " : " + euMem[country][prop] + "<br>"); 
      } 
      infoFrame.close(); 
     } 

에 보인다 Chrome에서 제대로 작동하지만 Firefox에서는 updateFrame이 정의되어 있지 않다는 참조 오류가 발생합니다. 내가 HTML로 직접 updateFrame을 하드 코딩 할 때 파이어 폭스에 막히지 않고 작동하지만 document.write로 작성되면 참조 오류가 발생합니다.

Firefox에서 작동하지 않는 이유는 무엇입니까?

편집 : 나는 할 수 있었다 파이어 폭스에서 작동하지 않습니다 위의

<html> 
<head> 
    <title>InfoPane</title> 
    <script type="text/javascript"> 
     function test(name){ 
      alert(name); 
     } 

     function load(){ 
      document.write("<button onclick='test('John Doe');'>Alert Me!</button>"); 
     } 
    </script> 
</head> 
<body onload="load();"> 

</body> 
</html> 

...

: 여기 내가이의 가장 기본적인 버전을 테스트 쓴 간단한 스크립트입니다 기본 예제로 작동하는이 코드를 얻을 수 있지만, 위의 내 코드에 그것을 확장 할 수있는 기능을 얻을 :

<html> 
<head> 
    <title>InfoPane</title> 
    <script type="text/javascript"> 
     function test(){ 
      alert(this.name); 
     } 

     function load(){ 
      var btn = document.createElement('button'); 
      btn.name = 'John Doe'; 
      btn.onclick = test; 
      btn.innerHTML = 'Alert Me!'; 
      document.body.appendChild(btn); 
     } 
    </script> 
</head> 
<body onload="load();"> 

</body> 
</html> 
+0

1. 왜 프레임을 사용합니까? 2. 어떻게 스크립트를 삽입하고 어디에 있습니까? –

+0

프레임을 사용해야하는 클래스 할당이므로 프레임을 사용하고 있습니다. 스크립트는 첫 번째 프레임의 HTML 파일에 포함됩니다. – user1721944

답변

2

이것은 Firefox가 사양을 따르고 있지만 Chrome이 아니기 때문에 발생합니다.

가장 기본적인 버전에서이 페이지는 이름이 "test"이고 값이 함수 인 전역 개체의 속성을 정의합니다. 그런 다음로드 이벤트 처리기가 실행되고 document.write을 호출합니다. 암시 적으로 document.open이 발생합니다. 문서가 그 시점에서 더 이상로드되지 않으므로 이전 문서의 내용이 날아갑니다. 지금까지 Firefox와 Chrome에서 모두 동일합니다.

사양마다 다르며 Firefox에서는 더 이상로드되지 않는 문서의 open이 문서의 새 전역 개체를 만듭니다. 물론이 새로운 전역 객체에는 test이라는 속성이 없습니다. 반면에 Chrome은 이전 전역 문서 (예 : 이벤트 핸들러, 간격 타이머 등과 같은 이전 문서의 다양한 상태)를 유지합니다.

document.open으로 문서를 다시 작성하고 유틸리티 기능을 호출 할 수있게하려는 경우 글로벌 기능이없는 다른 프레임에 유틸리티 기능을 추가하려고합니다.

+0

고맙습니다. 외부 파일에도 문제가 발생했다는 이유는 그것이 날아가고있는 프레임 내에서 링크 되었기 때문입니다. window.parent에 대한 링크를 업데이트하고 스크립트를 프레임 세트로 이동하여 성공적으로 작동시킬 수있었습니다. – user1721944

0

TR y 사용 window.parent.updateFrame(...)

+0

이것은 작동하지 않았습니다. 또한 행운을 빌어 외부에 스크립트를 연결해 보았습니다. – user1721944