블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
2008. 5. 23. 12:05 Programing/HTML/JavaScript/CSS
브라우저에 따라 달리 동작하는 자바스크립트 함수 몇몇을 소개합니다.
가장 기본적인 문자열 처리와 이벤트 처리에 해당하는 함수들이기 때문에 숙지하시어 개발시 활용하시기 바랍니다.

문자열 처리




이벤트 처리

posted by 초딩입맛제주아재
2008. 5. 23. 01:53 Programing/HTML/JavaScript/CSS
자바스크립트 코딩을 하던 중 제 머리를 아프게 했던 문제가 있었습니다.
약 30분 가량을 이 문제로 씨름하다가 단 한줄로 문제를 해결했습니다.
자바사크립트로 oop를 구현하는게 일반적인 요즘, 자칫 간과하기 쉬운 객체 초기화의 중요성을 다시 한 번 상기시켜 준 문제였기에 공유합니다.

제가 설계한 객체는 기본적으로 자바스크립트의 배열을 사용하고 배열을 조작할 몇 가지 부가 기능을 첨가한 단순한 객체였습니다.

function TemporaryBasket(){
    this.basket = [];
}

TemporaryBasket.prototype.add = function(){
    var temp = [];

    for(var i=0,max=arguments.length; i
        this.basket.push(arguments[i]);
    }

    return this.size();
}

TemporaryBasket.prototype.remove = function(obj){
    for(var idx in this.basket){
        if(this.basket[idx] == obj){
            this.basket.splice(idx,1);
        }
    }
}

TemporaryBasket.prototype.removeAt = function(idx){
    return this.basket.splice(idx,1);
}

(이하 메서드 생략)





그리고 이 TemporaryBasket를 상속받고 몇몇 메서드들을 오버라이드하는 SelectedItemBasket 이라는 객체가 있습니다.

function SelectedItemBasket(){}
SelectedItemBasket.prototype = new TemporaryBasket;
SelectedItemBasket.prototype.compareSequence = function(a,b){
    return a.sequence - b.sequence;
}
SelectedItemBasket.prototype.add = function(obj){
    var cnt = TemporaryBasket.prototype.add.call(this,obj);
    Consol.print("add> selected itmes: " + this.size());
   
    Consol.print('board type: ' + obj.fldtype);
    this.basket.sort(this.compareSequence);
   
    return cnt;
}
SelectedItemBasket.prototype.remove = function(obj){
    var removedItem = TemporaryBasket.prototype.remove.call(this,obj);
    Consol.print("delete> selected itmes: " + this.size());
    this.basket.sort(this.compareSequence);
   
    return removedItem;
}

(이하 메서드 생략)


정말 단순한 객체죠?
하지만 그 단순함에 속아 커다란 문제점을 놓치고 말았습니다.

어떤 페이지에 SelectedItemBasket객체의 인스턴스를 두 개 이상 생성하였는데 문제가 발생하였습니다.
인스턴스가 한 개 일땐 전혀 일어나지 않던 문제였기에 무척이나 당황스러웠죠;;

문제는, 각 인스턴스가 자신의 속성으로 갖고 있는 Array객체인 basket 을 공유하는 것이었습니다.
분명 독립적으로 생성된 서로 다른 인스턴스지만 이상하게도 basket을 공유해서 한 쪽에서 add() 메서드를 호출하면 다른 쪽 basket에도 항목이 추가되어 결국 두 개의 인스턴스가 동일한 basket을 갖게 되었습니다.


결론부터 말하자면 문제의 원인은 SelectedItemBasket의 생성자 함수 였습니다.

function SelectedItemBasket(){}


prototype을 TemporaryBasket의 인스턴스로 하였기 때문에 당연히 초기화는 필요 없으리라 생각했는데 오산이었습니다.

SelectedItemBasket.prototype = new TemporaryBasket;

위와 같이 SelectedItemBasket 생성자 함수 아래에 prototype을 지정하였지만 이 코드는 페이지 로딩시 단 한 번 실행될 뿐입니다.

SelectedItemBasket 객체를 생성할때마다 호출 되는 것이 아니기 때문에 SelectedItemBasket 객체를 생성할 때마다 처음 생성된 TemporaryBasket 객체를 그대로 쓰게 됩니다. (개인적인 추측입니다;;;)

때문에 SelectedItemBasket의 생성자 함수에서 초기화 하는 작업이 필요합니다.

function SelectedItemBasket(){
    this.constructor();
}

