如何使用jQuery模拟在输入框中进行输入?

52
我想要的是使用JavaScript模拟在<input>字段中打字的效果。
我有以下的代码:
var press = jQuery.Event("keydown");
press.ctrlKey = false;
press.which = 65;
$("#test").trigger(press);

但是当我加载页面时,#test 输入框中没有输入的字符,'65' 的键码代表 'A',但没有 'A' 的输入。

基本上我想要的是使用 Greasemonkey 在网站上自动输入。

请给我一些想法或库,我可以使用它来实现。
非常感谢!

1个回答

54

您可以发送按键事件,任何监听这些事件的东西都会收到它们,但它们不会改变输入,所以您不会看到例如字母A出现。这主要是出于安全考虑;有关此问题的讨论,请参见"手动触发事件"

因此,如果您想要该字母出现,则必须在发送按键事件时更改输入的值。有一个jQuery插件可以实现这一点,请参见"$.fn.sendkeys插件"

您可以在此jsFiddle中查看<input>如何对用户应用的键、按键事件和该插件做出反应。

供参考,以下是来自该jsFiddle的关键代码:

$("button").click ( function (zEvent) {
    if (zEvent.target.id == "simA_plain") {
        console.log ("Send Plain key event");
        var keyVal = 65;
        $("#eventTarg").trigger ( {
            type: 'keypress', keyCode: keyVal, which: keyVal, charCode: keyVal
        } );
    }
    else {
        console.log ("Use the Plugin to simulate a keystroke");
        $("#eventTarg").sendkeys ("B") ;
    }
} );


如果你只是想“模拟在<input>上输入文本”,那么那个插件就足够了。但是,根据你的真实目的,你可能需要执行以下一项或多项操作:
  1. 将文本设置为所需内容。
  2. 发送keydown事件,如果页面的JavaScript会触发该事件。
  3. 同样地,如果页面的JavaScript会触发change事件等,则发送该事件。
  4. 直接查找并调用页面的JavaScript。使用脚本注入、位置欺骗、unsafeWindow和/或@grant none模式来实现。
  5. 还有其他什么?说明你的真实目标并链接到目标页面。

1
这真的很有帮助 :) - shuboy2014
@isa,我刚刚检查了链接和Fiddle。两者似乎仍然可以使用。为什么/如何“不起作用”?请详细说明。 - Brock Adams
哦,我猜可能是我的问题,但我不知道为什么。它把我带到了弹跳页面,云图标一直在跳动,内容似乎无法加载。 - Isa
@isa,这是一个不同网站的问题。但很可能是你的浏览器、配置或扩展程序的问题。或者可能是你所在的网络问题。 - Brock Adams
请问这个问题的JavaScript等效代码是什么?我正在尝试在Chrome扩展程序中手动模拟对第三方网站的搜索,但无法弄清楚如何触发他们的搜索代码,因为手动输入和搜索的行为与编程方式不同... - Alex Bowyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接