ExtJS 2.2x를 쓰는 경우 IE6에서 그리드 상단 메뉴의 아이콘이 아래의 그림처럼

제대로 표시되지 않는 버그가 남아 있슴을 이제사 알게 되었다.

솔직히 이 버그는 예전에 발견된 버그일뿐 아니라 2.2.1 버젼에서는 fix된 것으로 알고 있었던 터라..

IE7 이후 버젼에만 맞추고 테스트를 진행했었는데..혹여나..

다시 최신버젼을 받아봐도 IE6에서 위에 해당하는 버그가 발생하는 것을 확인할 수 있었다.

예전엔 IE7 이후버젼에 이런 증상이 있었는데 지금은 거꾸로 IE6에서 발생하다니..

 

해결 방법은 이전버젼에서 적용했던 버그 fix를 그대로 적용하면 된다.

 

.ext-ie .x-menu-item-icon {left: -24px;}

.ext-strict .x-menu-item-icon {left: 3px;}

.ext-ie6 .x-menu-item-icon {left: -24px;}

 을  css에 추가하면 된다.

 

이젠 IE6 버젼에서 정상적으로 돌아가는 것을 확인할 수 있을 것이다.

물론 IE7과  IE8, 파폭, 크롬에서도 정상작동 확인...

 

 ExtJs 2.0에서는 괜찮았는데 2.1~2.2를 사용하는 경우

위의 그림처럼 체크박스를 사용할 때 boxLabel 부분이 정상적으로 표시되지 않은 경우가 있다.

(아니면 뒤쪽으로 몰린다던지..)

 

Ext.form.Checkbox 에 정의되어있는 getResizeEl에 다음과 같이 정의되어 있다.

 getResizeEl : function(){
        if(!this.resizeEl){
            this.resizeEl = Ext.isSafari ? this.wrap : (this.wrap.up('.x-form-element', 5) || this.wrap);
        }
        return this.resizeEl;
  }

이부분을 다음과 같이 수정한다.

getResizeEl : function(){
        return this.wrap;
},

아니면 호출하는 스크립트에서

Ext.override(Ext.form.Checkbox, {
        getResizeEl : function(){
                return this.wrap;
        }
});

 이렇게 Override 해서 사용하면 정상적으로 표시됨을 확인할 수 있다.

 

 

javascript에서의 delete는 개체(object), 개체의 속성(property),

배열의 특정 인덱스에 있는 원소(element)를 지우는 연산자이며. 문법은 다음과 같다

delete objectName
delete objectName.property
delete objectName[index]
delete property // with 문장 안에서만 유효

 

objectName은 개체 이름이고, property는 개체에 존재하는 속성이고, index는 배열의 원소 위치를 나타내는 정수.

네 번째 형식은 개체의 속성을 지우는 코드인데, with 문장 안에서만 사용할 수 있다.

암시적으로 선언된 변수를 지울 때는 delete 연산자를 사용할 수 있지만

단 var 문장을 이용해서 선언된 변수는 지울 수 없다.

delete 연산자 실행이 성공하면, 속성이나 원소가 undefined로 설정되며.

delete 연산자는 실행이 가능하면 true를 반환하고, 불가능하면 false를 반환하게 된다.

x=42
var y= 43
myobj=new Number()
myobj.h=4      // h라는 속성을 만듭니다
delete x       // returns true (암시적으로 선언된 변수는 지울 수 있습니다)
delete y       // returns false (var로 선언한 변수는 지울 수 없습니다)
delete Math.PI // returns false (미리 정의된 속성은 지울 수 없습니다)
delete myobj.h // returns true (사용자 정의 속성은 지울 수 있습니다)
delete myobj   // returns true (암시적으로 선언되었으므로 지울 수 있습니다)

 

배열의 원소를 지우기


머 당연하지만 배열의 원소를 지워도, 배열의 길이에는 변화가 없게 된다.

즉 delete로 지우는 경우 원소는 더이상 배열에 존재하지 않게 된다(undefined).

하지만 delete와 배열원소에 undefined를 할당한 경우 조금 의미가 다르다.

 

먼저 아래 예제에서 trees[3]을 delete로 제거한 예제이다.

 

