如何使用javascript事件避免文本字段中的无效输入?

时间:2012-06-21 12:52:40

标签: javascript jquery events

我无法正确处理输入类型=“文字”中的某些事件。 我只需要一个过滤器来接受[^ 0-9]字符。

我需要以下帮助:

  • 不接受来自 Control + Paste 命令的任何内容。可以从Control + V(键盘)或右键单击鼠标+粘贴选项。

到目前为止我尝试了什么:

  • 按键事件我很好地处理来自键盘的任何输入。 (任何不在[^ 0-9]中的字符和输入,退格键,主页,结尾等都将被忽略)。

  • keyup我处理怪异的Control + Paste(键盘)事件。 我粘贴一些字符串,在粘贴字符串后,我裁剪任何非白名单字符。 PS: 但是这不适用于右键单击+粘贴(鼠标),

  • onChange垃圾字符串保持可见,直到用户模糊字段。

我想要的是什么:

  • 复制示例字符串“123.321.456-78”并粘贴“12332145678”或“abc!2¨#7”并粘贴“27”。

  • 不要以任何可能的方式接受任何非白名单字符。 (即使是$('#field')。val(“垃圾输入123”)。

从上面的所有问题中,我可以很好地或奇怪地(也就是:keuup)处理输入,但是右键单击+粘贴(鼠标)永远不会触发任何事件,这样我就可以进行正确的处理。

我考虑过进行间隔检查,但这太难看了。

编辑:

以下代码

function soNumeroInteiro_keypressHandler(event)
{
    var code = event.keyCode || event.which;

    switch(code)
    {
        case  8: // backspace
        case 37: // left
        case 39: // right
        case  9: // tab
        case 46: // delete
        case 35: // end
        case 36: // home
            return true;
        break; 

        case  86: // control + A
        case  97: // control + V
        case 120: // control + X
            if (event.ctrlKey) {
                return true;                
            }
        break;
    }

    var tecla = String.fromCharCode(code);

    return tecla.match(/^\d$/) != null;
}

function soNumeroInteiro_keyupHandler(event)
{
    event.currentTarget.value = event.currentTarget.value.replace(/[^0-9]/g, '');
}

1 个答案:

答案 0 :(得分:1)

请参阅此问题,了解鼠标点击事件:How to distinguish between left and right mouse click with jQuery

现在您有鼠标点击事件,即使是右键单击,您也可以在短时间内(2秒?)轮询内容以检测更改并处理内容验证。这样,您可以根据业务逻辑需要选择接受有效或拒绝内容。

编辑: 只是为了添加注释,onpaste事件将无法正常工作,因为它将在粘贴内容之前触发(至少在某些测试用例中)。

示例:

$('#pasteyMe').on('paste', function() {
    $(this).val();// gets the content prior to the paste event
});

要解决此问题,您可以设置另一个事件观察程序,例如更改,然后触发:

$('#pasteyMe').on('click focus blur paste', function() {
    var me = this;
    window.setTimeout(function() {
       $(me).trigger('change');
    }, 1);
});

$('#pasteyMe').change(function() {
    $('#resulty').text($(this).val());
});

在此处查看此操作:http://jsfiddle.net/MarkSchultheiss/kQxAj/