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