Tag Archives: 자바스크립트

Prototype Javascript Framework – document.viewport

이번에는 문서의 크기와 스크롤 정보를 가져오는 방법을 알아보겠습니다.
문서의 크기와 스크롤 정보를 가져오는 방법은 브라우저마다 틀리고 또 처리하기가 나름 어려운 면이 있습니다.
하지만 Prototype의 메서드를 이용하시면 깔끔하게 이용하실 수 있습니다.

document.viewport Methods ————————————————————————————–

getDimensions : 화면에 보이는 영역의 크기값을 가져옵니다.
[code]document.viewport.getDimensions() -> { width: Number, height: Number }[/code]

예제)
[code]document.viewport.getDimensions();
//-> { width: 776, height: 580 }[/code]

getHeight : 화면에 보이는 영역의 세로 크기값을 가져옵니다.
[code]document.viewport.getHeight() -> Number[/code]
document.viewport.getDimensions().height 와 동일합니다.

getWidth : 화면에 보이는 영역의 가로 크기값을 가져옵니다.
[code]document.viewport.getWidth() -> Number[/code]
document.viewport.getDimensions().width 와 동일합니다.

getScrollOffsets : 보이는 화면 영역의 스크롤 위치 값을 가져옵니다.
[code]document.viewport.getScrollOffsets() -> [Number, Number] also accessible as { top: Number, left: Number }[/code]

예제)
[code]document.viewport.getScrollOffsets();
//-> { left: 0, top: 0 }


window.scrollTo(0, 120);


document.viewport.getScrollOffsets();
//-> { left: 0, top: 120 }[/code]

Prototype Javascript Framework – TimedObserver

이번엔 TimedObserver 클래스에 대해 알아보죠.
이 클래스는 Abstract.TimedObserver를 상속받아 구현되어있는 클래스입니다. 그 이전에 Abstract.TimedObserver는 PeriodicalExecuter를 상속받고 있죠. 이쯤 되면 무엇을 하는 녀석일지 감이 오시죠?

기본 모토는 분명히 주기적으로 어떤 콜백 함수를 실행하는 녀석이겠군요. 답부터 말씀 드리자면 폼이나 혹은 폼안의 특정 엘리먼트의 값 변동을 추적하는 일을 합니다.
값을 계속해서 저장해 놓았다가 값이 변경되면 이전의 값과 비교하여 값이 달라졌을 경우 콜백 함수를 실행하게 되죠.

[code]new Form.Element.Observer(
  ‘myelement’,
  0.2, // 0.2초
  function(el, value){
    alert(‘폼의 myelement의 값이 변경되었음: ‘ + value)
  }
)[/code]
감이 오시나요? 콜백 함수의 첫번째 인자로는 이벤트가 발생한 엘리먼트 혹은 폼이 넘어오게 되고 두번째로는 변경된 값이 넘어옵니다.

Abstract.TimedObserver를 좀 볼까요?
[code]Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  // 생성자
  initialize: function($super, element, frequency, callback) {
    // PeriodicalExecuter의 생성자에 값을 넘김
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },
  // 매번 실행될 메서드
  execute: function() {
    // getValue메서드를 이용하여 해당 엘리먼트의 값을 가져옴
    var value = this.getValue();
    // lastValue와 value가 문자열인지 확인하여 아닐경우 강제 변환
    // lastValue와 value값이 다르면 콜백함수 호출
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      // lasterValue값을 value값으로 바꿈
      this.lastValue = value;
    }
  }
});[/code]
Abstract를 애써 붙인것이 추상 클래스로 사용하고 싶은 모양이군요. Prototype을 보다보면 느끼는거지만 되도않는 언어를 가지고 별의별걸 다 구현해서 나름 의미까지 부여해 가며 만들었다는것에 놀라움을 느끼게 됩니다.

[code]Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    // 폼 엘리먼트의 값을 가져옴
    return Form.Element.getValue(this.element);
  }
});


Form.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    // 폼의 전체 엘리먼트 값을 파라미터 형식으로 가져옴
    return Form.serialize(this.element);
  }
});[/code]
위를 보니 getValue만 폼이냐 폼엘리먼트냐에 따라 다르게 구현하였군요.

예제는 굳이 없어도 실행 데모를 한번만 보시면 이해하실 것 같습니다. [데모실행]