我写了一个Google Chrome扩展程序,要在其上使用扩展程序的网站要求我单击或制表到文本框(因为我认为它仅运行javaScript验证“
onClick”)。我可以使用以下扩展名在框中输入带有扩展名的文本:
document.getElementById("input1").value = 'test';
但是,当我单击提交时,它认为我没有在“ input1”文本框中输入任何内容,因为我从未单击过它或在其上使用选项卡。
有人可以帮我解决这个问题吗?
我的猜测是网页正在听鼠标按下而不是单击(这对可访问性不利,因为当用户使用键盘时,仅触发焦点和单击,而不是按下鼠标)。因此,您应该模拟mousedown,click和mouseup顺便说一下,这就是iPhone,iPodTouch和iPad在点击事件中所做的事情。
要模拟鼠标事件,可以将此片段用于支持DOM2Events的浏览器。对于更简单的模拟,请使用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中,它们仅触发事件处理程序,并且不执行任何默认操作。我认为这是因为DOM3事件工作草案描述了关键事件的这种时髦顺序:
这意味着您必须(在合并HTML5和DOM3事件草稿时)模拟浏览器原本会执行的大量操作。我讨厌这样做。例如,这大致是模拟输入或文本区域上的按键的方法。
// 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中模拟关键事件。
问题内容: 我只是想知道如何使用JavaScript模拟元素的点击。 目前我有: 但这不起作用:( 有任何想法吗? 问题答案: 这是我煮的 这很简单,但是有效: 用法:
问题内容: 我正在寻找一种在OSX中模拟击键的方法。我发现了使用Objective-C的另一种解决方案针对系统范围的热键模拟按键,但是我需要使用Swift来实现。如何适应CGEventCreateKeyboardEvent? 问题答案: 链接答案上的代码可以很容易地转换为Swift代码,但是在此过程中您需要注意一些技巧: 接受a ,这是a的类型别名,但是诸如的常量被定义为as ,因此您必须将它们强
问题内容: 使用jQuery,如何在单击链接时模拟(触发?)KeyPress?例如,当用户单击以下链接时: 然后,通过单击链接,就好像他们按下了键盘上的“空格键”一样。 像这样,我假设: 关于如何实现这一目标的任何想法? 问题答案: jQuery的keypress事件旨在完成这种工作。您可以通过将字符串“keypress”传递给.trigger()来触发事件。但是,更具体地说,您实际上也可以传递j
问题内容: 我正在使用Selenium编写一些UI测试,并且使用Dojo工具箱具有一个JavaScript Tree控件。 我已经使用Dojo提供的示例为树的每个节点实现了一个上下文菜单,但是我需要Selenium测试来“调用”树节点上的右键,但是我无法使其正常工作。这些测试根本不会通过JavaScript模拟右键单击事件,并且不会显示上下文菜单。 是否有人在使用Dojo和Selenium调用上下
问题内容: 我想运行一个Java程序,并使其模拟键盘按键。因此,例如,可以在聚焦的输入框中键入一些文本。这可能吗? 问题答案: 可能会有所帮助。 这是的一个简单示例代码片段:
问题内容: 如何以编程方式模拟Droid上的按键?我想模仿一个手动按键(在机器人上显示有人正在按某个按键,但是这是通过编程方式完成的)。 有涉及的解决方案,但是在新的SDK中已经不再是选择。 问题答案: 您可以使用检测,即,从活动的onCreate调用的以下代码将导致菜单多次打开和关闭: …但是我不确定这是否是你所追求的