在输入键按下模拟

时间:2016-01-06 12:43:34

标签: javascript

所以(只是以“so”开头)我想为qwebirc平台创建一个greasemonkey脚本。我需要根据发生的一些事件自动发送回复。对于那些不知道的人,一旦登录qwebirc,屏幕底部就会有一个输入文本字段,您可以在其中写下您的回复,然后按回车键将回复发送到服务器。输入字段包含在表单元素中,但表单没有提交按钮。

我可以通过写入“value”属性来填充输入字段(没问题),但我发现无法将回复“提交”到服务器。我尝试在容器表单元素上调用.submit()方法,但这只是重新加载页面(因此它发送给自己 - 这是有道理的,因为表单元素上没有“action”属性)。在我看来,唯一的解释是,一旦在输入字段中按下回车键,就会在qwebirc.js上的某个地方调用一个方法。

我找不到负责这个动作的代码(虽然我在Chrome中工作过,但是我在键盘上设置了一个事件监听器断点 - 输入,当我按下回车键并指向我的时候就停止了我某些功能)因为脚本被缩小了,我无法知道那些“m”,“n”,“p”,“t”等意思。如果我有未压缩的版本,我可以扫描它,也许,找到它。我也试过下载qwebirc项目,但是那里有很多文件 - 而在服务器上我正在尝试编写greasemonkey脚本,只有一个脚本。

这里的主要想法是,我猜输入键按下模拟应该触发发送功能 - 无论在哪里,无论哪个。

为了做到这一点,我在stackoverflow上发现了一些关于同一主题的问题 - 按下回车键的模拟。我试过那段代码:

function simulate() {
    var evt = document.createEvent('KeyboardEvent'),
        input = document.querySelector('.keyboard-input');

    evt.initKeyboardEvent(
        'keydown', 
        true, 
        true, 
        window, 
        false, 
        false, 
        false, 
        false, 
        13, 
        0
    );

    input.dispatchEvent(evt);
}

事件已创建(我可以在FireBug的DOM面板中看到它),但不会采取任何操作。我的意思是为什么.dispatchEvent()的行为与真正的输入键不一样?

提前致谢。

1 个答案:

答案 0 :(得分:0)

出于本答案的目的,我将假设消息输入伪表格与其他人一样 - 即消息可以通过发送按Enter 点击发送按钮。

你尝试过前者;它不起作用。页面可能正在等待单击“发送”按钮(可能由Enter按键触发(尽管不是,我不知道为什么您的事件不起作用 - 我不熟悉事件的复杂性))。相反,那就试试吧。

另外,take note:IE使用fireEvent而不是dispatchEvent - 所以如果你在IE中,这可能就是问题。

点击发送按钮点击:

var e = document.createEvent("MouseEvents");
e.initEvent("click", true, true);
e.target = "button#send";

if(document.fireEvent) {
    document.fireEvent(e);
}
else {
    document.dispatchEvent(e);
}

将分配给e.target的字符串更改为唯一标识“发送”按钮的CSS选择器。