0

目前我正在尝试在 javascript 方法的文本框中强制大写。此方法设置为在“按键”事件上调用以进入文本框。

这是我通过 IE 和 FF 检测更改为大写的方法。

          //some code to detect the kind of key pressed based on numeric value, 
          //if lowercase detected then continue

        var key; 
        if(window.event){ //working IE code                     
                //key = window.event.keyCode;
                window.event.keyCode-=32;
        }

        else if(e){ //broken FF code
                key = String.fromCharCode(keycode).toUpperCase()
                e.value = e.value.toUpperCase();
        }

此当前代码表示 e.value 在 firebug 中未定义。如果我只尝试 e.toUpperCase() 萤火虫说 toUpperCase 不存在。我尝试将 e.value 设置为 'key',它不会返回错误但不会更改为大写。我曾尝试直接更改 e.which 但当然,它是只读的,并返回这样的错误。

我到底在这里想念什么?我相信无论我在这里更改什么,e.which 仍然设置为小写值,并且因为我无法以任何方式对其进行编辑,所以问题在于原始的小写 e.which 字符被推送到文本框。

4

2 回答 2

1

KeyEvent没有value属性。您可能希望使用此代码段来检测按键,并且您可能还想阅读有关Detecting keystrokes的信息。

另请注意,事件属性(通常)是只读的。您需要防止当前事件使用不同的键触发额外的事件。

要将元素中键入的所有内容都大写<input>,您无需更改关键事件。只需在字符出现后更改输入本身的值即可。您将需要为此监听事件keyup而不是keypress事件(阅读原因):

inputEl.onkeyup = function(e) {
    this.value = this.value.toUpperCase();
};

在 jsfiddle.net 上的演示)。它很简单并且适用于所有浏览器,唯一的缺点是当您通过按住键插入多个字符时它不会立即大写(解决方法)。

于 2012-08-02T19:06:09.480 回答
1

我想我会以另一种方式做到这一点:

function keypressHandler() {
  this.value = this.value.toUpperCase();
}

document.getElementById('whatever').onkeypress = keypressHandler;
// or use addEventListener or whatever

编辑实际上它与以下黑客一起工作得更好:

function keypressHandler(event) {
    var inp = this;
    setTimeout(function() {
        inp.value = inp.value.toUpperCase();
    }, 0);
}

这让导致事件的键在值“固定”之前被添加到值中。

关键是处理键盘事件非常混乱,而且浏览器之间的事情也有所不同。上面的方法通过简单地直接处理由浏览器维护的值来完全避免这种情况。

编辑— 请注意,要使此处的代码正常工作,必须按照此代码的操作方式设置事件处理程序。如果你在 HTML 标记的“onkeypress”属性中设置它,它必须是不同的:

<input onkeypress='keypressHandler.call(this)'>
于 2012-08-02T19:02:00.500 回答