물론 위 코드는 TemporaryBasket와 SelectedItemBasket 의 생성자 함수가 동일 하기 때문에 SelectedItemBasket만의 초기화 코드가 없습니다. 그저 TemporaryBasket의 생성자 함수를 빌려 쓰면 되는 것이지요.


'초기화'의 부재로 인해서 일어난 문제였던 만큼 다른 코드들을 건드리지 않고 쉽게 마무리가 되었습니다만, '초기화'의 중요성을 다시 한번 느끼게 되었습니다^^;; (C언어 책을 다시 보게 만드네요...)

posted by 초딩입맛제주아재
2008. 5. 15. 16:56 카테고리 없음
사용자 삽입 이미지


웃음이 나오려다 말았습니다.
슬프기까지 한건....

posted by 초딩입맛제주아재
2008. 5. 15. 10:54 카테고리 없음

사용자 삽입 이미지

다음에서 UI관련 세미나를 연다고 합니다.
26일까지 참가신청을 받고 선착순으로 참가 우선권을 준다고 하니 서둘러 신청하세요~

posted by 초딩입맛제주아재
2008. 4. 24. 00:49 카테고리 없음
작년 가을 구글 나이트 행사에 다녀왔었습니다.
멀리 미국에서 날아온 구글 본사 직원들(인터넷의 아버지 빈 서프 박사와 구글 맵의 개발자도~@.@)도 만나보고 유익한 시간이었습니다.

몇일전 구글로부터 한 통의 메일을 받았습니다.
2008 구글 나이트에 관한 메일이었습니다.

사용자 삽입 이미지

메일을 받고 나서 '2008 구글 나이트'를 검색해봤는데 관련 문서가 검색이 안되더군요.
메일 내용 처럼 이 번 행사는 구글 코리아 본사에서 하는 만큼 장소 문제가 있어 비공개로 참석자를 모집하는 것 같았습니다.

그런데  이것 저것 요구하는 사항이 많기도 합니다.
학력이나 인터뷰 경험 같은건 왜 물어보는건지 -_-;;

바로 답장을 발송하고 하루가 지나서 아쉬운 메일 한 통을 받았습니다.
사용자 삽입 이미지
저보다 먼저 참석 희망 메일을 보낸 사람이 많아서 인지 아쉽게도 이번 구글 나이트 행사는 그저 다녀오신 분들의 스케치를 기다려야 겠습니다.
posted by 초딩입맛제주아재
2008. 4. 15. 15:43 Programing/HTML/JavaScript/CSS
FireFox 확장 기능 중 웹 개발자들이 가장 많이 사용하는 확장 기능은 아마 FirebugWeb Developer가 아닐까 합니다.
웹 개발자의 필수품, Firebug

Web Developer 역시 없어서는 곤란하죠~

두 확장기능은 웹개발시 없어서는 안될 정말 유용한 툴들이죠.
IE에도 IE Developer 이라는 툴이 있어서 어느정도 유용하게 쓸 수 있습니다만 위의 것들에 비해 좀 부실한 면이 없지 않습니다.
반면 OperaSafari에는 저러한 툴이 없어 아쉬웠는데요, 그런 아쉬움은 이제 추억으로 묻어버려도 좋을 것 같습니다.


Opera Inspector

오페라 9.0 이후 버전 부터는 간단한 조작만으로 브라우저에 Inspector를 설치 할 수 있습니다.
설치를 위해서는 오페라 9.0 이후 버전으로 다음 URL의 페이지를 엽니다.
http://dev.opera.com/tools/

오페라 DOM Inspector 설치 버튼

그럼 위와 같은 버튼 두 개가 보이는데요, 저 버튼들을 드래그 하여 오페라 브라우저의 툴바에 드롭하는 것으로 Inspector의 추가는 끝납니다.

버튼을 드래그 하여 이곳에 드롭하면

설치 진행 여부를 확인하는 창이 뜨고, 예를 클릭하면,


새로운 툴바 버튼이 생성이 됩니다

이제 Opera의 DOM Inspector의 위용을 한 번 볼까요?

이쁘게도 생겼네요~

DOM Tree,CSS inspect, HTTP network 정보까지 Firebug와 비교해도 전혀 손색이 없죠? ^^

이번엔 사파리쪽을 살펴볼까요?


Safari Inspector

Safari 3.1 부터는 브라우저에 Inspector를 내장하고 있습니다.
하지만 메뉴속에 꼭꼭 숨어있어서 있는지조차 모르고 있었습니다;;;

메뉴의 편집>기본설정 또는 Ctrl + ,(콤마)를 누르면 아래와 같은 패널이 뜹니다.
Safari의 설정 패널

