javascript의 escape(), encodeURI(), encodeURIComponent()함수들에 대해서,
어느 문자가 인코딩 되고,어느문자가 인코딩되지 않는지, 알아보기 힘들기 때문에 정리해둠.

우선은 대상의 범위는 %20(공백문자)부터 %7E(~)까지

원 데이터 

 !"#$%&'()*+,-./
0123456789
:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~

escape()

%20%21%22%23%24%25%26%27%28%29*+%2C-./
0123456789
%3A%3B%3C%3D%3E%3F@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
%5B%5C%5D%5E_%60
abcdefghijklmnopqrstuvwxyz
%7B%7C%7D%7E%7F

encodeURI()

%20!%22#$%25&'()*+,-./
0123456789
:;%3C=%3E?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
%5B%5C%5D%5E_%60
abcdefghijklmnopqrstuvwxyz
%7B%7C%7D~%7F

encodeURIComponent()

%20!%22%23%24%25%26'()*%2B%2C-.%2F
0123456789
%3A%3B%3C%3D%3E%3F%40
ABCDEFGHIJKLMNOPQRSTUVWXYZ
%5B%5C%5D%5E_%60
abcdefghijklmnopqrstuvwxyz
%7B%7C%7D~%7F

정리

  • 모든 함수가[0-9A-Za-z]는 변환하지 않음.
  • escape()가 변환하지 않는 기호는 *+-./@_ 임.
  • encodeURI()가 변환하지 않는 기호는 !#$'()*+,-./:;=?@_~ 임.
  • encodeURIComponent()가 변환하지 않는 기호는 !'()*-._~ 임.
  • 다중 바이트나 코드에 대해서는, 예를들면 UTF-8의 「あ」는 escape()의 경우 %u3042, encodeURL() 및 encodeURIComponent()의 경우 %E3%81%82 임.

덤.
변환 툴1

source :
escape() :
encodeURI() :
encodeURIComponent() :

변환 툴2 

input :
output :
decode by :
출처 : http://groundwalker.com/blog/2007/02/javascript_escape_encodeuri_encodeuricomponent_.html
AND

문자열을 입력받아서 필터링하는데 있어 걸림돌이 되는 녀석

그건 바로

Escape Charater다.

.*+?|()[]{}\ 를 일컫는데

요 며칠 뒤비다 줃은 함수..

  1. RegExp.escape = function(str)
  2. {
  3. var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
  4. return str.replace(specials, "\\$&");
  5. }
귀찮으니 그냥 쓰자 ㅋㅋ

출처 : http://snipplr.com/view/9649/escape-regular-expression-characters-in-string/
AND

지난번에 봐둔걸 까먹고 또 검색을 한고로..
아무래도 등록해놔야할듯해서 적어봄..

나는 평소에 이렇게 만들어 썼었다.
<span style="cursor:pointer;" onclick="anyFuntion();">link</span>
다만 태그의 본연의 기능이 아니기에 표준을 준수하기 위해 검색 시작..

이넘이 일반적인 링크..
<a href="#" onclick="anyFuntion();">link</a>
이렇게 쓰면 화면 전환 직전에 화면 최상단까지 스크롤 된후 페이지가 이동된다.

<a href="javascript: return false;" onclick="anyFuntion();">link</a>
이게 맞는줄 알았는데 에러가 발생..

그래서 찾아낸 두녀석.. 둘다 스크롤없이 anyFunction()을 실행함
<a href="javascript;" onclick="anyFuntion();">link</a>
<a href="javascript:void(0);" onclick="anyFuntion();">link</a>

에효 휘발성 메모리를 가진 죄로 글이 늘어가는군..
AND

IE6에선 별반 차이 없어보이는 이 두녀석..
브라우저별로 동작이 아주 약간 다르다..
event가 끼었을경우 이야기다.
키가 눌렀을때 인식하는 키값을 알아오는것이
event.keyCode

문젠 Firefox의경우 keypress로 처리해버리면
키값이 설정되기 전에 실행해버리기때문에 키값을 얻을 수 없다.

결국 keydown으로 처리


그외에 필요없는 키 입력을 필터링 해버리는 작업을 했다.
아래의 필터제외 대상은 키보드의 숫자. 키패드의 숫자 및 기본적 조작키

