2012-09-06 2 views
1

조금 넓은 사람이 궁금한 점이 있으면 죄송합니다.하지만 모든 것을 시도해 보니 대체 할 수있는 항목이 없습니다. 이건 내 것이 아니야. 단지)를 사용하여이와addEventListener로 복제하고 싶습니다.

function onlyNum(evt){ 

     evt = window.event; 
     var charCode = (evt.which) ? evt.which : evt.keyCode 
     if (charCode > 31 && (charCode < 48 || charCode > 57)){ 
      return false; 
     } 

     return true; 
    } 

// this INPUT will not accept anything but numbers now. 
<input type="text" id="idInput" onKeyPress="return onlyNum(event)"> 

: 나는 기능과 "반환"부분에 이벤트를 전달할 수있는 방법을 찾을 수 없습니다

function onlyNum(evt){ 

    evt = window.event; 
    var charCode = (evt.which) ? evt.which : evt.keyCode 
    if (charCode > 31 && (charCode < 48 || charCode > 57)){ 
     return false; 
    } 

    return true; 
} 

// this INPUT's with this event listeners will just acept numbers now. 
// like this code is cleaner since you just need to make a list of ids that will have this listeners. 
var input = document.getElementById('idTest'); 
input.addEventListener('keyDown', onlyNum, false); 

. 미안 그걸 설명하는 방법조차 모릅니다. 아마도이 문제에 대한 정보를 찾을 수없는 이유가 ...

+0

당신은 실제로'.preventDefault()'를 사용해야합니다 ... 그것은 핸들러의 타겟에 어쨌든 적용될 것입니다 – jeremy

답변

1

addEventListener() 또는 attacheEvent()의 일반 이벤트 처리기를 사용하는 경우 기본값 인 return false을 사용할 수 없습니다 이벤트 처리기를 HTML에 넣으면 가능한 것처럼 동작합니다. 대신 대부분의 브라우저에서 evt.preventDefault() 및 아마도 evt.stopPropagation()으로 전화하거나 이전 버전의 IE에서는 window.event.returnValue = falsewindow.event.cancelBubble = true으로 설정해야합니다.

크로스 플랫폼을 간단히 수행하려면 모든 교차 플랫폼이 작동하는 addEvent() 함수 (IE6, IE7, IE8 포함)를 개발했습니다. 따라서, 이벤트 처리기를 추가하는 것을 사용하여, 당신이 할 수있는 모든이있다 :

addEvent("idTest", "keydown", onlyNum);​ 

근무 데모 : http://jsfiddle.net/jfriend00/2ATmz/.

// refined add event cross browser 
function addEvent(elem, event, fn) { 
    if (typeof elem === "string") { 
     elem = document.getElementById(elem); 
    } 


    // avoid memory overhead of new anonymous functions for every event handler that's installed 
    // by using local functions 
    function listenHandler(e) { 
     var ret = fn.apply(this, arguments); 
     if (ret === false) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     } 
     return(ret); 
    } 

    function attachHandler() { 
     // set the this pointer same as addEventListener when fn is called 
     // and make sure the event is passed to the fn also so that works the same too 
     var ret = fn.call(elem, window.event); 
     if (ret === false) { 
      window.event.returnValue = false; 
      window.event.cancelBubble = true; 
     } 
     return(ret); 
    } 

    if (elem.addEventListener) { 
     elem.addEventListener(event, listenHandler, false); 
    } else { 
     elem.attachEvent("on" + event, attachHandler); 
    } 
} 

참고 : 여기에 크로스 플랫폼 이벤트 기능이있어,

function onlyNum(evt){ 
    var charCode = (evt.which) ? evt.which : evt.keyCode 
    if (charCode > 31 && (charCode < 48 || charCode > 57)){ 
     return false; 
    } 
    return true; 
} 

addEvent("test", "keydown", onlyNum);​ 

그리고 :

여기에 새 이벤트 기능을 사용하여 코드의이 이벤트 핸들러 함수는 항상을 통과하기 때문에 약간 onlyNum() 수정 이벤트 개체 (IE에서는 다르게 처리 할 필요가 없습니다).

+0

고마워요! 내가 addEvent ("test", "keydown", onlyNum)를 넣을 때만 효과적이지만 하단에 "null의 addEventListener '속성을 읽을 수 없다"라는 오류가 발생합니다. javascript를 넣는 것이 정상입니다. 페이지의 끝 또는 그 머리에서 더 나은? –

+0

페이지 DOM이로드 될 때까지는'addEvent()'를 호출 할 수 없습니다. 이를 수행하는 가장 간단한 방법은 '' 태그의 맨 끝에서 스크립트에 코드를 삽입하는 것입니다. DOM 준비 이벤트를 기다리는 것을 포함하는 다른 방법이 있지만 교차 브라우저 방식으로 프레임 워크를 사용하는 프레임 워크를 사용하지 않는 경우 간단한 방법을 선택하고 코드를 ''태그. 예, 정상이며 실제로 페이지가로드되고 더 빠르게 표시됩니다. – jfriend00

+0

스크립트를 설명하기 위해 시간과 인내심을 실제로하십시오. 감사합니다. –

0

window.onload=function(){ 
    var input = document.getElementById('idTest'); 
    if(input.addEventListener) input.addEventListener('keydown', onlyNum, false); 
    else input.attachEvent('onkeydown', onlyNum, false); 
} 

function onlyNum(e) 
{ 
    var e=e || window.event; 
    var charCode = (e.which) ? e.which : e.keyCode; 
    if (charCode > 31 && (charCode < 48 || charCode > 57)){ 
     if(e.preventDefault) e.preventDefault(); 
     else e.returnValue = false;  
    } 
} 

DEMO을 시도 할 수 있습니다.

+0

일해 주셔서 감사합니다! –

관련 문제