javascript toUpperCase无法在firefox中运行

时间:2012-08-02 18:55:14

标签: javascript asp.net firefox

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

这是我通过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()firebug说toUpperCase不存在。我已经尝试将e.value设置为等于'key',它不会返回错误但不会更改为大写。我试过直接改变e.which,但当然,这是只读的,并返回一个错误说明。

我到底错过了什么?我相信这个问题无论我在这里改变什么,例如STILL设置为小写值,并且因为我无法以任何方式编辑它,原始的小写字母e.which字符被推送到文本框。

2 个答案:

答案 0 :(得分: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)'>

答案 1 :(得分:1)

KeyEvents没有value属性。您可能希望使用this snippet来检测密钥,也可能需要阅读Detecting keystrokes

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

要大写<input>元素中输入的所有内容,您不需要更改键事件。只需在出现字符后更改输入本身的值即可。您需要收听keyup而不是keypress事件(read why):

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

Demo at jsfiddle.net)。它很简单,适用于所有浏览器,唯一的缺点是,当你通过按住一个键(workaround)插入多个字符时,它不会大写大写。