2

我无法正确处理input type="text"中的某些事件。我只需要一个过滤器来只接受 [^0-9] 字符。

我需要以下帮助:

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

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

  • 按键事件我可以很好地处理来自键盘的任何输入。(任何不在 [^0-9] 中的字符和 enter、backspace、home、end 等都将被忽略)。

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

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

我想要的是:

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

  • 不要以任何可能的方式接受任何非白名单字符。(即使使用 $('#field').val("trash input 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, '');
}
4

1 回答 1

1

鼠标点击事件请看这个问题: How to区分左右鼠标点击与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/

于 2012-06-21T13:03:09.410 回答