cross browser iframe auto resize

firefox 3.5 에서 iframe resize 스크립트가 작동하지 않는 문제로 골머릴 썩다 발견한 해결책.

원문 : http://overfloweb.com/zbxe/?mid=study&category=363&document_srl=741

test browser : ie6, ie7, firefox 3, safari 3, chrome, opera 9
...
<iframe id="contentFrame" name="contentFrame" src="about:blank" marginwidth="0" marginheight="0" frameborder="0" width="100%" height="100%" scrolling="no"></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 는 된다.

이 글의 관련글
  • NetBeans 6.1의 놀라운 javascript 에디팅 기능
  • Java Blueprints web application layout 과 Jakarta web application layout의 차이
  • 위치를 알아차리는(location-aware) 웹브라우징
  • 웹호스팅 서비스 결재주기 변경
  • Javascript Array 의 유용한 메소드들
  • 자주 사용되는 ie6 관련 CSS Hack
  • JavaScript Base64 Encode / Decode
  • Servlet 3.0 스펙에 기인한 보안 논쟁 (1)
  • 2009 웹트렌드 맵
  • 2009/11/16 12:23 2009/11/16 12:23
    Trackback Address:http://www.yunsobi.com/blog/trackback/511
    [로그인][오픈아이디란?]

    NetBeans 6.1의 놀라운 javascript 에디팅 기능

    넷빈즈의 스크립트 랭귀지에 대한 지원이 지속적으로 확대되는 가운데, 이번 넷빈즈 6.1버전에서는
    자바스크립트 에디터 역시 놀라운 기능 향상이 있습니다.
    흡사 메이저 언어를 다루는듯한 신택스 하이라이팅 이라든지 코드 어시스턴스, 코드 인사이트뿐만 아니라
    <script src=".."> 와 같이 불러들인 외부 js파일 역시 인라인 스크립트와 동일하게 지원하고 있습니다.

    아래 url은 썬마이크로시스템즈의 넷빈즈 에반젤리스트 roman씨의 '넷빈즈 6.1의 자바스크립트 에디터 지원'
    에 대한 스크린캐스트입니다.
    http://www.netbeans.org/download/flash/js/javascript_demo.html(새 창으로 열기)

    JavaScript에 대한 Code Completion

    JavaScript에 대한 Code Completion


    JavaScript에 대한 Rename Refactoring

    JavaScript에 대한 Rename Refactoring


    JavaScript 함수에 대한 Code Completion

    JavaScript 함수에 대한 Code Completion


    JavaScript 함수에 대한 Tasklist 지원

    JavaScript 함수에 대한 Tasklist 지원


    JavaScript에 대한 Quick Fix

    JavaScript에 대한 Quick Fix



    이 글의 관련글
  • Eclipse 3.3 or NetBeans 6.0?
  • 넷빈즈 6.0 코드 템플릿 사용하기 :: NetBeans 6.0 Code Template
  • Web Services (JAX-WS) in Java EE 5
  • 넷빈즈 성능 향상 - 퍼포먼스 튜닝 팁 ( NetBeans performance Tuning Tip )
  • NetBeans를 2007년의 “Best Java IDE Innovator”로 지명 - InfoWorld
  • Developing a Blog in < 10 Minutes with NetBeans
  • JavaScript Base64 Encode / Decode
  • NetBeans IDE Guide for JBuilder Users
  • cross browser iframe auto resize
  • 2008/05/07 13:49 2008/05/07 13:49
    Trackback Address:http://www.yunsobi.com/blog/trackback/365
    [로그인][오픈아이디란?]

    JavaScript Base64 Encode / Decode

    // This code was written by Tyler Akins and has been placed in the
    // public domain.  It would be nice if you left this header intact.
    // Base64 code from Tyler Akins --
    http://rumkin.com

    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    function encode64(input) {
       var output = "";
       var chr1, chr2, chr3;
       var enc1, enc2, enc3, enc4;
       var i = 0;

       do {
          chr1 = input.charCodeAt(i++);
          chr2 = input.charCodeAt(i++);
          chr3 = input.charCodeAt(i++);

          enc1 = chr1 >> 2;
          enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
          enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
          enc4 = chr3 & 63;

          if (isNaN(chr2)) {
             enc3 = enc4 = 64;
          } else if (isNaN(chr3)) {
             enc4 = 64;
          }

          output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
             keyStr.charAt(enc3) + keyStr.charAt(enc4);
       } while (i < input.length);
      
       return output;
    }

    function decode64(input) {
       var output = "";
       var chr1, chr2, chr3;
       var enc1, enc2, enc3, enc4;
       var i = 0;

       // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
       input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

       do {
          enc1 = keyStr.indexOf(input.charAt(i++));
          enc2 = keyStr.indexOf(input.charAt(i++));
          enc3 = keyStr.indexOf(input.charAt(i++));
          enc4 = keyStr.indexOf(input.charAt(i++));

          chr1 = (enc1 << 2) | (enc2 >> 4);
          chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
          chr3 = ((enc3 & 3) << 6) | enc4;

          output = output + String.fromCharCode(chr1);

          if (enc3 != 64) {
             output = output + String.fromCharCode(chr2);
          }
          if (enc4 != 64) {
             output = output + String.fromCharCode(chr3);
          }
       } while (i < input.length);

       return output;
    }
    function encode64Han(str) {
      return encode64(escape(str))
    }
    function decode64Han(str) {
      return unescape(decode64(str))
    }

    이 글의 관련글
  • cross browser iframe auto resize
  • JAVA Base64 Encoding / Decoding
  • NetBeans 6.1의 놀라운 javascript 에디팅 기능
  • Javascript Array 의 유용한 메소드들
  • 2007/10/12 20:47 2007/10/12 20:47
    Trackback Address:http://www.yunsobi.com/blog/trackback/252
    [로그인][오픈아이디란?]

    Javascript Array 의 유용한 메소드들

    Java 의 Vector 클래스는 내부적으로 배열을 사용하고 있다. 따라서 Vector 의 자바스크립트 버전을 만들기 위해서는 Array 객체에 대한 빵빵한 지식이 필요하다 (없어도 된다. 그러나 있으면 매우 좋다). 자! 배열의 기초와 유용한 메쏘드들을 살펴보자.

    배열의 생성
    1. 생성자를 이용한 생성
    - new Array(arrayLength)
    ex) friends = new Array(3); // 크기가 3 인 배열 생성
    - new Array(element0, element1, ... , elementN)
    ex) friends = new Array("개똥이", "소똥이", "말똥이"); // 크기 3인 배열 생성(값이 채워짐)
    2. 직접 생성
    friends = ["개똥이", "소똥이", "말똥이"];

    간접적인 배열 길이의 증가
    배열의 길이는 현재 배열의 길이보다 큰 인덱스를 사용하면 자동으로 증가한다. 아래는 배열의 길이가 0 인 객체 생성 후 99번째 요소에 값을 할당하여 배열의 길이가 100 으로 증가한 예이다.
    friends = new Array();
    friends[99] = "새똥이";

    메쏘드 종류
    concat : 두개의 배열을 합쳐 새로운 배열을 리턴한다. 원본 배열은 변하지 않는다.
    문법
    arrayName.concat(arrayName2, arrayName3, ... , arrayNameN)
    인자
    arrayName2, ... , arrayNameN - 합쳐질 인자들
    예제
    두 배열을 합치는 예
    alpha = new Array("a", "b", "c");
    numeric = new Array(1, 2, 3);
    alphaNumeric = alpha.concat(numeric); // ["a", "b", "c", 1, 2, 3] 배열 생성

    join : 모든 요소가 구분자로 이어진 문자열을 리턴한다. 디폴트 구분자는 comma(,) 이다.
    문법
    arrayName.join(separator)
    인자
    separator 요소와 요소 사이에 사용될 구분자 문자열
    예제
    friends = new Array("소똥이", "개똥이", "말똥이");
    strFriends1 = friends.join(); // 소똥이,개똥이,말똥이
    strFriends2 = friends.join(", "); // 소똥이, 개똥이, 말똥이
    strFriends3 = friends.join(" + "); // 소똥이 + 개똥이 + 말똥이

    pop : 배열의 마지막 요소를 삭제한 후 그 값을 리턴하고 배열의 크기를 줄인다.
    문법
    arrayName.pop()
    인자
    없음
    예제
    // 말똥이가 pop 되고 배열에는 "개똥이", "소똥이"만 남는다.
    // 배열크기도 2로 줄어든다.
    friends = ["개똥이", "소똥이", "말똥이"];
    popped = friends.pop(); // popped 에 말똥이가 할당된다.

    push : 배열에 하나 또는 여러개의 값을 넣고 새로운 배열의 길이를 리턴한다.(배열길이 증가)
    문법
    arrayName.push(element1, element2, ... , elementN)
    인자
    element1, element2, ... , elementN - 추가될 요소들
    예제
    friends = ["개똥이", "소똥이"];
    pushed = friends.push("말똥이", "새똥이"); // ["개똥이", "소똥이", "말똥이", "새똥이"]
    alert(pushed); // 4

    reverse : 배열 요소를 역순으로 재배치한다(첫번째 요소는 마지막으로, 마지막 요소는 처음으로).
    문법
    arrayName.reverse()
    인자
    없음
    예제
    myArray = new Array("1", "2", "3");
    myArray.reverse(); // ["3", "2", "1"]

    shift : 첫번째 요소를 삭제하고 배열의 길이를 하나 줄인 후, 삭제된 요소를 리턴한다.
    문법
    arrayName.shift()
    인자
    없음
    예제
    friends = ["개똥이", "소똥이", "말똥이"];
    shifted = friends.shift(); // ["소똥이", "말똥이"]
    alert("삭제된 요소는 " + shifted + " 입니다."); // 개똥이

    slice : 얇게 썬 슬라이스 치즈가 생각난다(^^). 배열의 일부를 잘라내어 새로운 배열을 리턴한다.
    문법
    arrayName.slice(begin[,end]) : [] 은 선택사항임
    인자
    begin - 0보다 큰 시작 인덱스 (필수)
    end - 0보다 큰 끝 인덱스 (선택). 지정되지 않으면 배열의 끝까지 복사된다.
    예제
    numbers = ["0", "1", "2", "3", "4"];
    sliced1 = numbers.slice(2, 3); // ["2"]
    sliced2 = numbers.slice(2); // ["2", "3", "4"]

    sort : 배열의 요소를 정렬한다.
    문법
    arrayName.sort([compareFunction])
    인자
    compareFunction - 정렬방법을 지정한 함수.
    생략시에는 요소들의 toString() 값을 사전순서(Dictionary order) 대로 정렬한다.
    compareFunction(a, b) 에서
    1) a > b : 0 보다 큰 값 리턴
    2) a = b : 0 리턴
    3) a < b : 0 보다 작은 값 리턴
    예제
    // 역행 정렬
    function descComparator(a, b) {
    return b - a;
    }

    // 순행 정렬
    function ascComparator(a, b) {
    return a - b;
    }

    numbers = ["0", "1", "2", "3", "4"];
    numbers.sort(); // ["1", "2", "3", "4", "5"]
    numbers.sort(ascComparator); // ["1", "2", "3", "4", "5"]
    numbers.sort(descComparator); // ["4", "3", "2", "1", "0"]

    splice : 이전 배열요소를 삭제하고 새로운 내용물을 추가하는 형태로 배열 내용을 변경한다. 삭제된 요소들은 리턴된다. Vector 와 유사한 기능을 하므로 숙지하자.
    문법
    arrayName.splice(index, howMany, [element1][, ..., elementN])
    인자
    index - 변경하고자 하는 요소의 시작 인덱스
    howMany - 삭제하고자 하는 이전 배열요소 갯수.
    element,...,elementN - 추가하고자 하는 배열 요소들
    예제
    // numbers[2]부터 2개("2", "3")를 삭제하고 그 자리에 "5"와 "6" 을 삽입한다.
    numbers = ["0", "1", "2", "3", "4"];
    spliced = numbers.splice(2, 2, "5", "6"); // ["0", "1", "5", "6", "4"]
    alert(spliced); // "2", "3"

    unshift : 하나 또는 여러개의 요소를 배열의 왼쪽에 추가한다. 배열길이는 증가한다.
    문법
    arrayName.unshift(element1,..., elementN)
    인자
    element1,...,elementN - 배열의 앞쪽에 들어갈 요소들
    예제
    numbers = ["0", "1", "2"];
    numbers.unshift("-2", "-1"); // ["-2", "-1", "0", "1", "2"]

    출처 : http://blog.empas.com/jjh7266/6264266
    이 글의 관련글
  • cross browser iframe auto resize
  • NetBeans 6.1의 놀라운 javascript 에디팅 기능
  • JavaScript Base64 Encode / Decode
  • 2007/02/26 22:32 2007/02/26 22:32
    Trackback Address:http://www.yunsobi.com/blog/trackback/3
    [로그인][오픈아이디란?]