关于键盘Backpace键自动退出系统问题
-
遇见需求
光标在非文本框内,按"Backspace"键,整个页面会回退到系统登录页(谷歌没问题,主要是IE8,火狐以及360等浏览器)
-
解决方案
在公共js中,通过js监听backspace按键的按下事件:
- 如果标签不是input或者textarea则阻止Backspace
- input标签除了(TEXT、TEXTAREA、PASSWORD)这些类型,全部阻止Backspace
- input或者textarea输入框如果不可编辑则阻止Backspace
window.document.onkeydown = banBackSpace;
function banBackSpace(e) {
var ev = e || window.event;
//各种浏览器下获取事件对象
var obj = ev.relatedTarget || ev.srcElement || ev.target || ev.currentTarget;
//按下Backspace键
if (ev.keyCode == 8) {
var tagName = obj.nodeName //标签名称
//如果标签不是input或者textarea则阻止Backspace
if (tagName != 'INPUT' && tagName != 'TEXTAREA') {
return stopIt(ev);
}
var tagType = obj.type.toUpperCase(); //标签类型
//input标签除了下面几种类型,全部阻止Backspace
if (tagName == 'INPUT' && (tagType != 'TEXT' && tagType != 'TEXTAREA' && tagType != 'NUMBER' && tagType != 'PASSWORD')) {
return stopIt(ev);
}
//input或者textarea输入框如果不可编辑则阻止Backspace
if ((tagName == 'INPUT' || tagName == 'TEXTAREA') && (obj.readOnly == true || obj.disabled == true)) {
return stopIt(ev);
}
}
}
function stopIt(ev) {
if (ev.preventDefault) {
//preventDefault()方法阻止元素发生默认的行为
ev.preventDefault();
}
if (ev.returnValue) {
//IE浏览器下用window.event.returnValue = false;实现阻止元素发生默认的行为
ev.returnValue = false;
}
return false;
}
为什么使用onkeydown而不使用onkeyup?
因为onkeyup会先执行浏览器默认时间,会导致backspace事件先执行;如果使用onkeyup,可以使用addListener的第三个参数设置成true
- 注解一:
- IE:有window.event对象 Firefox:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event) 统一的解决方法:var event = event || window.event;
- IE:even对象有srcElement属性,但是没有target属性 Firefox:even对象有target属性,但是没有srcElement属性 解决方法:var obj = event.relatedTarget || event.srcElement || event.target || event.currentTarget;
- 注解二: 可在Chrome和Firefox中禁用Backspace作为Back Button,详情参考链接:How to Disable Backspace as Back Button in Chrome and Firefox
网友评论