키입력 이벤트 취소가 IE와 FF&Chrome의 처리법이 다르므로 분기 작성..

function onlyNumber(evt)
{
    if ((evt.keyCode<8)||((evt.keyCode>9)&&(evt.keyCode<35))||((evt.keyCode>57)&&(evt.keyCode<96))||(evt.keyCode>105))
    {
        if(navigator.appName == "Microsoft Internet Explorer")
        {
            evt.returnValue = false;
            evt.cancelBubble = true;
        }
        if(evt.preventDefault)
        {
            evt.preventDefault();
            evt.stopPropagation();
        }
    }
}

아래는 event.keyCode의 값들이다.

Key code Value
DOM_VK_CANCEL 3
DOM_VK_HELP 6
DOM_VK_BACK_SPACE 8
DOM_VK_TAB 9
DOM_VK_CLEAR 12
DOM_VK_RETURN 13
DOM_VK_ENTER 14
DOM_VK_SHIFT 16
DOM_VK_CONTROL 17
DOM_VK_ALT 18
DOM_VK_PAUSE 19
DOM_VK_CAPS_LOCK 20
DOM_VK_ESCAPE 27
DOM_VK_SPACE 32
DOM_VK_PAGE_UP 33
DOM_VK_PAGE_DOWN 34
DOM_VK_END 35
DOM_VK_HOME 36
DOM_VK_LEFT 37
DOM_VK_UP 38
DOM_VK_RIGHT 39
DOM_VK_DOWN 40
DOM_VK_PRINTSCREEN 44
DOM_VK_INSERT 45
DOM_VK_DELETE 46
DOM_VK_0 48
DOM_VK_1 49
DOM_VK_2 50
DOM_VK_3 51
DOM_VK_4 52
DOM_VK_5 53
DOM_VK_6 54
DOM_VK_7 55
DOM_VK_8 56
DOM_VK_9 57
DOM_VK_SEMICOLON 59
DOM_VK_EQUALS 61
DOM_VK_A 65
DOM_VK_B 66
DOM_VK_C 67
DOM_VK_D 68
DOM_VK_E 69
DOM_VK_F 70
DOM_VK_G 71
DOM_VK_H 72
DOM_VK_I 73
DOM_VK_J 74
DOM_VK_K 75
DOM_VK_L 76
DOM_VK_M 77
DOM_VK_N 78
DOM_VK_O 79
DOM_VK_P 80
DOM_VK_Q 81
DOM_VK_R 82
DOM_VK_S 83
DOM_VK_T 84
DOM_VK_U 85
DOM_VK_V 86
DOM_VK_W 87
DOM_VK_X 88
DOM_VK_Y 89
DOM_VK_Z 90
DOM_VK_CONTEXT_MENU 93
DOM_VK_NUMPAD0 96
DOM_VK_NUMPAD1 97
DOM_VK_NUMPAD2 98
DOM_VK_NUMPAD3 99
DOM_VK_NUMPAD4 100
DOM_VK_NUMPAD5 101
DOM_VK_NUMPAD6 102
DOM_VK_NUMPAD7 103
DOM_VK_NUMPAD8 104
DOM_VK_NUMPAD9 105
DOM_VK_MULTIPLY 106
DOM_VK_ADD 107
DOM_VK_SEPARATOR 108
DOM_VK_SUBTRACT 109
DOM_VK_DECIMAL 110
DOM_VK_DIVIDE 111
DOM_VK_F1 112
DOM_VK_F2 113
DOM_VK_F3 114
DOM_VK_F4 115
DOM_VK_F5 116
DOM_VK_F6 117
DOM_VK_F7 118
DOM_VK_F8 119
DOM_VK_F9 120
DOM_VK_F10 121
DOM_VK_F11 122
DOM_VK_F12 123
DOM_VK_F13 124
DOM_VK_F14 125
DOM_VK_F15 126
DOM_VK_F16 127
DOM_VK_F17 128
DOM_VK_F18 129
DOM_VK_F19 130
DOM_VK_F20 131
DOM_VK_F21 132
DOM_VK_F22 133
DOM_VK_F23 134
DOM_VK_F24 135
DOM_VK_NUM_LOCK 144
DOM_VK_SCROLL_LOCK 145
DOM_VK_COMMA 188
DOM_VK_PERIOD 190
DOM_VK_SLASH 191
DOM_VK_BACK_QUOTE 192
DOM_VK_OPEN_BRACKET 219
DOM_VK_BACK_SLASH 220
DOM_VK_CLOSE_BRACKET 221
DOM_VK_QUOTE 222
DOM_VK_META 224