trees=new Array("redwood","bay","cedar","oak","maple")
delete trees[3]
if (3 in trees) {
   // 이 블록은 실행되지 않는다.

   alert(trees[3]);
}

즉 trees라는 배열에는 trees[3] 이라는 배열원소 자체가 삭제(undefined)되어 실행되지 않지만

단지 배열 원소가 존재하긴 하지만 정의되지 않은 값을 가지도록 하고 싶다면

delete 연산자 대신 undefined 키워드를 사용하면 된다.

 

다음은 trees[3]undefined 값을 할당하는 경우이다

 

trees=new Array("redwood","bay","cedar","oak","maple") trees[3]=undefined if (3 in trees) { // 이 블록은 실행된다. }

 

undefined 키워드로 배열의 값은 정의되지 않았지만 배열원소는 유지되므로 블록은 실행된다

 

 

[javascript] typeof 연산자

WEB2.0/ExtJS | 2008. 12. 1. 11:27
Posted by 시반

typeof 연산자는 형식 정보를 문자열로 반환하며 "Number", "String", "Boolean", "Object", "Function", "undefined"라는 6가지 형식을 반환할 수 있습니다.

선택적인 요소로 typeof 구문에 괄호를 사용할 수도 있기에 다음 둘 중 한 가지 방법으로 사용할 수 있습니다.

1. typeof operand
2. typeof (operand)

 

if ( typeof(object) != "Object" ) {

alert('객체가 아닙니다.');

}

if ( typeof 'AAA'  != 'Number' ) {

alert('숫자가 아닙니다.');

}

 

또다른 예를 들어 우리가 이런 변수를 정의했다고 해봅시다.

  • var myFun = new Function("5+2");
    var shape="round";

    var size=1;

    var today=new Date()
typeof는 이 변수들에 대해서 다음과 같은 결과를 반환할 것입니다. 
  • typeof myFun is function
    typeof shape is string

    typeof size is number

    typeof today is object

    typeof dontExist is undefined

truenull 키워드에 대해서 typeof 연산자는 다음과 같은 결과를 반환합니다.

  • typeof true is boolean
    typeof null is object

수와 문자열에 대해서 typeof 연산자는 다음과 같은 결과를 반환합니다.

  • typeof 62 is number
    typeof 'Hello world' is string

속성 값에 대해서 typeof 연산자는 속성이 포함하고 있는 값의 형식을 반환합니다.

  • typeof document.lastModified is string
    typeof window.length is number
    typeof Math.LN2 is number

메소드와 함수에 사용하면 typeof 연산자는 다음과 같은 결과를 반환합니다.

  • typeof blur is function
    typeof eval is function
    typeof parseInt is function
    typeof shape.split is function

미리 정의된 개체들에 대해서 typeof 연산자는 다음과 같은 결과를 반환합니다.

  • typeof Date is function
    typeof Function is function
    typeof Math is function
    typeof Option is function
    typeof String is function
 

고급 자바스크립트 활용Ⅰ-Ⅰ

WEB2.0 | 2008. 4. 2. 18:01
Posted by 시반
웹 애플리케이션

컴퓨터 시대의 초창기때부터 서로 다른 플랫폼간의 소프트웨어 상호 운용성은 항상 관심의 대상이 되어 왔다. 가능한한 이용자층을 넓게 확대하기 위해, 업체들은 유명한 소프트웨어 프로그램을 하나의 장치에서 또 다른 장치로 옮겨왔고, 이것은 주로 몇개월이 걸리는 작업이거나, 가끔 새로운 하드웨어나 운영체제 상에서는 완전히 재작성 되기도 했다. 컴퓨터가 점점 더 강력해지고 C와 C++ 같은 언어들이 대부분의 플랫폼 상에서 사용가능한 표준이 되어감에 따라, 프로그램을 한번만 작성하여 원하는 만큼의 많은 시스템에서 사용할 수 있게 컴파일 하기가 더 쉬워졌다. C 컴파일러를 가지고 있기만 하면 소프트웨어를 빌드할수 있고 의도한대로 작동할 수 있다.

그러나, 그래픽 유저 인터페이스(GUI)를 가진 소프트웨어가 표준화 되면서 얘기가 달라졌다. Mac에서의 GUI는 윈도나 다양한 유닉스상의 그것과 틀려보였다. 물론 Tcl/Tk이나 wxWidgets같은 이른바 "위젯 툴킷"이라 불리는 것들은 C++, 파이썬, 펄과 같은 많은 유명한 언어들과 연결되어 윈도, 리눅스, 맥OS X, 그리고 기타 운영체제에서도 (거의) 똑같은 동작을 하는 플랫폼 독립적인 GUI를 만들수 있게 하기는 하다. 그러나 오늘날에는 거의 모든 장치에 매우 강력한 GUI 해석기가 존재한다. 바로 웹 브라우저다.

웹 브라우저는 처음에는 사용자들에게 단순히 마크업을 만족스러운 방법으로 보여주는데 유용했지만, 지금은 놀라울 정도로 복잡한 소프트웨어 인터페이스로서 실행될 수 있을 정도로 발전해왔고 C/C++과 다른 고수준 언어들로 쓰여진 소프트웨어들과도 견줄만 하다. 이것은 대체로 자바스크립트 지원과 웹 2.0기술 덕택이다. 모든 플랫폼상의 거의 모든 브라우저가 이 스크립트 언어의 일반적인 하위집합을 지원하며, 이전보다 플랫폼 독립적인 애플리케이션을 만들기가 더 쉬워졌다.

자바스크립트 툴킷

최근 몇몇 자바스크립트 툴킷이 야후, 구글, 도조와 같은 곳들에서 사용가능해졌다. 위에서 언급한 위젯 툴킷들과 매우 흡사하게, 이것들은 메뉴, 캘린더, 트리와 같은 다양한 위젯에 대한 자바스크립트 루틴을 제공하며, 웹사이트나 웹 애플리케이션에 쉽게 도입할 수 있게 허용한다. 여기 아주 조금만 요약해 보도록 한다.

툴킷은 웹페이지에 흥미로운 요소를 더하기 위해 좋고, 많은 이점을 가지고 있다. 이것들은 많은 브라우저 상에서 테스트 되었으며, 모든 일반적인 브라우저들에서 대부분 작동한다. 일부는 문서화가 잘 되어 있으며, 재밌는 웹페이지들을 순식간에 만들 수 있게 한다. 그러나, 이것들은 페이지 크기에 추가적인 몇백 킬로바이트를 더함으로써 불필요하게 거대해질수도 있고, 새로운 브라우저에 대한 지원이 추가되길 기다려야 할수도 있다. (예를 들어, 몇몇가지는 아직 IE7에서 작동하지 않는다.) 또한, 많은 회사들이 그것과 관련한 책임의 부족과 디버깅의 어려움 등을 이유로 오픈소스 소프트웨어를 사용할 수 없거나 사용하지 않을 것이다.

이 일련의 글들은 향상된 자바스크립트 테크닉을 사용한 튜토리얼 역할을 하기 위해 쓰여졌고, 이러한 툴킷들과 매우 비슷하게 여러 브라우저들과 호환되는 위젯을 만드는 법을 (완전한 소스를 가지고) 설명할 뿐만 아니라, 그것이 어떻게 작동하는지에 대해 자세히 설명하고 그럼으로써 여러분이 자신만의 것을 만들 수 있도록 할 것이다. 메뉴, 탭, 트리와 같은 것들을 구현하는 법에 대한 예제는 웹상에 많이 있다. 그러나 많은 것들이 극히 형편없게 작성되어 있거나 브라우저간 호환되지 않게 되어 있다. 자바스크립트, CSS, DOM, HTML에 대한 더 나은 온라인 레퍼런스 중의 하나가 www.w3schools.com이다. 만약 이 글상에서 친숙하지 않은 HTML/CSS 태그나 자바스크립트 함수를 본다면 이 사이트를 참조할 것을 권한다. HTML DOM에 대한 튜토리얼도 여기서 볼 수 있다. 앞으로 논의될 항목에는 팝업 메뉴, 플로팅 메시지, 드래그 & 드롭 객체, XML HTTP (페이지를 다시 로딩하지 않고 페이지 내용을 동적으로 바꿈) 등이 있다.

언급될 함수들은 윈도XP상의 IE7과 파이어폭스 2.0에서 테스트 되었지만 최근의 모든 브라우저에서 대부분 작동해야 함을 지적할 필요가 있다. 모든 브라우저 특화된 코드들은 본문 중에 특별히 짚어줄 것이다. 또한 자바스크립트와 DOM을 가지고 같은 목표를 달성하는 방법에는 여러가지가 있음을 명심하라. 다음 예제들은 그 중 한가지 방법을 제공하지만 모든 경우에 가장 빠르거나 가장 좋은 방법은 아닐 수 있다. 예제들은 단순성과 기능성을 가지고 읽기에 편안하게 작성되었다.

자바스크립트의 마법

다음에 보게 될 첫번째 예제는 브라우저 창이 스크롤 될 때에도 한 곳에 머물러 있는 떠있는 텍스트(혹은 이미지)를 만드는 법이다. 이것은 웹 애플리케이션에서 "잠시만 기다리세요"와 같은 메시지를 사용자에게 표시하거나 웹 페이지에 항상 표시되는 워터마크 등을 만드는데 사용할 수 있다. 이것은 자바스크립트 코드 몇 줄로 만들 수 있다:
<span id="testmsg" style="position: absolute; visibility: hidden; background: red;"
>This is a test?</span>

<form action="" method="get">
 <input name="submit" type="submit" value="Hide Message" onClick="Message_Display
('testmsg', 0, 700, 50); return false;" />
 <input name="submit" type="submit" value="Show Message" onClick="Message_Display
('testmsg', 1, 700, 50); return false;" />
</form>
이것은 다음 두개의 자바스크립트 함수로 만들 수 있다.
var ie = document.all;
var moz = document.getElementById && !document.all; 
var intr;

function Message_UpdatePos(msg, dy) {
    var el = document.getElementById(msg);
    if (ie) {
        el.style.pixelTop = document.body.scrollTop + dy;
    }
    else if (moz) {
        el.style.top = window.pageYOffset + dy + 'px';
    }
}

function Message_Display(msg, vis, dx, dy) {
    var el = document.getElementById(msg);

    // 메시지 위치

    if (ie) {
        el.style.pixelTop = document.body.scrollTop + dy;
        el.style.pixelLeft = document.body.clientWidth - dx;
    }
    else if (moz) {
        el.style.top = window.pageYOffset + dy + 'px';
        el.style.left = window.innerWidth - dx + 'px';
    }
    if (vis) {  // 표시하거나
        el.style.visibility = "visible";
        intr = setInterval("Message_UpdatePos('" + msg + "', " + dy + ")", 1);
    }
    else {  // 숨긴다
        el.style.visibility = "hidden";
        if (intr)
            clearInterval(intr);
    }
}
메시지 자체는 span 태그가 허용되는 페이지상의 모든 곳에서 인스턴스화 될 수 있다:
<span id="testmsg" style="position: absolute;
visibility: hidden; background: red;">This is a test…</span>
그러면 버튼은 단순히 다음과 같이 구현하여:
onclick="Message_Display('testmsg', 1, 700, 50); return false;"
메시지를 켜거나
onclick="Message_Display('testmsg', 0, 700, 50); return false;"
다시 끌 수 있다.

Message_Display에 전달하는 인수들은 메시지 텍스트를 가지는 span 태그의 id, 메시지를 보이게 할 것인지 안보이게 할 것인지를 가리키는 Boolean 값, 그리고 메시지가 위치해야할 브라우저 윈도의 우상단으로부터의 x, y 거리(이 경우에는 우측에서 700px, 상단에서 50px)이다. 여기에서의 키는 span 태그의 스타일이다. 절대 포지셔닝을 이용하여 메시지를 페이지의 나머지로부터 띄워서 표시하고 페이지의 나머지 흐름에 고정되지 않게 할 수 있다. 왜 span 태그가 사용되었는지도 알아두어야 한다. span 태그나 div 태그 둘 다 "아무것도 하지 않는" 태그들이며 문서상에서 각각 수평, 수직적으로 블록의 윤곽을 그리는데 사용한다. 이것들은 보통 문서에서 보이지 않는 효과를 가지고 있고, 그렇기 때문에 전체적인 외양을 변화시키지 않고도 특정한 스타일로 블록을 감싸는데 사용될 수 있다. 그러므로 이것들은 자바스크립트 위젯을 만들때 매우 간편하다.

이 함수는 다음과 같이 작동한다. 먼저 getElementById를 사용하여 메시지 span 태그에 대한 핸들을 얻어낸다. getElementById는 태그에 대한 포인터를 얻어내는 가장 쉬운 방법이다. 다음 단계는 인터넷 익스플로러 (ie)와 파이어폭스/모질라 (moz)에서 다르긴 하지만 둘 다 메시지를 원하는 위치(dx, dy)에 재위치 시키기 위한 같은 목적을 달성한다. 메시지는 visibility 스타일을 사용하여 켜거나 끌 수 있다. 마지막 라인은 자바스크립트 타이머에 대한 설명이 좀더 필요하다.

타이머는 자바스크립트에서 일정 시간 후에 함수를 실행시키는데 유용한 방법인데, setTimeout을 한번 사용하던지 setInterval을 반복적으로 사용할 수 있다. 이것들은 자바스크립트에서는 sleep 명령과 동일한 명령이 없기 때문에 특히나 유용하며 그렇기 때문에 이것들은 가장 좋은 대안을 제공한다. 이것들은 지정된 간격의 시간이 지날 때까지 어떠한 CPU 시간도 사용하지 않는다. 한가지 반드시 주의해야 할 것은 이 강력한 기능을 남용하지 말아야 하는 것인데, 적당히 사용한다면 일부 인상적인 효과를 달성할 수 있게 해준다. 이 경우에는 인자인 vis에 기초하여 Message_UpdatePos(msg, dy)를 실행시키는 타이머를 설정하며 타이머는 1ms 마다 실행된다. 전역 변수인 intr를 사용하여 타이머 포인터를 저장했음에 주의한다. 이것은 Message_Display를 몇번 호출하는 동안 유지하여야 하기 때문이다.

마지막으로 Message_UpdatePos를 보면 근본적으로 Message_Display의 처음 시작부분--메시지에 대한 핸들을 얻어내고 페이지의 상단으로부터 y 간격을 업데이트하는--과 같음에 주목하자. 그러므로 페이지가 스크롤될 때 메시지 위치는 스크롤 이벤트의 1ms 이내에 거기에 따라 재조정되고, 우상단 구석에서 항상 같은 위치에 떠있어 보인다. 메시지는 브라우저를 넓게 보거나 좁게 보기 위해 수평적으로 크기를 바꾸면 움직이지 않음에 주의한다. 연습삼아 이것이 잘 작동할 수 있게 코드를 수정해보자.
 
제공 : 한빛 네트워크
저자 : Howard Feldman
역자 : 추홍엽
원문 : Writing Advanced JavaScript
 

흐음 익스플로어 7을 새로 깔았더니 모달다이얼로그창에서 submit 을 한 경우 그 결과 페이지가 새로운창에서 뜨고 있다는 걸 발견했다.

이상하네.. 왜 그러지...

target 만 _self로 주면 되는게 아니었나?

이제껏 잘 돌아가던거였구 소스상에서도 <base target="_self"> 구문이 있다는 사실을 알았는데

유독 그 페이지만 그런 문제가 발생하다니...이상한 일...

 

고민 또 고민.. 헌데...

 

익스플로어7에서는 <base target="_self"> 구문이..

반드시 head안에 들어가 있어야 한다는 사실을 알게 되었다.

 

즉 body 태그 아래 적어두었던 <base target="_self">구문은 적용이 되지 않았던 셈...

 

다른 페이지의 경우 ajax등을 사용해서리 어차피 데이타 처리는 그 페이지 안에서 처리가 되기 때문에

다른페이지는 이상이 없었지만 ajax로는 구현이 안되는(내가 알기로는...) 첨부파일 전송페이지였기 때문에..

그런 일이 발생한 거였다...

 

하지만 중요한것은  body 태그 안에 그 구문을 넣어야 한다고만 알고 있었던 내 자신이었다.

이제껏 당연히 되어왔기에 당연히 그게 옳은 것이라고 생각했던 그래서 당연한 것인양 사용해왔기에 더더욱 쓰리다...

 

기초(?)의 소중함을 다시금 깨달을수 있었던 오늘의 헤프닝~~~

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)