Tag Archives: 자바스크립트

Prototype Javascript Framework – Form

그동안 빼먹고 있었군요. 중요도로 따지면 Element와 쌍벽을 이루는 Form에 대해서 알아보도록 합시다.
사실 웹페이지에 Form없이 이루어진 페이지를 찾기가 어려울 정도로 많이 쓰이고 있습니다. 데이터를 서버측으로 전송하기 위해서 사용할 수 있는 가장 기본적이면서 강력한 방법일테니깐요. 그 Form을 위해 만들어진 클래스에 대해 알아보겠습니다.

Form Methods —————————————————————————————————–
disable : 폼 혹은 폼 엘리먼트를 비활성화 합니다.
[code]disable(formElement) -> HTMLFormElement[/code]

예제)
[code]var form = $(‘disable-example’);
// form.disabled값에 따라 form.enable()과 form.disable()를 실행
form[form.disabled ? ‘enable’ : ‘disable’]();
form.disabled = !form.disabled;[/code]

enable : 폼 혹은 엘리먼트를 활성화 합니다.
[code]enable(formElement) -> HTMLFormElement[/code]
disable() 메서드로 비활성화 시킨 폼 및 폼 엘리먼트를 활성화 시킵니다.

findFirstElement : 숨겨지지 않고 비활성화되지 않은 첫번째 폼 컨트롤 엘리먼트를 반환합니다.
[code]findFirstElement(formElement) -> HTMLElement[/code]
이 메서드는 INPUT, SELECT, TEXTAREA 엘리먼트중에 첫번째 엘리먼트를 반환합니다. 문서상의 첫번째 엘리먼트로 반환하며 tabindex 순서는 따르지 않습니다. focusFirstElement() 메서드에서 사용합니다.

focusFirstElement : 숨겨지지 않고 비활성화되지 않은 첫번째 폼 컨트롤을 Activate 합니다.
[code]focusFirstElement(formElement) -> HTMLFormElement[/code]
findFirstElement를 사용하여 첫번째 엘리먼트를 찾아온 후 activate() 메서드를 호출합니다.

getElements : 폼의 모든 폼 컨트롤 엘리먼트를 배열로 반환합니다.
[code]getElements(formElement) -> array[/code]
주의!! SELECT컨트롤의 경우 하위 OPTION 컨트롤은 결과에 포함되지 않습니다.

getInputs : 폼의 모든 INPUT 폼 컨트롤 엘리먼트를 반환합니다.
[code]getInputs(formElement [, type [, name]]) -> array[/code]
폼의 모든 INPUT폼 컨트롤 엘리먼트를 가져옵니다. type과 name을 옵션으로 줄 수 있습니다.

예제)
[code]var form = $(‘myform’);


form.getInputs();
// -> 모든 INPUT 폼컨트롤 엘리먼트


form.getInputs(‘text’);
// -> INPUT 폼컨트롤 엘리먼트중에 type이 text인 엘리먼트


var buttons = form.getInputs(‘radio’, ‘education’);
// -> type이 radio이며 name이 education인 폼컨트롤 엘리먼트를 disable()
buttons.invoke(‘disable’);[/code]

request : form의 action 파라미터값으로 submit을 합니다.
[code]request([options]) -> new Ajax.Request[/code]
이 메서드야 말로 페이지 이동 없이 form submitting을 하게 만들어 주는 주체가 되는 메서드인것 같습니다. 폼 안의 폼 컨트롤들의 값을 모아 form의 action 파라미터에 있는 페이지로 Request를 요청합니다. 이후 결과 처리도 할 수 있습니다.



  • form에서 method 파라미터를 가지고 있다면 Ajax.Request의 method 파라미터로 전달됩니다.

  • method가 없을 경우에는 기본적으로 POST로 설정됩니다.

  • ‘키-값’의 쌍을 이루는 폼 컨트롤들의 값은 parameters 옵션에 전달됩니다.

예제)
[code]<form id=”person-example” method=”POST” action=”/user/info”>
  <fieldset><legend>User info</legend>
    <div><label for=”username”>Username:</label>
    <input type=”text” name=”username” id=”username” value=”” /></div>
    <div><label for=”age”>Age:</label>
    <input type=”text” name=”age” id=”age” value=”” size=”3″ /></div>
    <div><label for=”hobbies”>Your hobbies are:</label>
    <select name=”hobbies[]” id=”hobbies” multiple=”multiple”>
      <option>coding</option>
      <option>swimming</option>
      <option>hiking</option>
      <option>drawing</option>
    </select>
  </div>
  <div class=”buttonrow”><input type=”submit” value=”serialize!” /></div>
  </fieldset>
</form>[/code]
[code]$(‘person-example’).request();
// Request 완료~!


