首頁>Program>source

我有一个帶有文字區域的網頁,我需要捕获使用者键入的键(以便可以用不同的unicode字元代替键入的键).我当前的代碼如下:

$("#myTextArea").bind('keypress', function(event) {
    var keyInput = event.which;
   // call other functions
});

以上代碼可在PC和iPhone / Safari上使用.但是,它 fails when using Chrome on an android (三星)平板電脑.由於某些原因,当我在 android virtual (soft) keyboard, the "keypress" event is not triggered上键入時 . android版本是5.0.2。

如果我尝試使用 "keyUp" or "keyDown", it always returns 229 for all characters (返迴键,空格,退格键等除外).

即使keyCode始终為229,文字區域也会顯示使用者键入的正確字元.這意味着設備知道輸入了哪个键,但是不知何故我無法使用javascript處理此事件(以及键代碼)。

以下是我到目前為止尝試過的替代方法及其結果:

$("#mainTextArea").on("keydown keyup", function(event) { 
    // event.which and event.keyCode both return 229
$(document).on('keypress', function(event) { 
    // function is not triggered
$('#myTextArea').bind('input keypress', function(event) { 
   // comes inside function, but keyCode and which are undefined

感谢您提供有關此問题的任何帮助。

最新回復
  • 5月前
    1 #

    不幸的是,您似乎不能在這裏做很多事情。 不推荐使用按键事件,因此不会觸發。 向上和向下键上的229表示鍵盤緩衝區正忙.原因-当您按下一个键時-由於自動建議和其他可能立即發生的事件以及使该事件無效的原因,仍不能保證该輸入是使用者所按下的。 尽管我认為最好先發送密钥,然後再在自動提示上觸發另一个事件,以便您可以單独對其进行操作...

    我目前唯一了解的是同時附加-keydown和keyup,儲存keydown的值,获取keyup的值並找到增量,這就是使用者按下的值.不幸的是,這不適用於非輸入控制元件(例如-主體或類似的控制元件)。 也许不是您想听到的答案,但是還是。

  • 5月前
    2 #

    我遇到了同樣的問题.虽然有几種解釋,但是無論如何都没有提供解決方案似乎很奇怪。 目前,我通過捕获oninput事件解決了它。

    "此事件類似於onchange事件。不同之處在於oninput事件在元素的值更改後立即發生,而onchange事件在元素失去焦點之後在內容更改後發生". >

    此事件也支援插入文字,粘贴文字或更正与建議。

    它不能為我提供完美的解決方案,因為我只能在輸入文字之後對其进行操作,但目前為止這是我所拥有的最好的文字。

    如果有人有更好的解決方案,我將很高兴听到它。

  • 5月前
    3 #

    在為我正在从事的專案进行研究時,我遇到了這个讨論.我必须為行動應用程式建立輸入掩碼,而Pavel Donchev的答案让我思考了如何在Android中捕获键.在我的特定專案中,keydown和keyup是不够的,因為keyup事件仅在釋放密钥後才觸發,因此這意味着驗證晚了,因此我對輸入事件进行了更多研究(以及大量的試驗和錯誤) 並使其工作.

    var input = document.getElementById('credit-card-mask'),
        oldValue,
        newValue,
        difference = function(value1, value2) {
          var output = [];
          for(i = 0; i < value2.length; i++) {
            if(value1[i] !== value2[i]) {
              output.push(value2[i]);
            }
          }
          return output.join("");
        },
        keyDownHandler = function(e) {
          oldValue = input.value;
          document.getElementById("onkeydown-result").innerHTML = input.value;
        },
        inputHandler = function(e) {
          newValue = input.value;
          document.getElementById("oninput-result").innerHTML = input.value;
          document.getElementById("typedvalue-result").innerHTML = difference(oldValue, newValue);
        }
    ;
    input.addEventListener('keydown', keyDownHandler);
    input.addEventListener('input', inputHandler);
    
    <input type="text" id="credit-card-mask" />
    <div id="result">
      <h4>on keydown value</h4>
      <div id="onkeydown-result"></div>
      <h4>on input value</h4>
      <div id="oninput-result"></div>
      <h4>typed value</h4>
      <div id="typedvalue-result"></div>
    </div>
    

    在keydown事件之後立即觸發oninput事件,這是进行驗證的最佳時機。

    我在一篇文章中整理了整个內容.如果您好奇,可以在這裏阅讀。

  • 5月前
    4 #

    只需檢查輸入字元keyCode,如果它是0或229,那麼這裏是 getKeyCode()函式 使用 charCodeAt JS返迴键代碼,该键代碼將輸入字元串作為引數並返迴最後一个字元的键代碼。

    <script>
            var getKeyCode = function (str) {
                return str.charCodeAt(str.length);
            }
    
            $('#myTextfield').on('keyup',function(e){
                //for android chrome keycode fix
                if (navigator.userAgent.match(/Android/i)) {
                    var inputValue = this.value;
                    var charKeyCode = e.keyCode || e.which;
                    if (charKeyCode == 0 || charKeyCode == 229) { 
                        charKeyCode = getKeyCode(inputValue);
                        alert(charKeyCode+' key Pressed');
                    }else{
                       alert(charKeyCode+' key Pressed');
                        }
                }       
            });
        </script>
    

  • 5月前
    5 #

    有一个 textInput 给您輸入字元的事件

    const inputField = document.getElementById('wanted-input-field');
    inputField.addEventListener('textInput', function(e) {
        // e.data will be the 1:1 input you done
        const char = e.data; // In our example = "a"
        // If you want the keyCode..
        const keyCode = char.charCodeAt(0); // a = 97
        // Stop processing if "a" is pressed
        if (keyCode === 97) {
            e.preventDefault();
            return false;
        }
        return true;
    });
    

  • javascript:在jQuery的Deferred物件中引發錯誤
  • 在C ++中將字元串轉換為日期