2012-01-20 73 views
23

我想在分派的事件對象上設置keyCode。Chrome中的KeyboardEvent,keyCode爲0

單擊按鈕時,在文本框控件上引發事件以模擬keydown事件。事件成功提升,但keyCode爲0.我需要將具有正確keyCode的事件對象發送到文本框。 我一直在使用here的代碼。

如何在派發事件中設置keyCode值?

<html> 
    <head>  
    </head> 
    <body> 
     <input type="button" id="btn" value="Click"></input> 
     <input type="text" id="txt"></input> 
     <script> 
      document.getElementById('btn').addEventListener("click", btnClick); 
      document.getElementById('txt').addEventListener("keydown", txtKeydown);   

      function btnClick(e) { 
       var txt = document.getElementById('txt');    

       var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) { 
        var e = document.createEvent("KeyboardEvents"); 
        e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1)); 
        e.keyCode = 83; 
        e.charCode = 0; 
        target.dispatchEvent(e); 
       }; 

       var canceled = !dispatchKeyboardEvent(txt, 
       'keydown', true, true, // type, bubbles, cancelable 
       window, // window 
       's', // key 
       0, // location: 0=standard, 1=left, 2=right, 3=numpad, 4=mobile, 5=joystick 
       false, false, false); // Ctr, Alt, Shift 
      } 

      function txtKeydown(e) { 
       console.dir(e); 
       console.log(e.keyCode); 
      } 

     </script> 
    </body> 
</html> 
+0

有一個非常聰明的解決方法,請參閱:http://stackoverflow.com/questions/10455626/keydown-simulation-in-chrome-fires-normally-but-not-the-correct-key/10520017#10520017這將允許你設置你需要的屬性,併發送一個keyup/down事件。包含示例代碼。 – Orwellophile

回答

9

它看起來有點過了,因爲你問了這個,所以你可能已經找到了你的問題的答案。如果你還沒有,this SO question指出bug in Webkit,導致keyCode始終爲0.顯然,沒有太多的事情可以做,直到他們修復它。可悲的是,它看起來並不像任何人真的在努力。這不是你想聽到的答案,但它是現在任何人都可以給你的唯一答案。

34

令我驚訝的是,這個bug已經在這裏呆了很久了。似乎有一個使用通用事件的解決方法。這裏有一個演示:http://jsbin.com/awenaq/3

+9

這個bug *仍然存在! –

+0

@Philip你能解釋一下這個演示嗎?看起來你已經輸入了按鍵的鍵碼,這不是一個解決方法,鉻不能分辨哪個鍵被按下。 – ProblemsOfSumit

+0

@Sumit:演示顯示如何在**手動觸發**事件時使用通用事件而不是KeyboardEvent。 –

0

我遇到了像索尼Xperia和HTC設備的Android設備相同的問題。所以我找到了替代解決方案:請參考我的回答這個問題 KeyCode Returns 0 Always

0

這不是一個錯誤...這個功能被淘汰,棄用,禁止,whateva'的名字將是明天...你不能依賴此功能長時間工作。 ......並且是一個廣泛的安全風險......找到另一種方法來做你想做的事情。請參閱MOZILLA規格,您將看到「BIG BAD RED BANNER」,它警告說要避免這種情況,像鼠疫一樣。 他們不會解決這個問題,通過返回0,他們有效地止血,而無需修改代碼除了在一個地方,如果你有它總是跳越鍵代碼爲0

0

的jQuery:

$.Event(event, { keyCode: 13 });

這是預期的用途。
Source