1

如果问题可能有点宽泛,我很抱歉,但我已经尝试了所有方法,但我无法找到替代它的东西(这不是我的,我只是在使用它):

    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);

我找不到将事件传递给函数和“返回”部分的方法。抱歉,我什至不知道如何描述它,也许这就是为什么我找不到有关此问题的任何信息的原因...

4

2 回答 2

1

addEventListener()当使用带有or的通用事件处理程序时attacheEvent(),您不能return false像将事件处理程序放在 HTML 中那样仅仅阻止默认操作。相反,您可能需要在大多数浏览器中调用evt.preventDefault(),或者在旧版本的 IE 中调用。evt.stopPropagation()window.event.returnValue = falsewindow.event.cancelBubble = true

为了简单和跨平台地做到这一点,我开发了一个addEvent()功能,可以为您完成所有跨平台工作(包括 IE6、IE7、IE8)。因此,使用它来添加事件处理程序,您要做的就是:

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

工作演示:http: //jsfiddle.net/jfriend00/2ATmz/

这是使用新事件函数的代码:

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);​

而且,这是跨平台事件函数:

// 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);
    }
}

注意:我稍作修改onlyNum(),因为这个事件处理函数总是传递事件对象(你不必为 IE 以不同的方式处理事情)。

于 2012-09-06T21:59:06.040 回答
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;    
    }
}

演示

于 2012-09-06T22:30:14.953 回答