Javascript 是否可以通过编程方式模拟按键事件?

Javascript 是否可以通过编程方式模拟按键事件?,javascript,dom-events,Javascript,Dom Events,是否可以在JavaScript中以编程方式模拟按键事件?如果可以使用jQuery 1.3.1: 功能模拟按键(字符){ 触发器({type:'keypress',其中:character.charCodeAt(0)}); } $(函数(){ $('body')。按键(功能(e){ 警报(例如,哪个); }); 模拟电子出版公司(“e”); }); 您可以使用dispatchEvent(): 我没有测试这个,但它是根据上的代码改编的。您可能需要通读这些内容,以及createEvent()和ini

是否可以在JavaScript中以编程方式模拟按键事件?

如果可以使用jQuery 1.3.1:

功能模拟按键(字符){
触发器({type:'keypress',其中:character.charCodeAt(0)});
}
$(函数(){
$('body')。按键(功能(e){
警报(例如,哪个);
});
模拟电子出版公司(“e”);
});

您可以使用
dispatchEvent()


我没有测试这个,但它是根据上的代码改编的。您可能需要通读这些内容,以及createEvent()和initKeyEvent()的文档。

基于alex2k8的答案,这里有一个修订版,适用于jQuery支持的所有浏览器(问题在于jQuery.event.trigger缺少参数,在使用该内部函数时很容易忘记)

//jQuery插件。在jQuery对象上调用,而不是直接调用。
jQuery.fn.simulateKeyPress=函数(字符){
//使用参数(事件、数据、元素)在内部调用jQuery.event.trigger。
//最后一个论点“elem”非常重要!
jQuery(this).trigger({type:'keypress',其中:character.charCodeAt(0)});
};
jQuery(函数($){
//绑定事件处理程序
$('body')。按键(功能(e){
警报(String.fromCharCode(e.which));
控制台日志(e);
});
//模拟按键
$('body').simulateKeyPress('x');
});

您甚至可以进一步推动它,让它不仅模拟事件,而且实际插入角色(如果它是一个输入元素),但是在尝试这样做时,有许多跨浏览器的问题。最好使用更精细的插件,如。

在webkit和gecko中都能使用的非jquery版本:

var keyboardEvent=document.createEvent('keyboardEvent');
var initMethod=typeof keyboardEvent.initKeyboardEvent!='未定义的“?”initKeyboardEvent':'initKeyEvent';
键盘事件[初始化方法](
'keydown',//事件类型:keydown、keydup、keypress
对,//气泡
true,//可取消
窗口,//视图:应为窗口
false,//ctrlKey
false,//altKey
false,//shiftKey
false,//元密钥
40,//keyCode:unsigned long-虚拟密钥代码,否则为0
0,//charCode:unsigned long-与按下的键关联的Unicode字符,否则为0
);

文件发送事件(键盘事件)此方法支持跨浏览器更改键代码的值。


您可以创建和分派键盘事件,它们将触发相应的已注册事件处理程序,但是如果分派到输入元素,它们将不会生成任何文本

要完全模拟文本输入,您需要生成一系列键盘事件,并显式设置输入元素的文本。事件的顺序取决于您希望模拟文本输入的程度

最简单的形式是:

$('input').val('123');
$('input').change();

您可以通过触发keyevents以编程方式触发keyevent侦听器。从沙盒安全的角度来看,允许这样做是有意义的。使用此功能,您可以应用典型的。您可以将此方法称为“模拟”

下面是如何在W3C DOM标准和jQuery中实现这一点的示例:

function triggerClick() {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });
  var cb = document.querySelector('input[type=submit][name=btnK]'); 
  var canceled = !cb.dispatchEvent(event);
  if (canceled) {
    // preventDefault was called and the event cancelled
  } else {
    // insert your event-logic here...
  }
}
本示例改编自:

在jQuery中:

jQuery('input[type=submit][name=btnK]')
  .trigger({
    type: 'keypress',
    which: character.charCodeAt(0 /*the key to trigger*/)      
   });