고급 탭의 하단을 보시면 "메뉴 막대에서 개발자용 메뉴 보기" 라는 항목이 있습니다.
이걸 체크해서 활성화를 시켜주면 메뉴바가 다음과 같이 바뀝니다.

단, Mac용 Safari에서 Inspector를 활성화 하려면 콘솔에서 아래와 같이 해주시면 됩니다.

defaults write com.apple.Safari \
WebKitDeveloperExtras -bool true


사용자 삽입 이미지

개발자용 메뉴가 새로 생겼습니다~ 캬~
메뉴를 클릭해보면 다양한 세부 항목들이 보입니다.

사용자 삽입 이미지

 Inspector의 활용방법은 간단합니다.
웹페이지의 요소에서 마우스의 우측버튼을 클릭하면 컨텍스트 메뉴 하단에 "구성 요소 점검" 이란 항목이 보입니다. 클릭하면 아래와 같은 감개무량한 Safari의 Inspector이 모습을 드러냅니다...

역시 애플 답구나~@.@

이제 Inspector를 쓰기위해 특정 브라우저를 고집할 이유는 없어진듯 합니다.(물론 지극히 주관적인 의견일테지만요~^^)
Opera,Safari도 많이 사랑해주세요~~^^




posted by 초딩입맛제주아재
2008. 4. 8. 18:07 카테고리 없음
Method

지난 포스트에서 Car객체를 만들어봤습니다.

function Car(name){
    this.name = name;
}

name 프로퍼티 하나만 가지고 있는 간단한 객체죠?

우리가 만든 이 Car라는 객체는 아직까지는 아무것도 할 수 없습니다.

이름만 갖고 있을 뿐 시동을 켜는것도 안되고, 문을 열 수도 없습니다.
이제 우리가 만든 이 Car에 하나하나 능력을 부여해 보도록 하겠습니다.
우선은 문을 여는 것 부터 해볼까요? (그래야 문을 열고 들어가서 시동을 걸 수 있겠죠? ^^)

먼저 문이 열린것을 확인 할 수 있는 상태변수를 하나 추가해야겠습니다.

function Car(name){
    this.name = name;
    this.isOpen = false;
}

Car.prototype.opendoor = function(){
    this.isOpen = true;
    alert('문이 열렸습니다.');
}

이제 Car의 문을 열 수 있습니다~
그런데 생소한 키워드 [prototype]이 등장했습니다.
프로토타입...시제품? prototype.js?
자바스크립트는



posted by 초딩입맛제주아재
2008. 4. 7. 15:01 Programing/HTML/JavaScript/CSS
Javascript OOP

최근 javascript로 OOP를 구현 하는 사례가 증가하고 있습니다.
AJAX와 함께 JSON이라는 효율적인 표기법과, prototype.js 이나 ExtJS같은 걸출한 javascript 프레임웍, 라이브러리 등이 출현하면서 javascript OOP는 점점 더 대중화가 되어가고 있습니다.
extjs sample

ExtJS 샘플

prototype.js

prototype.js


다시 말하면 javascript로 OOP를 구현하는 기술은 더이상 스페셜리스트들만 알고 있는 고급기술이 아니란거죠. 이를 다시 바꿔말하면 이제는 javascript OOP를 모르면 안된다는 말이기도 합니다~^^;;

가끔 웹서핑을 하다 페이지 소스를 보면 여기저기 많은 js 소스들에서 심심치 않게 'new' 연산자(operator)나 '{}' 같은 리터럴(object literal)을  볼 수가 있습니다.

'new'와 '{}' 은 javascript에서 객체를 생성할때 쓰는 연산자와 리터럴 입니다.


객체 생성하기

객체를 한 번 만들어 볼까요?

var car = new Car();

car라는 변수에 Car객체를 생성하여 대입하는 코드입니다.
실행하면 Car를 찾을 수 없다는 오류가 발생합니다.
클래스가 있어야겠죠?
클래스를 만들어보겠습니다.
javascript에서는 'function' 키워드를 써서 클래스 정의를 합니다. 함수 하나 만든다고 생각하시면 됩니다~

function Car(){
   
}

이제 Car객체가 만들어집니다.


Property

그런데 Car객체는 아무것도 가진게 없네요~^^ 껍데기만 있는 빈클래스는 의미가 없죠?
이제 Car에게 책임을 좀 지어줄까요?
먼저 이름을 주어야겠습니다. '애마1호기','달려라번개호' 같은 이름을 붙여준다면 더욱 애착이 가는 객체가 되겠죠?
이름은 객체의 속성(property)으로 볼 수 있습니다. javascript에서 객체의 속성은 '객체.속성이름 = 속성 값' 이렇게 할당 할 수 있습니다.

