脚本模拟键盘输入方式,监听键盘事件e.IsTrusted属性是false,此属性为只读属性不能更改,用户用键盘正常输入该值为true。目前没有找到好的处理方式。
Firefox浏览器中有如下处理方式(未试,只做记录):
var utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendNativeKeyEvent(0, schar, 0, schar, '');
在Chrome浏览器浏览器此代码报错。
如下是核心代码,仅供参考:
//添加keydown事件监听,跟踪按键
document.addEventListener("keydown", function (e) {
traceEvent(e);
});
//模拟键盘触发事件方法
function triggerKeyboardEvent(el, keyCode) {
var eventObj = document.createEventObject ?
document.createEventObject() : document.createEvent("Events");
if (eventObj.initEvent) {
eventObj.initEvent("keydown", true, true);
}
eventObj.keyCode = keyCode;
eventObj.which = keyCode;
el.dispatchEvent ? el.dispatchEvent(eventObj) : el.fireEvent("onkeydown", eventObj);
}
//针对按键事件的逻辑处理
function traceEvent(e) {
var ch = String.fromCharCode(e.keyCode);
document.getElementById("txtContent").value = ch;
console.log(e);
}
//Html控件调用的方法
function clk() {
var str = "a";
var cCode = str.charCodeAt(0);
triggerKeyboardEvent(document.body, cCode);
}
手动触发事件的方式
场景:JS自动填充CSDN登录页用户名、密码时,点击登录按钮,会清空用户名、密码且登录失败。此时可手动触发Input事件或onpropertychanged事件。
源码如下:
//针对提交表单时,脚本填充的信息会清空,可能需要额外触发input事件,IE下是propertychanged事件
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("input", true, false);
obj.dispatchEvent(evt);
} else obj.fireEvent("input");
//change事件手动触发方式
var obj = document.getElementById(elemId);
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", true, false);
obj.dispatchEvent(evt);
} else obj.fireEvent("onchange");
keydown、keyup、keypress都可以用此种方式触发。