// 다음과 같은 방법으로 콜백함수를 사용할 수 있습니다.
$(‘person-example’).request({
  onComplete: function(){ alert(‘Form data saved!’) }
})[/code]
다른 파라미터 값을 추가적으로 사용하고 싶을경우에는 parameters인자를 사용하면 됩니다. 마찬가지로 method도 임의로 변경 할 수 있습니다.
[code]$(‘person-example’).request({
  method: ‘get’,
  parameters: { interests:’JavaScript’, ‘hobbies[]’:[‘programming’, ‘music’] },
  onComplete: function(){ alert(‘Form data saved!’) }
})[/code]

reset : 폼의 내용을 디폴트 값으로 초기화 합니다.
[code]reset(formElement) -> HTMLFormElement[/code]

예제)
[code]Form.reset(‘contact’);
// 다음과 동일


$(‘contact’).reset();
// 둘다 reset 버튼을 누른것과 동일한 효과를 가져옴[/code]

serialize : Ajax Request에 최적화된 문자열로 변환하거나 혹은 해시형 객체로 반환합니다.
[code]serialize(formElement[, getHash = false]) -> String | object[/code]

예제)
[code]$(‘person-example’).serialize();
// -> ‘username=sulien&age=22&hobbies=coding&hobbies=hiking’
$(‘person-example’).serialize(true);
// -> {username: ‘sulien’, age: ’22’, hobbies: [‘coding’, ‘hiking’]}[/code]

serializeElements : Form.serialize와 동일하나 특정 엘리먼트 배열을 인자로 받습니다.
[code]serializeElements(elements[, getHash = false]) -> string[/code]

예제)
[code]Form.serializeElements( $(‘myform’).getInputs(‘text’) )
// -> serialized data[/code]

Form.Element Methods ——————————————————————————————-
이 클래스는 폼 관련 메서드중에서도 폼안의 컨트롤 엘리먼트를 위한 메서드들을 모아놓은 클래스입니다.
Form과 많은 부분이 중복되니 새로운것만 써보도록 하겠습니다.

activate : 엘리먼트의 컨텐츠 영역에 커서가 이동하며 내용이 있었다면 해당 내용이 선택됩니다.
[code]activate(element) -> HTMLElement[/code]

예제)
[code]Form.Element.focus(‘myelement’).select();
$(‘myelement’).activate();[/code]

clear : text INPUT의 내용을 삭제합니다.
[code]clear(element) -> HTMLElement[/code]

예제)
[code]$(‘some_field’).onfocus = function() {
  // 이미 삭제되었다면 아무것도 하지 않음
  if(this._cleared) return
  // this키워드는 폼컨트롤 엘리먼트 자신을 지칭
  this.clear()
  this._cleared = true
} [/code]

disable : Form 클래스와 동일

enable : Form 클래스와 동일

focus : 해당 엘리먼트에 키보드 포커스를 줍니다.
[code]focus(element) -> HTMLElement[/code]

예제)
[code]Form.Element.focus(‘searchbox’);
// 위와 거의 동일. 하지만 아래는 JS native 메서드이기 때문에 엘리먼트를 반환하지 않음
$(‘searchbox’).focus();[/code]

getValue : 엘리먼트의 값을 가져옵니다. 간단하게 사용할 수 있는 유틸리티 함수인 $F()가 있습니다.
[code]getValue(element) -> string | array[/code]

예제)
[code]var form = $(‘contact’);
var input = form[‘company’];
Form.Element.getValue(input);


// 다음과 같은 방법도 있음
$(input).getValue();
// $()메서드는 확장된 엘리먼트를 가져올 수 있음
// 하지만 $F(input)을 사용하면 위의 과정을 더욱 단축 시킬 수 있음[/code]

present : 엘리먼트안의 값이 존재하는지를 확인합니다.
[code]present(element) -> boolean[/code]

예제)
[code]$(‘example’).onsubmit = function(){
  var valid, msg = $(‘msg’)
  // 두 필드의 prestion() 결과가 참인가?
  valid = $(this.username).present() && $(this.email).present()
  if (valid) {
    // 기본적인 처리를 한 후 return true 한다
    msg.update(‘Passed validation!’).style.color = ‘green’
  } else {
    msg.update(‘Please fill out all the fields.’).style.color = ‘red’
  }
  return false
}[/code]

select : 해당 폼컨트롤의 값 전체를 선택합니다.
[code]select(element) -> HTMLElement[/code]

예제)
[code]$(‘searchbox’).onfocus = function() {
  Form.Element.select(this);
  // 다음의 native 메서드를 사용할 수 있음. 하지만 엘리먼트를 반환하지 않음
  this.select();
}[/code]

serialize : Form 클래스와 동일

Prototype Javascript Framework – Template

