但是当我点击提交时,它认为我没有在“input1”文本框中输入任何内容,因为我从未点击过它或在它上面添加标签。

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

5个回答

模拟鼠标点击

我的猜测是该网页正在侦听 mousedown 而不是 click (这对可访问性不利,因为当用户使用键盘时,只会触发焦点和点击,而不是 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);

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

在 IE 中,等效的代码段是这样的(由于我没有 IE,因此未经验证)。我不认为你可以给事件处理程序鼠标位置。

// IE 5.5+
element.fireEvent("onmouseover");
element.fireEvent("onmousedown");
element.fireEvent("onclick");  // or element.click()
element.fireEvent("onmouseup");

模拟按键和按键

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

  1. keydown(通常具有默认操作,例如触发点击、提交或 textInput 事件)
  2. 按键(如果该键不仅仅是 Shift 或 Ctrl 等修饰键)
  3. (keydown, keypress) with repeat=true 如果用户按住按钮
  4. keydown 的默认操作!!
  5. 按键

这意味着您必须(在结合HTML5DOM 3 Events草稿时)模拟大量浏览器会做的事情。当我必须这样做时,我讨厌它。例如,这大致是如何模拟输入或文本区域上的按键。

// 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, '');

我认为在 IE 中模拟关键事件是不可能的。

此代码在 2017-01-08 的最新版本的 chrome 中不再起作用,这个答案需要更新!
2021-03-13 01:34:25
如果有人遇到这种情况,正在寻找一种与框架无关的方式来触发任何 HTML 和鼠标事件(并在需要时设置一些选项),请查看此处:stackoverflow.com/questions/6157929/...
2021-03-15 01:34:25
@hamczu 这个SO 答案有一个解决 charCode = 0 问题的方法。这是webkit 中的一个已知错误- 已经开放了大约 5 年!
2021-03-19 01:34:25
我已经尝试过(在 Chrome 扩展程序中)并且不起作用......来自创建事件的日志显示“which”、“charCode”和“keyCode”是 0 而不是正确的字符/键代码。有人有同样的问题吗?
2021-04-07 01:34:25
截至 2016 年 9 月 17 日,此代码在最新版本的 chrome 中不再适用
2021-04-10 01:34:25

您可以通过执行以下操作来引发元素上的点击事件

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

if (element) element.click();

示例在这里

您正在运行什么版本的 Chrome,在什么平台上运行?我只是尝试在 Windows7 上访问 15.0.874.102 上的示例页面,它按预期工作。这个例子对你有用吗?
2021-03-18 01:34:25
尝试其他事件一样focuschangekeypress
2021-03-26 01:34:25
我发现这在 Chrome (WebKit) 上不起作用。HTMLAnchorElement 的 click 属性未定义。
2021-03-31 01:34:25
我试过了,但出于某种原因,该网站仍然认为我没有输入任何内容......很奇怪。
2021-04-02 01:34:25

或者更短,只有标准的现代 Javascript:

var first_link = document.getElementsByTagName('a')[0];
first_link.dispatchEvent(new MouseEvent('click'));

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

first_link.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));

在 Chrome 中模拟键盘事件:

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

这个 SO answer 中发布了一个可行的解决方案

焦点可能是您要寻找的。通过 Tab 键或单击,我认为您的意思是将焦点放在元素上。与 Russ 相同的代码(对不起,我偷了它:P)但触发了另一个事件。

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

if (element) element.focus();
谢谢,我也试过这个,还有点击,但网站仍然认为我没有输入任何东西......
2021-03-21 01:34:25
其它你可能感兴趣的问题
上一篇Window.open 并通过post方法传递参数 下一篇JSON 劫持在现代浏览器中仍然是一个问题吗?