Kai*_*ido 11 html javascript android fennec firefox-os
我正试图通过跨浏览器的方式来倾听keyCode用户的意见keyDown.
对于移动浏览器,我必须触发虚拟键盘,因此我使用由css隐藏的输入,由click事件触发.这很有效,除了当我尝试听密码时,在fennec(移动版Firefox)上,我有一些奇怪的行为.
这是我用来听的功能keycode.
document.querySelectorAll('input')[0].addEventListener('keydown', handler);
function handler(e) {
e.preventDefault();
var k = (e.which) ? e.which : e.keyCode;
document.getElementById('log').innerHTML = k;
this.style.backgroundColor = "#FFAAFF";
}Run Code Online (Sandbox Code Playgroud)
<input type="text" />
<span id="log"></span>Run Code Online (Sandbox Code Playgroud)
在Firefox for android (v34到v37)中,在用户键入返回之前不会触发⏎.
实际上,我发现如果输入的值不为空,那么它至少在加载时效果很好.所以我想到了一个像这样的解决方法:if(this.value=='')this.value='*';
似乎工作但是如果你垃圾邮件它,退格键
⌫没有被阻止,所以当输入被清除时,错误会回来:解决方法也不会解决.
+这是一个丑陋的解决方法,我肯定会在其他浏览器中创建其他错误.
document.querySelectorAll('input')[0].addEventListener('keydown', handler);
function handler(e) {
if(this.value=='')this.value='*';
e.preventDefault();
var k = (e.which) ? e.which : e.keyCode;
document.getElementById('log').innerHTML = k;
this.style.backgroundColor = "#FFAAFF";
}
Run Code Online (Sandbox Code Playgroud)
<input type="text" value="*"/>
<span id="log"></span>
Run Code Online (Sandbox Code Playgroud)
在B2G(设备上的Firefox Os 1.3或2.0模拟)中,行为甚至更奇怪:
该函数仅读取keyCode退格⌫(keycode 8)或返回⏎(keyCode
13)键.任何其他密钥将返回0.
所以,我的问题是,你知道一个更好的跨浏览器方式来听keyCode,一个在所有主流浏览器,桌面或移动,以及fennec工作吗?
Ps:即使我在vanilla-js中编写我的应用程序,我也可以看到任何库的解决方案.
小智 2
没有一个完美的解决方案可以跨浏览器和操作系统侦听 KeyCode...仅仅是因为 javascript 使用与其运行的操作系统报告的相同的 Key Code。您最好使用该input事件而不是keyDown
根据此站点,当通过用户界面更改元素的文本内容时,事件input就会发生,这正是您想要的,因为在某些移动浏览器/操作系统中,直到用户输入输入并且事件触发后才会触发事件change。
$(document).ready(function () {
var inputEvent = 'oninput' in window ? 'input' : 'keyup';
$('#listen').on(inputEvent, function (event) {
$('#show').val($('#show').val() + '\n' + event.type);
console.log('--- input event ----');
for (var v in event.originalEvent) {
if (event.hasOwnProperty(v)) {
console.log(v + ' |---> ' + event[v]);
}
}
})
//just added to see what Silk listens for on the keyup event
$('#listen').on('keyup', function (event) {
$('#show').val($('#show').val() + '\n' + event.type + ' | which --> ' + event.which);
console.log('--- keyup event ----');
for (var v in event.originalEvent) {
if (event.hasOwnProperty(v)) {
console.log(v + ' |-.-> ' + event[v]);
}
}
})
});Run Code Online (Sandbox Code Playgroud)
input {
font-size: 22px
}
input, textarea {
width:300px;
}
textarea {
height:300px;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div>
<input type='text' id="listen" />
<br/>
<br/>
<textarea type='text' id="show"></textarea>
</div>Run Code Online (Sandbox Code Playgroud)