본문 바로가기

Local Oriented/jQuery

다른 도메인의 iframe 밖에서 iframe 사이즈 (특히 height 값) 조정하기

A 에서 B 를 iframe 으로 가져와서 보여 주어야 할 경우.. height 값을 조정하여 iframe 을 리사이즈 할 경우가 있다.

그런데, A 와 B 가 서로 같은 도메인 안에 있다면 상관이 없지만 다른 도메인이라면 웹브라우저가 이를 허용하지 않는다.


이럴 때 두가지 해경 방법이 있겠는데..


1. A 쪽에서 B 를 URLConnection 하고 가져와서 A1 에 담고, A1 을 A 에서 iframe 안에 사용하는 방법

   A1 의 내용은 다른 도메인 B 를 담고 있지만, A1 자체는 A 쪽 도메인에 존재하기 때문에 iframe 사이즈를 조정하는데 아무 문제가 없다.

   다만 이때, 파라미터 처리를 해야 하는 경우 고민을 해야 한다.

   특히 B 에 탭메뉴가 있고 파라미터까지 관련된다면 난해해 진다. A 의 iframe src 에 넣어지는 것이 B 가 아니라 A1 이기 때문이다.


2. A 쪽에 iframe 높이를 조정할 수 있는 자바스크립트 함수(Aa)를 넣고,

   A1 에서 이(Aa)를 top.Aa() 형식으로 호출하는 자바스크립트 함수(Ab)를 담아서,

    B 쪽에 A1 을 호출하는 감추어진 iframe 을 만들어 놓으면..

    B 가 로딩될 때 A1 이 로딩되고 A1.Ab() 가 실행되는데, Ab() 에는 top.Aa() 이 들어 있어서..

    A.Aa() 를 실행하므로 동일한 도메인에 속한 A 의 iframe 높이를 조정하는 것.

    A.Aa.() 함수가 resize 할 때의 높이값은 B 가 A1을 호출할 때 파라미터로 넘겨주면 된다.


상기 2번의 경우..

A1 에 해당하는 파일엔 다음 내용을 넣는다.. A1 이 호출될 때 B 에서 height 값을 파라미터로 전달.

<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'){

      top.resizeIframe(height);

    }

  }

  window.onload = onLoad;

</script>


이것은 .html 과 기본 자바스크립트를 사용할 때이고..
.jsp 와 jquery 를 사용한다면..

<script type="text/javascript">

  $(document).ready(function(){

    top.resizeIframe(<%= request.getParameter("height") %>); // B 에서 숨겨진 아이프레임으로 A1 이 호출되지만, A 가 top 이 되는 것.

  });

</script>


A 에는 아래 코드를 추가.

<script>

  function resizeIframe(height){

    document.getElementById('idIframe').setAttribute('height', height);

    // 또는 idIframe.setAttribute('height',height), $('#idIfrmae').attr('height',height);

  }

</script>

<iframe id="idIframe" width="500" height="100" frameborder="0" src="<웹페이지 B>" style="padding:0;margin:0;border:none"></iframe>

iframe 의 frameborder 는 IE 때문에 넣어야.. ㅠ.


B 에서는 아래 코드 사용.. B가 A1 을 숨겨진 아이프레임으로 호출할 때 B 의 높이값을 파라미터로 전달해 주는 것이 포인트.

...

<body style="padding:0;margin:0">

<div style="width:500px;height:400px;background:yellow;font-size:10pt">테스트 중....</div>

<iframe id="hiddenIframe" src="" width="0" height="0" frameborder="0"></iframe>

<script>

  $(document).ready(function(){

    $('#hiddenIframe').attr('src', '<A1>?height='+ $('body').height());

  });

</script>

...


크로스브라우징을 생각할 때 B 에서 height 값에 얼마를 더해줄 필요가 있을 수는 있겠다.. ㅠ.

height 뿐만 아니라 width 도 얼마든지 전달하여 리사이징이 가능.. ~.