JS模拟键盘输入及手动触发事件的方式

脚本模拟键盘输入方式,监听键盘事件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都可以用此种方式触发。

你可能感兴趣的:(JavaScript)