일반 iframe auto resize (cross browsing)

황제낙엽 2011.05.13 15:28 조회 수 : 658

sitelink1  
sitelink2  
sitelink3  
sitelink4 http://1 
extra_vars4 ko 
extra_vars5 http://overfloweb.com/zbxe/?mid=study&category=363&document_srl=741 
extra_vars6 sitelink1 
1. Inner page 에서 parent 에 접근하여 사이즈를 넘기는 방식 (link)

test browser : ie6, ie7, firefox 3, safari 3, chrome, opera 9


parent :


...
<iframe id="contentFrame" name="contentFrame" src="about:blank" marginwidth="0" marginheight="0" frameborder="0" width="100%" height="100%" scrolling="no"></iframe>
...



iframe :


...
<div id="content">
... contents ...
</div>
...
<script type="text/javascript">
function init(){
  var doc = document.getElementById('content');
  if(doc.offsetHeight == 0){
  } else {
 pageheight = doc.offsetHeight;
 parent.document.getElementById("contentFrame").height = pageheight+"px";
  }
}
window.onload = function(){
  init();
}
</script>
...



iframe 안의 소스에서 내용이 들어가는 전체를 <div id="content"></div> 로 감싸고,

onload 이벤트로 그 div 의 dom.offsetHeight 를 구해서 parent.iframe 의 height 를 바꿔주는 방식이다.

붉은색으로 표시된 height 가 크로스 브라우징의 핵심이다.

겨우 height 가 핵심이냐고? 모르는 소리다.

clientHeight, scrollheight,innerHeight, 등등 모두 크로스브라우징은 안된다. 하지만 그냥 height 는 된다;;

해보면 알게 될것임!



2. Iframe src 를 설정시 url 에 data를 포함하여 Inner page 에 전달하는 방식 (link)


Cross-domain Iframe 크기 변경


다음의 단계로 진행된다.
  1. iframe를 감싸고 있는 원래의 페이지를 생성함 ( Page A @ domain A)
  2. 포함되는 iframe ( Page B @ domain B ) 내부가 또하나의 iframe ( Page C @ domain A) 를 가지도록 함
  3. Page B 는 Page C 에게 자신의 size 정보를 url parameter형태로 전달함. 이렇게 하지 않으면 B->C 간 정보전달 할 수 없다.
  4. Page C 는 Page A 에게 Page B의 size 정보를 다시 넘긴다. Page C 와 Page A 는 같은 domain A 이므로 script 실행에 제약이 없다.
  5. Page A는 Page C 로 부터 얻은 Page B 의 size정보를 가지고 자신의 iframe element 의 크기를 변경한다.
즉, Page B의 사이즈가 B->C->A 의 순서로 전달된다.

대략의 소스는 다음과 같다. 이글루스의 절망적인 소스 첨부 기능은 이제 포기했다. 이쁘게 보이려는 잡스런 시도도 이젠 포기. 죄송하지만 알아서 들 보세요.

Page A:
<html>
<head>
<script type="text/javascript">
      //요 함수는 최종적으로 page C 가 호출하는 함수이다.
      function updateIFrame( height ) {
        var iframe = document.getElementById( 'iframe1' );
        iframe.setAttribute( 'height', height );
      }
</script>
</head>
<body>
<iframe id="iframe1" frameborder="1" style="margin-left: 10px;" marginheight="0"
marginwidth="0" scrolling="no" topmargin="0" width="100%" >
</iframe>
<script type="text/javascript">
//iframe 의 주소에 자신의 domain 정보를 붙여서 넘긴다.
var iframeSrc="http://domainB/pageB.htm#"+document.domain;
       var iframe = document.getElementById( 'iframe1' );
        iframe.src = iframeSrc;
</script>
</body>
</html>

Page B:
<html>
<head>
<script type="text/javascript">
//이름이 좀 거시기 한데, 원래 용도는 Page C에게 Page B의 size 정보를 건네기 위함이다.
function resizeIframe(){
        var iframe = document.getElementById( 'inneriframe' );
        var wrapper = document.getElementById( 'wrapper' );
        var height = Math.max( document.body.offsetHeight, document.body.scrollHeight );
        //정확한 domain 정보를 위해 PageA의 domain 정보를 받아서 PageC의 domain 정보로 활용한다.
        var iframeDomain = document.location.href.split( "#")[1];
        var iframeUrl = 'http://'+iframeDomain +'/pageC.html?height='+height
        iframe.src = iframeUrl;
}
</script>
</head>
<body>
<div id="wrapper">
long content....
<iframe id="inneriframe" width="10" height="10"></iframe>
<script type="text/javascript">
resizeIframe();
</script>
</div>
</body>
</html>

Page C:
<html>
  <head>
    <title>Resizing Page</title>
    <script type="text/javascript">
      function onLoad() {
        var params = window.location.search.substring( 1 ).split( '&' );
        var height;
        for( var i = 0, l = params.length; i < l; ++i ) {
          var parts = params[i].split( '=' );
          switch( parts[0] ) {
          case 'height':
            height = parseInt( parts[1] );
            break;
          }
        }
        if( typeof( height ) == 'number' ) {
          //Page A 의 updateIframe function을 실행한다.
          window.top.updateIFrame( height );
        }
      }
    window.onload = onLoad;
    </script>
  </head>
  <body>
    <p>Resizing IFrame...</p>
  </body>
</html>



번호 제목 글쓴이 날짜 조회 수
110 사용자 모듈 만들기 황제낙엽 2019.07.09 41735
109 User Agent 정보 모음 file 황제낙엽 2011.02.22 7768
108 페이지 스크롤 끝 확인 황제낙엽 2011.10.24 6230
107 ActiveX 설치 여부를 검사하는 스크립트 황제낙엽 2011.02.13 4053
106 브라우저의 새로고침과 종료에 대한 이벤트 황제낙엽 2017.08.11 2725
105 부동소수점 (floating-point) file 황제낙엽 2018.03.26 1122
104 javascirpt IME-Mode 설정하기 황제낙엽 2010.08.17 1112
103 경과 시간 구하기 황제낙엽 2019.10.04 1071
102 각 브라우저 별 User Agent 정보 황제낙엽 2011.02.22 823
101 자바스크립트의 쉬프트 연산자 (Shift Operator) 와 음수 (Negative) 이야기 황제낙엽 2012.05.31 726
» iframe auto resize (cross browsing) 황제낙엽 2011.05.13 658
99 입력받은 날짜와 현재 날짜와의 비교 함수 황제낙엽 2019.08.02 500
98 url encode & decode 황제낙엽 2011.10.30 469
97 자바스크립트로 서버의 XML파일을 접근 (실패했슴) 황제낙엽 2005.12.11 444
96 Javascript 내장객체 String 황제낙엽 2007.04.10 392
95 JavaScript Touch and Gesture Events iPhone and Android 황제낙엽 2012.04.12 337
94 unshift() Method 황제낙엽 2009.03.02 287
93 Jasmine 테스트 및 CI 구축 가이드 황제낙엽 2016.11.16 254
92 Why does this simple Javascript prototype not work in IE? 황제낙엽 2011.03.24 242
91 브라우저에서 뒤로 가기 막기와 펑션키(function key) 막기 황제낙엽 2005.10.21 236