但最近,还没有[DOM]方法真正触发离开浏览器沙箱的keyevents。所有主要浏览器供应商都将坚持这一安全概念

至于像AdobeFlash这样的插件——它们基于NPAPI——并允许绕过沙箱:它们是

详细说明:

出于安全原因,您不能也不能这样做(正如佩卡已经指出的)。您将始终需要在两者之间进行用户交互。另外,想象一下浏览器供应商被用户起诉的可能性,因为各种编程键盘事件将导致欺骗攻击

请参阅此以了解替代方案和更多详细信息。始终存在基于flash的复制和粘贴。这是一个优雅的房间。同时,这也证明了为什么网络正在远离插件供应商

在以编程方式访问远程内容的情况下,也应用了类似的安全思想

答案是:
在正常情况下,无法在沙盒浏览器环境中以编程方式触发输入键

底线:我并不是说在未来,在特殊的浏览器模式和/或特权下,这将不可能实现游戏的最终目标,或类似的用户体验。但是,在进入此类模式之前,将向用户询问权限和风险,类似于

有用:在键码上下文中,工具和键码映射将派上用场


披露:答案基于答案。

对于那些感兴趣的人,事实上,你可以可靠地重新创建键盘输入事件。要更改输入区域中的文本(移动光标或通过输入字符移动页面),必须严格遵循DOM事件模型:

模型应做到:

  • 焦点(在具有目标集的DOM上调度)
然后针对每个字符:

  • keydown(在DOM上调度)
  • beforeinput(如果是textarea或input,则在目标处调度)
  • 按键(在DOM上调度)
  • 输入(如果是textarea或输入,则在目标处调度)
  • 更改(如果是select,则在目标处调度)
  • keyup(在DOM上调度)
然后,对于大多数情况,也可以选择:

  • 模糊(使用目标集在DOM上调度)
这实际上是通过javascript更改页面中的文本(不修改值语句),并适当地设置任何javascript侦听器/处理程序。如果你弄乱了序列,javascript会
function triggerClick() {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  });
  var cb = document.querySelector('input[type=submit][name=btnK]'); 
  var canceled = !cb.dispatchEvent(event);
  if (canceled) {
    // preventDefault was called and the event cancelled
  } else {
    // insert your event-logic here...
  }
}
jQuery('input[type=submit][name=btnK]')
  .trigger({
    type: 'keypress',
    which: character.charCodeAt(0 /*the key to trigger*/)      
   });
Node.prototype.fire=function(type,options){
     var event=new CustomEvent(type);
     for(var p in options){
         event[p]=options[p];
     }
     this.dispatchEvent(event);
}
window.addEventListener("keyup",function(ev){
     if(ev.ctrlKey && ev.keyCode === 90) console.log(ev); // or do smth
     })

 document.fire("keyup",{ctrlKey:true,keyCode:90,bubbles:true})
element.dispatchEvent(new KeyboardEvent('keydown',{'key':'a'}));
element.dispatchEvent(new KeyboardEvent('keydown',{'key':'Shift'}));
element.dispatchEvent(new KeyboardEvent('keyup',{'key':'Shift'}));
var e = jQuery.Event("keypress");
e.which = 13 //or e.keyCode = 13 that simulates an <ENTER>
$("#element_id").trigger(e); 
document.dispatchEvent(
  new KeyboardEvent("keydown", {
    key: "e",
    keyCode: 69, // example values.
    code: "KeyE", // put everything you need in this object.
    which: 69,
    shiftKey: false, // you don't need to include values
    ctrlKey: false,  // if you aren't going to use them.
    metaKey: false   // these are here for example's sake.
  })
);
var x = document.querySelector('input');

var keyboardEvent = new KeyboardEvent("keypress", { bubbles: true });
// you can try charCode or keyCode but they are deprecated
Object.defineProperty(keyboardEvent, "key", {
  get() {
    return "Enter";
  },
});
x.dispatchEvent(keyboardEvent);