참고 사이트 : http://blog.naver.com/xtype/10014440515 ,

AND

t,.찾아본결과 자바스크립트 이벤트중 인수를 가진 메소드를 등록하는 방법은

고전적인 방법으로 태그에 삽입하는법과
동적으로 메소드로 치환하여 할당하는 법

두가지가 있다.  는 결론..

전자는 생략

후자

[element].addEventListener("click", function() { [methodName]([arg0],[arg1],...); }, false);     //NS

[element].attachEvent("onclick", function() { [methodName]([arg0],[arg1],...); });                  //IE

[element].onclick = [methodName];                                                                                   //All?

^^

AND

Q. Button의 onclick 이벤트 발생 시,

     onclick_button() 이라는 이벤트 핸들러가 수행되도록 설정하려면 어떻게 해야할까?

    : 객체의 이벤트리스너에 이벤트핸들러를 등록한다.

        * 이벤트 핸들러 == 이벤트 처리기, 이벤트 발생 시 수행되는 함수

        * 이벤트 리스너 == 이벤트 발생 인지기, 이벤트 발생을 인지하고, 수행할 함수들을 알고 있다.

 

1,2번은 간편하게 사용되는 등록방법이고,

3번에서 제시되는 등록방법과 삭제방법을 모두 사용하면 이벤트 처리과정을 상세하게 다룰 수 있다.

 

1. HTML 태그에서 등록

형    식

사  용  예

 event = "eventHandler()"  <input type="button" onclick="onclick_button()">

  * 이벤트핸들러에 ""()를 꼭 사용

 

2. javascript에서 등록

형    식

사  용  예

 object.event = eventHandler;

 var btn = document.getElementById("btn");

 btn.onclick = onclick_button;

    * 괄호를 쓰지 않기 때문에 괄호 안에 파라미터들을 넣을 수 없다.

 

3. 이벤트 리스너에 등록 / 삭제 (이벤트에 ""를 사용)

  3.1 등록

        case #1. -  InternetExplorer (이하 IE) 

형    식

사  용  예

 obj.attachEvent("event", eventHandler)

 var btn = document.getElementById("btn"); 

 btn.attachEvent("onclick", onclick_button);

 

 

 

       case #2. -  FireFox 및 기타 브라우저 (이하 FF)

형    식

사  용  예

 obj.addEventListener("event", eventHandler, bool)

 var btn = document.getElementById("btn"); 

 btn.addEventListener("click", onclick_button, false);

   

 

 

 

        * "event" 이름 앞의 on 빠지는 것에 주의 (IE: onclick <--> FF: click)

        * bool: capture 여부

           자세한 사항은 W3C의 HTML 이벤트처리 권고안 또는 이벤트 처리 상세내용(DOM 레벨1) 참고

 

       case #3. - 크로스 브라우저 (IE, FF 등 모든 브라우저에서 사용할 수 있도록)

형    식

