键盘事件测试

测试键盘事件在不同浏览器下的表现

HTML

<h1>键盘事件测试</h1>

<div class="content">
    <p>文本:</p>
    <p><textarea id="inputArea"></textarea></p>
</div>
<div class="log" id="log"></div>

<pre>
- 中文firefox响应是不同的
- jQuery为ie下添加了which
- 非ie只有firefox在press时没有keyCode
- 一般地,keyCode和which都一样

- 标准顺序:keydonw/keypress/input/keyup
      删除和退格:keydown/input/keyup
- IE6-8 keydown/keypress/propertychange/keyup
        退格和删除只是不触发keypress
- IE9 触发的顺序是:keydown/keypress/input/propertychange/keyup
      退格和删除键不再触发keypress/propertychange
      但在纯ie9环境(不是用ie10模拟)时,退格和删除都只触发keydown/keyup
- IE10触发顺序:keydown/keypress/propertychange/input/keyup
      退格和删除时,只是不再触发keypress
</pre>

<h2>字数限制</h2>

<input type="text" id="limitInput" placeholder="只能输入5个字"/>

CSS

.content{margin-right:30%;}
.log{border:1px solid #ededed;background:#eee;padding:10px 0;}
table{border:1px solid #fff;}
td,th{width:20%;border:1px solid #fff;}

JavaScript

var area = $('#inputArea'),

    log = (function() {
        var table = $('<table/>');
        table.append('<tr><th>type</th><th>keyCode</th><th>which</th><th>charCode</th><th>字符</th><th>功能键</th></tr>');
        table.appendTo('#log');

        return function() {
            var tr = $('<tr/>'),
                i = 0,
                len = arguments.length;

            for (; i < len; i++) {
                tr.append('<td>' + arguments[i] + '</td>');
            }

            tr.appendTo(table);
        }
    })(),
    handler = function(e) {
        e = e || window.event;
        var k = [e.ctrlKey ? 'ctrl' : ''];
        k.push(e.shiftKey ? 'shift' : '');
        k.push(e.altKey ? 'alt' : '');
        k.push(e.metaKey ? 'meta' : '');
        log(e.type, e.keyCode, e.which, e.charCode, String.fromCharCode(e.charCode), k.join(','));
    };

/*
$.each('keydown,keyup,keypress'.split(','), function(i, type) {
    area.bind(type, handler);
});
*/
           area = area.get(0);
           area.onkeydown = area.onkeyup = area.onkeypress = area.oninput = area.onpropertychange = area.onchange = handler;

// 字数限制
$('#limitInput').bind('input', function (evt) {
    var o = $(this), v = o.val();
    console.log(v);
    if (v.length > 5) {
        o.val(v.slice(0, 5));
        evt.preventDefault();
    }
});

/**
 * 控制输入框内到了指定字数不能再输入
 *
    // 输入键盘事件
    Window.prototype._eTextareaKeydown = function (evt) {
        var val, diff,
            // 全部键盘上的可输入键
            isVisibleKey = function (k) {
                return !(evt.altKey || evt.ctrlKey || evt.metaKey) && (
                       k === 32 ||              // 空格
                       (k >= 48 && k <= 57) ||  // 数字
                       (k >= 65 && k <= 90) ||  // 字母
                       (k >= 96 && k <= 105) || // 小键盘数字
                       (k === 106 || (k >= 186 && k <= 192) || k === 222)
                       ); // 其他符号键
            };

        switch (evt.which) {
        // 1....