是否可以更改按键输入的字符,而无需手动操作?
例如,如果我想强制使用大写字母基于某种条件,最好执行以下操作:
function onKeypressHandler(e)
{
if ( condition )
{
e.which -= 32;
}
}
但这当然行不通。
NOTE:这是not全面大写,但是only特定字符。
也许我想说if ( e.which >= 97 && e.which <= 102 )
or if ( Wind.Direction == 'South' )
或其他什么 - 条件本身并不重要,但是大写必须仅适用于当前字符不是整个输入。
我可以通过手动附加更改后的字符来完成此操作,但这是一种丑陋且混乱的方法,而且可能比实际速度慢。
function onKeypressHandler(e)
{
if ( condition )
{
$j(this).val( $j(this).val() + String.fromCharCode( e.which - 32 ) );
return false;
}
}
此方法的一个特定缺陷 - 如果选择所有输入文本并输入密钥,如果它落入其中,则它不会删除现有内容,而只是附加到用户想要删除的内容。 (需要调查检测任何选定的文本来解决这个问题,这使得这个问题变得更加丑陋。)
谁能提供更好的解决方案?
下面将完成这项工作。它基于我写给另一个问题的答案 https://stackoverflow.com/questions/3579219/show-different-keyboard-character-from-the-typed-one-in-google-chrome/3580352#3580352。定制transformTypedChar
功能满足您的需求;我的示例仅将字母 a-g 大写。
如果您需要在文本区域而不是<input type="text">
然后请注意,IE 是否有 Internet Explorer 认可的 SelectionStart 和 SelectionEnd 替代品?
function transformTypedChar(charStr) {
return /[a-g]/.test(charStr) ? charStr.toUpperCase() : charStr;
}
document.getElementById("your_input_id").onkeypress = function(evt) {
var val = this.value;
evt = evt || window.event;
// Ensure we only handle printable keys, excluding enter and space
var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode;
if (charCode && charCode > 32) {
var keyChar = String.fromCharCode(charCode);
// Transform typed character
var mappedChar = transformTypedChar(keyChar);
var start, end;
if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
// Non-IE browsers and IE 9
start = this.selectionStart;
end = this.selectionEnd;
this.value = val.slice(0, start) + mappedChar + val.slice(end);
// Move the caret
this.selectionStart = this.selectionEnd = start + 1;
} else if (document.selection && document.selection.createRange) {
// For IE up to version 8
var selectionRange = document.selection.createRange();
var textInputRange = this.createTextRange();
var precedingRange = this.createTextRange();
var bookmark = selectionRange.getBookmark();
textInputRange.moveToBookmark(bookmark);
precedingRange.setEndPoint("EndToStart", textInputRange);
start = precedingRange.text.length;
end = start + selectionRange.text.length;
this.value = val.slice(0, start) + mappedChar + val.slice(end);
start++;
// Move the caret
textInputRange = this.createTextRange();
textInputRange.collapse(true);
textInputRange.move("character", start - (this.value.slice(0, start).split("\r\n").length - 1));
textInputRange.select();
}
return false;
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)