이번엔 Prototype에서 제공하는 많은 분들이 있는지 없는지도 모르시는 유명한 녀석 Template에 대해 알아보도록 할까요.
저도 사실 Prototype에서 제공하는 기능들을 나름 대충 거의다 접해봤다지만 이녀석 만큼은 전혀 사용해본 적이 없습니다;
이번에 다시 한번 공부를 하면서 천천히 보니 이녀석을 잘 쓰면 정말 괜찮겠다는 생각이 드는군요.
같은 형식을 계속해서 찍어낸다거나 어떤 틀이 필요한 작업을 할때 매우 유용하게 사용될 수 있을것 같습니다.

Template 사용하기 ————————————————————————————————-
Prototype에서 제공하는 Template 클래스는 Ruby의 템플릿과 매우 유사한 문법을 사용하고 있습니다.
Template에는 #{필드명} 형식의 심볼을 가진 문자열을 포함하게 되며 evaluate라는 메서드를 통해 템플릿이 사용되게 될때 해당 필드명에 해당하는 다른 객체의 값으로 대체되게 됩니다.

예제)
[code]// 계산을 위한 템플릿
var myTemplate = new Template(‘The TV show #{title} was created by #{author}.’);


// 템플릿에 사용될 데이터
var show = {title: ‘The Simpsons’, author: ‘Matt Groening’, network: ‘FOX’ };


// 데이터를 적용하여 템플릿 사용
myTemplate.evaluate(show);
// -> The TV show The Simpsons was created by Matt Groening.[/code]

Template의 재사용성 ———————————————————————————————–
위의 예제를 통해 Template의 사용법을 알게 되었습니다. 위를 통해 알 수 있듯이 Template은 정적인 데이터를 사용하기 위핸 클래스가 아닙니다. 정적인 부분을 유지하며 매우 동적인 데이터 처리를 할 수 있습니다.
이는 결과적으로 데이터의 재사용성을 뜻합니다.

예제)
[code]// 데이터로 사용할 객체 생성
var conversion1 = {from: ‘meters’, to: ‘feet’, factor: 3.28};
var conversion2 = {from: ‘kilojoules’, to: ‘BTUs’, factor: 0.9478};
var conversion3 = {from: ‘megabytes’, to: ‘gigabytes’, factor: 1024};


// 템플릿 생성
var templ = new Template(‘Multiply by #{factor} to convert from #{from} to #{to}.’);


// 각 객체별 템플릿 포맷 적용
[conversion1, conversion2, conversion3].each( function(conv){
  templ.evaluate(conv);
});
// -> Multiply by 3.28 to convert from meters to feet.
// -> Multiply by 0.9478 to convert from kilojoules to BTUs.
// -> Multiply by 1024 to convert from megabytes to gigabytes.[/code]

Escape 처리 ——————————————————————————————————-
객체의 데이터 바인딩 없이 문자열로 표시하고 싶을 경우에는 어떻게 해야 할까요? 다른 언어와 동일합니다.

예제)
[code]// 자바스크립트에서 Escape처리를 하기위해서는 \를 두개 사용해야 함
var t = new Template(‘in #{lang} we also use the \\#{variable} syntax for templates.’);
var data = {lang:’Ruby’, variable: ‘(not used)’};
t.evaluate(data);
// -> in Ruby we also use the #{variable} syntax for templates. [/code]

Custom Syntaxes ————————————————————————————————–
Template 클래스의 기본 Syntax는 #{필드명}을 따르고 있습니다. 하지만 개인적으로 다른 형식으로도 얼마든지 사용할 수 있습니다. 하지만 정규식을 좀 알아야 할 필요가 있겠군요.

<%=필드명%>형식을 사용할 때 예제)
[code]var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/;
// ‘<%= field %>’ 형식에 매칭되는 Syntax


var t = new Template(‘<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>’, syntax);
t.evaluate( {name: ‘John Smith’, age: 26} );
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div>[/code]

Template Methods ————————————————————————————————

evaluate : 데이터가 담겨있는 객체를 이용하여 템플릿의 포매팅 결과값을 반환합니다.
[code]evaluate(object) -> String[/code]

예제)
[code]var hrefTemplate = new Template(‘/dir/showAll?lang=#{language}&categ=#{category}&lv=#{levels}’);
var selection = {category: ‘books’ , language: ‘en-US’};


hrefTemplate.evaluate(selection);
// -> ‘/dir/showAll?lang=en-US&categ=books&lv=’


hrefTemplate.evaluate({language: ‘jp’, levels: 3, created: ’10/12/2005′});
// -> ‘/dir/showAll?lang=jp&categ=&lv=3’


hrefTemplate.evaluate({});
// -> ‘/dir/showAll?lang=&categ=&lv=’


hrefTemplate.evaluate(null);
// -> error ![/code]