如何使用JavaScript模拟按键或单击?

mil*_*lan 40 javascript google-chrome google-chrome-extension

我写了一个谷歌浏览器扩展程序,我想要使用我的扩展程序的网站要求我点击或标签到文本框(因为我认为它只运行javaScript验证"onClick").我可以使用我的扩展程序在框中获取文本:

document.getElementById("input1").value = 'test';
Run Code Online (Sandbox Code Playgroud)

但是当我点击提交时,它认为我没有在"input1"文本框中输入任何内容,因为我从未点击过它或在其上打勾.

有人可以帮我解决这个问题吗?

yon*_*ran 78

模拟鼠标单击

我的猜测是网页正在监听mousedown而不是点击(这对于可访问性是不利的,因为当用户使用键盘时,只会触发焦点和点击,而不是mousedown).因此,您应该模拟mousedown,click和mouseup(顺便说一句,这是iPhone,iPod Touch和iPad在点击事件上所做的事情).

要模拟鼠标事件,可以将此代码段用于支持DOM 2 Events的浏览器.要获得更加简单的模拟,请使用填充鼠标位置initMouseEvent.

// DOM 2 Events
var dispatchMouseEvent = function(target, var_args) {
  var e = document.createEvent("MouseEvents");
  // If you need clientX, clientY, etc., you can call
  // initMouseEvent instead of initEvent
  e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
  target.dispatchEvent(e);
};
dispatchMouseEvent(element, 'mouseover', true, true);
dispatchMouseEvent(element, 'mousedown', true, true);
dispatchMouseEvent(element, 'click', true, true);
dispatchMouseEvent(element, 'mouseup', true, true);
Run Code Online (Sandbox Code Playgroud)

当您触发模拟点击事件时,浏览器将实际触发默认操作(例如,导航到链接的href,或提交表单).

在IE中,等效的片段就是这个(未经验证,因为我没有IE).我不认为你可以给事件处理程序鼠标位置.

// IE 5.5+
element.fireEvent("onmouseover");
element.fireEvent("onmousedown");
element.fireEvent("onclick");  // or element.click()
element.fireEvent("onmouseup");
Run Code Online (Sandbox Code Playgroud)

模拟keydown和按键

您可以模拟keydown和keypress事件,但遗憾的是,在Chrome中,它们只会触发事件处理程序,并且不会执行任何默认操作.我认为这是因为DOM 3 Events工作草案描述了这个关键事件的时髦顺序:

  1. keydown(通常有默认操作,如fire click,submit或textInput events)
  2. 按键(如果键不仅仅是Shift或Ctrl等修饰键)
  3. (keydown,keypress)如果用户按下按钮,则返回repeat = true
  4. keydown的默认动作!!
  5. KEYUP

这意味着您必须(在梳理HTML5DOM 3事件草稿时)模拟浏览器本来会执行的大量操作.当我不得不这样做时,我讨厌它.例如,这大致是如何模拟输入或文本区域上的按键.

// DOM 3 Events
var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) {
  var e = document.createEvent("KeyboardEvents");
  e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1));
  target.dispatchEvent(e);
};
var dispatchTextEvent = function(target, initTextEvent_args) {
  var e = document.createEvent("TextEvent");
  e.initTextEvent.apply(e, Array.prototype.slice.call(arguments, 1));
  target.dispatchEvent(e);
};
var dispatchSimpleEvent = function(target, type, canBubble, cancelable) {
  var e = document.createEvent("Event");
  e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
  target.dispatchEvent(e);
};

var canceled = !dispatchKeyboardEvent(element,
    'keydown', true, true,  // type, bubbles, cancelable
    null,  // window
    'h',  // key
    0, // location: 0=standard, 1=left, 2=right, 3=numpad, 4=mobile, 5=joystick
    '');  // space-sparated Shift, Control, Alt, etc.
dispatchKeyboardEvent(
    element, 'keypress', true, true, null, 'h', 0, '');
if (!canceled) {
  if (dispatchTextEvent(element, 'textInput', true, true, null, 'h', 0)) {
    element.value += 'h';
    dispatchSimpleEvent(element, 'input', false, false);
    // not supported in Chrome yet
    // if (element.form) element.form.dispatchFormInput();
    dispatchSimpleEvent(element, 'change', false, false);
    // not supported in Chrome yet
    // if (element.form) element.form.dispatchFormChange();
  }
}
dispatchKeyboardEvent(
    element, 'keyup', true, true, null, 'h', 0, '');
Run Code Online (Sandbox Code Playgroud)

我不认为可以在IE中模拟关键事件.

  • 我已经尝试过(在Chrome扩展程序中)并且无法工作...从创建的事件中显示"which","charCode"和"keyCode"为0而不是正确的字符/键代码.有没有人有同样的问题? (6认同)
  • @hamczu这个[SO答案](http://stackoverflow.com/questions/10455626/keydown-simulation-in-chrome-fires-normally-but-not-the-correct-key/10520017#10520017)有一个解决方法charCode = 0问题.它是[webkit中的已知错误](https://bugs.webkit.org/show_bug.cgi?id=16735) - 已经开放了大约5年! (3认同)
  • 此代码在 2017-01-08 的最新版本的 chrome 中不再起作用,这个答案需要更新! (2认同)

Rus*_*Cam 9

您可以通过执行来提升元素上的click事件

// this must be done after input1 exists in the DOM
var element = document.getElementById("input1");

if (element) element.click();
Run Code Online (Sandbox Code Playgroud)

这里的例子


chb*_*own 7

甚至更短,只有标准的现代Javascript:

var first_link = document.getElementsByTagName('a')[0];
first_link.dispatchEvent(new MouseEvent('click'));
Run Code Online (Sandbox Code Playgroud)

所述new MouseEvent构造函数采用一个所需的事件类型名称,然后可选对象(至少在Chrome).例如,您可以设置事件的一些属性:

first_link.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));
Run Code Online (Sandbox Code Playgroud)


tan*_*ree 5

要在Chrome中模拟键盘事件:

webkit中存在一个相关的错误,即使用initKeyboardEvent初始化时键盘事件的keyCode和charCode为0:https://bugs.webkit.org/show_bug.cgi?id = 16735

它的工作解决方案发布在这个SO答案中.


归档时间:

查看次数:

105129 次

最近记录:

7 年,5 月 前