사  용  예

 각 브라우저가 제공하는 이벤트리스너를 확인 

 if (obj.attachListener) {                    // IE

  obj.attachEvent("event", eventHandler);

 } else if (obj.addEventListener) {      // FF

  obj.addEventListener("event", eventHandler, bool);

 }

 var btn = document.getElementById("btn");  

 if (btn.attachListener) {                    // IE

  btn.attachEvent("onclick", onclick_button);

 } else if (btn.addEventListener) {      // FF

  btn.addEventListener("click", onclick_button, false);

 }

 

 

 

 

 

 

 

 

         *  IE 7.0 이상에서는 if (window.ActiveXObject)를 사용하여 IE 브라우저임을 확인 (XMLHttpRequest 참조)

 

  3.2 삭제 (3.1 case #3.에 대응) 

형    식

사  용  예

  각 브라우저가 제공하는 이벤트리스너를 확인

 

 if (obj.attachListener) {                    // IE

  obj.detachEvent("event", eventHandler);

 } else if (obj.addEventListener) {      // FF

  obj.removeEventListener("event", eventHandler, bool);

 }

 var btn = document.getElementById("btn"); 

 

 if (btn.attachListener) {                    // IE

  btn.detachEvent("onclick", onclick_button);

 } else if (btn.addEventListener) {      // FF

  btn.removeEventListener("click", onclick_button, false);

 }

 

 

 

 

 

 

 

 

 

        * detachEvent 및 removeEventListener의 사용 시 인수들의 순서는

           attachEvent 와 addEventListener와 동일하다. (3.1 참조)


<예제> 1. "크기 바꾸는 스타일 적용" 버튼을 누르면, 텍스트상자의 크기가 변하고, <-- changeHeight() 함수 호출

            2. "새 버튼 생성" 버튼을 누르면, 새 버튼이 생성되어 화면에 추가된다. <-- createButton() 함수 호출

            3. "메시지 창 띄우기" 버튼을 누르면, 메시지 창이 화면에 나타난다. <-- alertButton_click() 함수 호출

 

1. HTML 태그에 직접 / 2. javascript에서 직접 / 3. javascript에서 이벤트 리스너에

각각 이벤트 핸들러 함수를 등록하여, 이벤트가 발생했을 때 수행되도록 작성했다.   " " 및 ( ) 표시에 주의!


  
<html>
  <head>
    <title>이벤트 핸들러 테스트 페이지</title>
    <script language="javascript">
 
      function changeHeight()
      {
        var obj = document.getElementById("log");
        if(obj.style.height == "200px") {
          obj.style.height = "100px"; 
        } else {
          obj.style.height = "200px";
        }
        obj.value += "변경된 크기: " + obj.style.height + "\n";
      }
 
      function load()
      {
        var obj = document.getElementById("log");
        obj.value = "HTML 객체들의 개수: " + document.all.length + "\n"; 
        obj.value += "log의 객체 태그이름: " + document.all.log.nodeName + "\n";
        obj.value += "info의 HTML 문자열: " + document.all.info.innerHTML + "\n";
        
        // 2. javascript에서 직접등록 ojb.event = eventHandler;
        var btn = document.getElementById("createBtn");
        btn.onclick=createButton;                     
 
       // 3. javascript에서 이벤트 리스너에 등록
        var al = document.getElementById("alertBtn");
        if (al.attachListener) {                     // IE                  * IE 7.0 이상에서는 (window.ActiveXObject)를 사용
          al.attachEvent("onclick", alertButton_click);
        } else if (al.addEventListener) {      // FF
          al.addEventListener("click", alertButton_click, false);
        }
      } 
     
      function createButton()
      {
        var panel = document.getElementById("myDiv");
        var newObj = document.createElement("INPUT");      
        newObj.type = "button";                                   
        newObj.value = "New Button";
        panel.appendChild(newObj);                               
      }
     
      function alertButton_click()
      {
        alert("메시지 창 띄우기 버튼을 클릭했습니다.");
      }
 
    </script>
  </head>
 
 
  <body onload="load()">
    <h2 id="info">연습해보겠습니다.</h2>

    // 1. HTML 태그에서 직접등록
    <input id="heightBtn" type="button" value="크기 바꾸는 스타일 적용" onclick="changeHeight()"></input>
    // 2. javascript에서 직접등록
    <input id="createBtn" type="button" value="새 버튼 생성"></input>
    // 3. javascript에서 이벤트 리스너에 등록
    <input id="alertBtn" type="button" value="메시지 창 띄우기"></input>
    <br>
    <textarea id="log" style="width:100%; height:200px;"></textarea>
    <br>
    <div id="myDiv"></div>
  </body>
</html>
AND

* JavaScript에서의 this 지시자

 JavaScript에서 this는 다른 언어에서와 마찬가지로, 해당 함수가 속해있는 객체를 가리킨다. 전역 함수의 경우에 this는 window 객체를 가리킨다.

다음의 예제는 hello 함수를 하나 선언한 후에, 서로 다른 클래스에서 hello 함수를 메소드로 등록하여 사용하는 예제이다.

function hello() 
{
alert("Hi, I'm "+ this.name);
}
function ClassA()
{
this.name = "A";
}
function ClassB()
{
this.name = "B";
}
var a = new ClassA;
a.hello = hello;
a.hello();
var b = new ClassB;
b.hello = hello;
b.hello();

 

* JavaScript의 이벤트 핸들러 등록 방법

 JavaScript에서 이벤트 핸들러를 등록하는 방법에는 세 가지가 있다.

1) [Object].addEventListener("name_of_event", fnHandler, bCapture);
 DOM에서 사용하는 방법이다. (IE에서는 지원하지 않는다.) 여러 개의 이벤트 핸들러를 등록할 수 있다.

