Rev. 2.73

기존 String 클래스에 메서드를 추가하고 있습니다.

stripTags 메서드
태그를 없애는, 이군요. 이정규 표현이라면 올바르게 태그를 없앨 수 없는 경우가 있습니다.

alert("<input type='text' value='>'/>TEST".stripTags());
//「TEST」가 아니고, 「'/>TEST」라고 표시되어 버린다.

【수정안】
  stripTags: function() {
    return str.replace(/<\/?[^"'>]*(?:(?:"(?:\\"|[^"]) *"|'(?:\\'|[^'])*')[^"'>]*)*\/?>/gi, '');
  },

아마 이것으로 갈 수 있다고 생각합니다만.아무튼, 솔직하게 이스케이프 시키고 녹아라고 하는 이야기입니다^^;

stripScripts 메서드
캐릭터 라인(this)으로부터,script블록을 삭제하는 메서드입니다.전술 Prototype오브젝트의ScriptFragment 프롭퍼티로부터 script 블록의 정규 표현 캐릭터 라인을 취득하고 있습니다.

replace 메서드 제2 인수의 m수식자는, 정규 표현을 멀티 라인 모드로 하기 위한 물건입니다만, Prototype.ScriptFragment에는 「^」 「$」이 사용되지 않기 때문에 의미가 없는 생각이 듭니다.

var str = "1_line\n2_line";

alert(str); //1_line
            //2_line 와 표시(\n는 개행)

var matches = str.match(/^2_line/); 
alert(matches); //'null'라고 표시된다.성냥 하지 않는다.

matches = str.match(/^2_line/m); //멀티 라인 모드
alert(matches); //'2_line'라고 표시된다.「^」이 줄머리에 성냥 했다.

extractScripts 메서드
캐릭터 라인(this)의 모든 script 블록의 내용을, 배열에 격납해 반환하는 메서드입니다.

Prototype.ScriptFragment를 사용해, 글로벌 매치하는 정규 표현 오브젝트와 싱글 매치하는 정규 표현 오브젝트를 작성합니다.m수식자는 무의미한 생각이 듭니다.

조금 까다롭습니다만, 캐릭터 라인(this)으로부터 모든 script 블록을 추출해, 더욱 각각으로부터 script 블록의 내용(코드 부분)을 추출해 배열에 격납해, 반환하고 있습니다.

map 메서드는 Array 클래스에 추가되고 있는 메서드입니다. 인수로 지정된 함수를, 배열 요소 모든 것을 차례로 인수로 지정해 실행해, 결과를 배열에 격납해 반환합니다.

이하의 일행은 script 블록의 내용을 뽑아내 반환하고 있습니다.성냥 하지 않으면 공문자(['', '']의 2번째의'')를 반환합니다만, 이 케이스는 발생하지 않는 생각이 듭니다.

싱글 모드의 매칭의 경우에서도, 반환되는 것은 배열입니다.인덱스 0에 성냥 한 전체의 캐릭터 라인, 인덱스 1이후에, 「(pattern)」로 그룹 한 부분에 성냥 한 캐릭터 라인이 차례차례 격납됩니다.다만, 「(」의 직후에 「?:」(이)가 있으면(자) 후방 참조 불가가 되어, 격납되지 않습니다.

var str = "aaabbbcccdddeee";
var matches = str.match(/a+(b+)(?:c+)(d+)/);
alert(matches[0]); //"aaabbbcccddd"라고 표시된다
alert(matches[1]); //"bbb"라고 표시된다
alert(matches[2]); //"ddd"라고 표시된다
//참고 RegExp 오브젝트에 의한 취득
alert(RegExp.$1); //"bbb"라고 표시된다
alert(RegExp.$2); //"ddd"라고 표시된다

evalScripts 메서드
캐릭터 라인(this)으로부터, 전술 extractScripts 메서드로 취득한script코드 모든 것을, eval함수로 실행하고 있습니다.

요소의 innerHTML 프롭퍼티에 소스를 설정하면(자), 태그등이 평가되어 표시됩니다만, script 블록은 실행되지 않습니다.이것을 실행시키는데 evalScripts 메서드가 도움이 됩니다.

function load(){
  var str = "<div id='msg'>none</div>"
          + "<script>$('msg').innerHTML = 'hello!'</script>";
  $('box').innerHTML = str; //이 시점에서는'none'라고 표시된다.
  str.evalScripts(); //script 블록이 실행되어 'hello!'하지만 표시된다.
}

str.evalScripts();를comment out 하면(자), 'none'가 표시됩니다.

Opera에서의 버그
evalScripts 메서드는 Opera로 에러가 되는 버그가 있습니다.eval 함수를인수로서 건네주는 것에 문제가 있다고 합니다.v1.5.0_rc0에서는 개선되고 있습니다.

escapeHTML 메서드
캐릭터 라인(this)의HTML문 자를 이스케이프 해 반환합니다.즉 「text」(이)라고 하는 캐릭터 라인을 「<p>text</p>」로 변환합니다.이 방식은 몰랐습니다.div 요소의 텍스트 노드에 캐릭터 라인을 설정하면(자), innerHTML로 이스케이프 한 캐릭터 라인을 얻을 수 있습니다···.

조금 신경이 쓰이는 것은, 워크로서 작성한 div 요소의 뒤처리가 없기 때문에, 메서드를 사용할 때마다 쓸데없는 요소가 증가해 가는 것 같은 생각이 듭니다.뭐, 그다지 문제는 아닐지도 모릅니다만.

unescapeHTML 메서드
escapeHTML 메서드의 역.캐릭터 라인(this)의 태그를 없앤 다음, 안 이스케이프 해 반환합니다.innerHTML에 넣기 전에 stripTags 메서드로 태그를 없애고 있는 것은, 워크용 div 요소의 아이 요소를 하나인 만큼 하기 (위해)때문입니다.이것에 의해 div.childNodes[0].nodeValue로 안 이스케이프 한 캐릭터 라인을 취득할 수가 있습니다.

alert("\<p\><test</p>".unescapeHTML());
//'<test'라고 표시된다

이쪽도 워크용 div 요소의 뒤처리가 없는 것이 신경이 쓰입니다만···.

toQueryParams 메서드
우선, 캐릭터 라인(this)을 쿠에리 캐릭터 라인으로 간주해, 선두 「?」보다 이후의 캐릭터 라인을 「&」으로 분할해 배열에 격납합니다.inject 메서드는 Array 클래스의 추가 메서드입니다.제2인수의함수의 제2 인수(pairString)에 배열의 각 요소의 값이 들어옵니다.처리의 결과를 제일 인수(params)에 격납해 반환합니다.이것을 반복해, 최종적인 결과를 격납한 것(params)를 반환합니다.inject의 제일 인수(은)는 반환치의 초기치입니다.(이해하기 어려운 설명으로 해결되지 않습니다···)

즉 여기에서는, 배열의 각 요소의 「name=value」의name를 인덱스,value를 값으로 한 커스텀오브젝트가 반환되게 됩니다.

toArray 메서드
캐릭터 라인(this)을, split로 1 문자씩 배열에 격납해 반환합니다.단락 캐릭터 라인에 공문자열을 지정하는 것으로 1 문자씩에 분할합니다.

camelize 메서드
캐릭터 라인(this)이 「aaa-bbb」형식일 때, 「aaaBbb」형식으로 변환해 반환합니다.CSS프롭퍼티를 오브젝트 모델 구문으로 변환하는 경우에 편리합니다.실제, 후술 하는 Element 오브젝트의 getStyle 메서드로 사용되고 있습니다.

기초적인 함수 밖에 사용하지 않기 때문에 처리의 설명은 생략합니다^^; 조금 이해하기 어려운 부분이 있다고 하면, 이하입니까.

inspect 메서드
캐릭터 라인(this)을 싱르크트 「'」로 둘러싸, 캐릭터 라인중의 「\」을 「\\」에, 「'」를 「\'」로 변환해 반환합니다.캐릭터 라인 리터럴의 「\」은 「\\」으로 표현되어 싱르크트 「'」로 둘러싸인 캐릭터 라인 리터럴중의 「'」는 「\'」로 표현됩니다.(알아도 까다롭다><;)

2006/07/25 덧붙여 씀.덧붙여서, 「prototype.js v1.4.0 의 사용법」에는 이 메서드의 기술이 없습니다(원문에도).어째서라고 생각하면(자), 전술 Object.inspect 메서드(Object 클래스의 고유 메서드)로 액세스 되는 것이 전제이군요^^;

parseQuery 메서드
toQueryParams 메서드의 별명 정의입니다.

Comments

Got something to add? You can just leave a comment.

Your Reaction Time!

captcha

avatar