代码之家  ›  专栏  ›  技术社区  ›  Peter Boughton

我可以有条件地更改输入到按键上的字符吗?

  •  18
  • Peter Boughton  · 技术社区  · 14 年前

    是否可以在不手动的情况下更改按键输入的字符?

    例如,如果我想强制大写字母 基于某种条件 ,最好做以下工作:

    function onKeypressHandler(e)
    {
        if ( condition )
        {
            e.which -= 32;
        }
    }
    

    但当然不行。

    注: 这是 一个跨板上套管,但 只有 特定字符。

    也许我想说 if ( e.which >= 97 && e.which <= 102 ) if ( Wind.Direction == 'South' ) 或者别的什么——条件本身并不重要,但是 大写字母只能应用于当前字符 不是全部输入。


    我可以通过手动附加更改的字符来完成,但这是一种丑陋和混乱的方式,而且可能比实际速度慢。

    function onKeypressHandler(e)
    {
        if ( condition )
        {
            $j(this).val( $j(this).val() + String.fromCharCode( e.which - 32 ) );
            return false;
        }
    }
    

    此方法的一个特定缺陷-如果选择所有输入文本并输入一个键,如果它落入其中,那么它不会删除现有内容,而是简单地附加到用户想要删除的内容上。(需要调查检测任何选定的文本来解决这个问题,这使得这个更丑。)

    有人能提供更好的解决方案吗?

    6 回复  |  直到 14 年前
        1
  •  18
  •   Community CDub    8 年前

    以下内容将完成此项工作。它是基于 an answer I wrote to another question . 自定义 transformTypedChar 函数以满足您的需要;我的示例只将字母a-g大写。

    如果您需要在文本区域而不是 <input type="text"> 然后请注意,IE<=8中存在换行符问题,为了简洁起见,以下代码无法处理这些问题。您可以在下面的文本区域中找到用于获取所选内容的跨浏览器功能: Is there an Internet Explorer approved substitute for selectionStart and 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;
        }
    };
    
        2
  •  1
  •   VinayC    14 年前

    如何防止默认操作,然后触发按键?有点像

    function onKeypressHandler(e)
    {
        if ( condition )
        {
            e.preventDefault();
            // create new event object (you may clone current e)
            var ne = new jQuery.Event("keypress");
            ne.which = e.which - 32;
            $(e.target).trigger(ne);   // you may have to invoke with setTimeout
        }
    }
    
        3
  •  1
  •   Ravindra Sane    14 年前

    你得看看这个……工作之后我对自己很满意。

    很明显,您希望包含足够的条件,以避免进入循环。

    当条件的计算结果为true时,下面的代码将返回false,但它使用不会返回false的不同charcode触发同一事件。

    document.getElementById("input1").onkeypress = Handler;
    function Handler(e)
    {
        e = e || window.event;
        if ( e.charCode == 97 )
        {
            var evt = document.createEvent("KeyboardEvent");
            evt.initKeyEvent("keypress",true, true, window, false, false,false, false, 0, e.charCode -32);
            this.dispatchEvent(evt);
            return false;
        }
        return true;
    }
    

    你可以在IE中使用FireEvent… 我用过 http://help.dottoro.com/ljrinokx.php https://developer.mozilla.org/en/DOM/event.initKeyEvent 供参考

        4
  •  0
  •   Thomas Clayson    14 年前

    不太确定你想要什么,但这行吗?

    $('#my_element').keyup(function(){ $(this).val().toUpperCase(); });
    

    或者使用子字符串获取最后一个字符并执行 toUpperCase() 在那上面?

    (PSST…您也可以使用按键或按键)。

        5
  •  -1
  •   Paul Whelan    14 年前

    你能用CSS吗?

    <input type="text" style="text-transform: uppercase;" />
    
        6
  •  -1
  •   jim tollan    14 年前

    彼得,

    你可以在这里找到一些灵感:

    http://www.maconstateit.net/tutorials/JSDHTML/JSDHTML15/jsdhtml15-05.htm

    基本上是通过各种方式来查看“区域”周围的按键事件和功能。