有没有一种方法来模拟按键或用JavaScript点击?

我写了一个谷歌浏览器扩展和网站,我想要使用我的扩展要求我点击或选项卡上的文本框(因为我认为它只运行JavaScriptvalidation“onclick”)。 现在我可以使用我的扩展名来获取文本框中的内容:

document.getElementById("input1").value = 'test'; 

但是当我点击提交时,它认为我没有在“input1”文本框中input任何内容,因为我从来没有点击过它或标签。

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

模拟鼠标点击

我的猜测是,网页正在监听mousedown,而不是点击(这是可访问性不好,因为当用户使用键盘,只有焦点和点击被激发,而不是mousedown)。 所以你应该模拟mousedown,click和mouseup(顺便说一下, 这是iPhone,iPod Touch和iPad在敲击事件上所做的 )。

要模拟鼠标事件,您可以使用此代码段来浏览支持DOM 2事件的浏览器。 为了更安全的模拟,请使用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中,等效片段是这个(未validation,因为我没有IE)。 我不认为你可以给事件处理程序鼠标位置。

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

模拟keydown和按键

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

  1. keydown(通常具有默认动作,如点击,提交或textInput事件)
  2. 按键(如果键不仅仅是像Shift或Ctrl这样的修饰键)
  3. (keydown,按键)与重复=真如果用户按住button
  4. keydown的默认行动!
  5. KEYUP

这意味着,您必须(同时梳理HTML5和DOM3事件草案)模拟大量的浏览器将做的事情。 当我必须这样做时,我讨厌它。 例如,这大致是如何模拟input或textarea上的按键。

 // 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中模拟关键事件。

你可以通过做一个元素来提高点击事件

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

这里的例子

在Chrome中模拟键盘事件:

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

它的工作解决scheme是张贴在这个SO回答 。

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

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

new MouseEvent构造函数接受一个必需的事件types名称,然后是一个可选对象(至less在Chrome中)。 所以你可以,例如,设置事件的一些属性:

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

重点可能是你要找的东西。 通过标签或点击我认为你的意思是让这个元素成为焦点。 与Russ相同的代码(对不起,我偷了它:P),但发射了其他事件。

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