2) [Object].attachEvent("name_of_event_handler", fnHandler);
 IE 에서 사용하는 방법이다. MSIE에서는 이벤트가 발생했을 때, capturing phase가 없기 때문에 이 함수에는 세번째 인자가 없다. addEventListener 함수를 사용할 때, bCapture=false로 한 것과 같다. 역시 여러 개의 이벤트 핸들러를 등록할 수 있다.

3) [Object].name_of_event_handler = fnHandler;
 JavaScript에서 이벤트 핸들러를 등록하는 전통적인 방법인 대입법이다. 호환성이 좋으나 이벤트 핸들러를 하나밖에 등록할 수 없다.

 그래서, 여러 브라우저에서 동작하도록 이벤트 핸들러 등록 함수를 만들때 다음과 같이 한다. Professional JavaScript for Web Developers(Wrox) p.292에 나온 예제이다.

EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) 
{
if (oTarget.addEventListener)
{ //for DOM-compliant browsers
oTarget.addEventListener(sEventType, fnHandler, false);
}
else if (oTarget.attachEvent)
{ //for IE
oTarget.attachEvent("on" + sEventType, fnHandler);
}
else
{ //for all others
oTarget["on" + sEventType] = fnHandler;
}
};

 정말 이렇게 사용해도 될까?

 대부분의 경우에는 문제 없이 동작할 것이다. 하지만, fnHandler 안에서 this를 사용한다면 문제가 될 수 있다. attachEvent 함수를 통해서 등록된 이벤트 핸들러와 대입법으로 등록된 이벤트 핸들러에 대한 IE의 내부적인 동작 방식이 다르기 때문이다.

 다음의 예제를 보자.

function onClickEventHandler(event) 
{
if (this == window)
{
alert("This is the window object");
}
else
{
alert(this.tagName);
}
}
myObject.onclick = onClickEventHandler;
myObject.attachEvent("onclick", onClickEventHandler);

 위와 같이 이벤트 핸들러를 작성하여 테스트를 해 보면 차이점을 좀더 확실히 알 수 있다. 같은 객체에 대해 이벤트 핸들러를 두 개 등록했으며, myObject 객체를 클릭하면 alert 창이 두 번 나타날 것을 예상할 수 있다. 하지만 그 메시지의 내용은 다를 것이다.

 대입법으로 이벤트 핸들러를 등록하면, 그 이벤트 핸들러 함수는 해당 객체의 메소드처럼 동작한다. 반면에 attachEvent 함수를 사용하여 등록하면, 이벤트가 발생했을 때 호출될 뿐이지 해당 객체의 메소드가 되는 것은 아니다. 또한, 호출되는 순서도 정해져 있다. 대입법으로 등록된 이벤트 핸들러가 먼저 호출된 후에, attachEvent 함수로 등록된 이벤트 핸들러가 호출된다. attachEvent함수로 등록된 이벤트 핸들러들끼리는 호출 순서의 규칙이 없고 랜덤하게 호출된다. (addEventListener 함수로 등록된 이벤트 핸들러는 등록된 순서대로 호출된다.) 그러므로 위 예제에서 이벤트 핸들러의 등록 순서를 다음과 같이 바꿔도 실제 호출되는 순서는 변함이 없다.

myObject.attachEvent("onclick", onClickEventHandler);
myObject.onclick = onClickEventHandler;

 Professional JavaScript for Web Developers(Wrox Press, 2005)에서는 등록할 수 있는 핸들러의 개수만 빼고 모두 같은 거라고 되어있고 이러한 차이점에 대한 언급이 없다. MSDN에는 이런 차이점이 잘 설명되어 있으므로, Microsoft 관련한 의문사항은 MSDN을 살펴보는 습관을 기르자. ㅡㅂㅡ;

===================================================================================================================

출처 : http://mashedon.egloos.com/1484422

AND