function Car(){
    this.name = '달려라번개호';
}

var car = new Car();
alert(car.name);

'달려라번개호'가 메세지 박스에 출력되네요~

그런데 저 this는 뭘까요?
이것의 이름은 달려라 번개호다?
네, 맞습니다~^^
여기서 this라는 키워드는 'new' 연산자를 통해 만들어진 Car객체의 인스턴스(instance)를 뜻합니다.

var car1 = new Car();
var car2 = new Car();
var car3 = new Car();

new 연산자가 실행될때마다, 붕어빵 기계에서 붕어빵이 나오듯 Car객체가 하나씩 만들어져서 나오게 됩니다. 이렇게 만들어진 하나하나의 객체를 인스턴스라고 하며 this란 그 인스턴스를 가리키는 것이지요~

this가 붙은 변수, 즉 객체의 property는 객체가 살아있는 동안 객체의 어느 곳에서든 사용 할 수 있습니다. 객체의 전역변수라고 생각하시면 되겠죠?

this 대신에 'var'를 붙여주면 지역 변수로 사용할 수 있습니다.

function Car(){
   
var engineSize = '5000cc';
    this.name = '달려라번개호' + engineSize;
}

var car = new Car();
alert(car.name);
alert(car.engineSize);

'달려라번개호5000cc'라는 이름은 출력이 되는데, engineSize은 'undefined' 라고 나오네요~
engineSize는 객체를 만들때 name 속성을 위해 희생하고는
지역변수의 비참한 최후를 맞이한듯 합니다.
var와 this의 차이랍니다~^^

그런데 Car를 세대(car1,car2,car3) 만들었는데 이름이 모두 똑같습니다.
달려라번개호
달려라번개호
달려라번개호
이제 그만 달리고 싶네요 ㅡ.ㅡ;;

Car 객체를 생성할때 이름을 따로따로 지어주고 싶습니다.
생성자인 function Car() 를 조금 손봐줘야겠군요.

function Car(name){
    this.name = name;
}

이렇게 해주면 Car를 생성할때 원하는 이름을 지어줄 수 있습니다.

var car1 = new Car('번개호');
var car2 = new Car('천둥이');
var car3 = new Car('폭풍3호');

alert(car1.name);
alert(car2.name);
alert(car3.name);

이제 만들어진 Car객체들이 저마다 다른 이름을 가질 수 있게 되었습니다.^^


javascript로 객체 만들기~ 참 쉽죠? ^^
다음엔 Car를 움직여보도록 하겠습니다. 이름만 있는 차 보다는 타고 다닐 수 있는 차가 더 좋겠죠?
javascript object's method를 기대해 주세요~!!


'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

객체 초기화의 중요성  (1) 2008.05.23
오페라,사파리의 DOM Inspector  (6) 2008.04.15
URL, 도메인 추출 정규식 (2)  (5) 2008.02.22
URL, 도메인 추출 정규식  (0) 2008.02.20
javascript의 클로저(closure)  (2) 2007.09.21
posted by 초딩입맛제주아재
2008. 3. 24. 16:27 카테고리 없음
external.AddSearchProvider

http://msdn2.microsoft.com/en-us/library/ms535931(VS.85).aspx

http://developer.mozilla.org/en/docs/Adding_search_engines_from_web_pages


posted by 초딩입맛제주아재
2008. 2. 22. 17:30 Programing/HTML/JavaScript/CSS
어제 정규식 수정하고 포스팅 하는걸 깜빡했네요^^;;

첫 정규식에서는 도메인에 하이픈이나 한글 도메인 추출이 안됐었죠.





또다시 머리를 이리굴리고 저리굴리고 하다가 해결했습니다.





정규식을 이렇게 바꿔봤습니다.
/(http(s)?:\/\/)?\S+(\.[^(\n|\t|\s|\/))]+)+/gi

이전 것은 이랬죠.
/(http(s)?:\/\/)?\w+\.\w+(\.\w+)+/gi

\S는 공백을 제외한 문자입니다.
\S를 씀으로써 추가적인 문제가 발생할 수도 있습니다만, 그 문제는 생각하지 않기로 했습니다.
정 거슬리면 [a-zA-Z0-9가-힣] 이런 식으로 쓸 수도 있습니다만,
아직은 원하는 결과를 보여주니 도메인추출 정규식은 여기서 마무리를 지어야 겠습니다.^^;
혹시 더 좋은 방법 알고 계신분은 지도 부탁드립니다~~


posted by 초딩입맛제주아재