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

イベントを関数と「return」部分に渡す方法が見つかりません。申し訳ありませんが、それを説明する方法すらわかりません。おそらくそれが、この問題に関する情報を見つけることができない理由です...

4

2 に答える 2

1

addEventListener()またはで一般的なイベント ハンドラーを使用する場合、イベント ハンドラーを HTML に配置した場合のように、デフォルト アクションを防止するattacheEvent()ことはできません。代わりに、おそらくほとんどのブラウザで and を呼び出すか、古いバージョンの IE でsetをreturn false呼び出す必要があります。evt.preventDefault()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 に答える