0

我想使用以下代码将输入(字母数字)限制为文本字段:

$('input').bind('keypress', function (event) {
    var regex = new RegExp("^[a-zA-Z0-9]+$");
    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
    if (!regex.test(key)) {
       event.preventDefault();
       return false;
    }
});

上面的代码在标准输入字段上效果很好,但是当我输入由 Chosen 生成的字段时,该功能不适用。选择的插件确实会生成一个包含<input type="text">$('input')似乎没有触及它的 div。我猜这是由于应用上述代码的时间..

4

2 回答 2

2

而不是.bind(),考虑使用.on()which 将适用于动态创建的元素。

于 2012-05-29T06:54:39.733 回答
1

杰克的回答有效。但要理解的重要一点是按键事件会冒泡,因此您可以在节点层次结构的任何位置,在非动态生成的节点处捕获它。

http://jsfiddle.net/KWv7Z/6/

$(document).bind('keypress', function (event) {
    // Will fire for all elements, we only care for inputs
    // Also allow navigation keypresses
    if (event.target.tagName.toUpperCase() != "INPUT" ||
            $.inArray(event.which, [8,9,13,16,17,18,19,20,27,33,34,35,36,37,38,39,40,45,46]) ) {
      return;
    }
    var regex = new RegExp("^[a-zA-Z0-9]+$");
    // jQuery already normalizes event.which
    var key = String.fromCharCode(event.which);
    if (!regex.test(key)) {
       event.preventDefault();
       return false;
    }
});

This is also more memory friendly since it doesn't install a separate handler per input on the page.

于 2012-05-29T07:01:15.387 回答