프로그래밍 방식으로 주요 프레스 이벤트를 시뮬레이션 할 수 있습니까?
JavaScript로 키 프레스 이벤트를 프로그래밍 방식으로 시뮬레이션 할 수 있습니까?
웹킷과 도마뱀 모두에서 작동하는 비 jquery 버전 :
var keyboardEvent = document.createEvent("KeyboardEvent");
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";
keyboardEvent[initMethod](
"keydown", // event type: keydown, keyup, keypress
true, // bubbles
true, // cancelable
window, // view: should be window
false, // ctrlKey
false, // altKey
false, // shiftKey
false, // metaKey
40, // keyCode: unsigned long - the virtual key code, else 0
0 // charCode: unsigned long - the Unicode character associated with the depressed key, else 0
);
document.dispatchEvent(keyboardEvent);
jQuery 1.3.1을 사용해도 괜찮다면 :
function simulateKeyPress(character) {
jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) });
}
$(function() {
$('body').keypress(function(e) {
alert(e.which);
});
simulateKeyPress("e");
});
당신이 할 수있는 것은 트리거 프로그램이다 의 KeyEvent 청취자를 발사하여 한 KeyEvents를 . 샌드 박스 보안 관점에서이를 허용하는 것이 합리적입니다. 이 기능을 사용하여 일반적인 옵저버 패턴 을 적용 할 수 있습니다 . 이 방법을 "시뮬레이션"이라고 부를 수 있습니다.
아래는 jQuery와 함께 W3C DOM 표준에서이를 수행하는 방법의 예입니다.
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...
}
}
이 예제는 https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events 에서 수정되었습니다.
jQuery에서 :
jQuery('input[type=submit][name=btnK]')
.trigger({
type: 'keypress',
which: character.charCodeAt(0 /*the key to trigger*/)
});
그러나 최근에는 브라우저 샌드 박스를 떠나는 키 이벤트를 실제로 트리거 할 수있는 [DOM] 방법이 없습니다. 그리고 모든 주요 브라우저 공급 업체는 해당 보안 개념을 준수합니다.
어도비 플래시와 같은 플러그인에 관해서 - NPAPI-을 기반으로하고 있으며, 샌드 박스를 우회 허용 :이되어 단계적으로 아웃 ; Firefox .
상해:
Pekka가 이미 지적했듯이 보안상의 이유로 할 수 없으며 그렇게해서는 안됩니다. 당신은 항상 사이에 사용자 상호 작용이 필요합니다. 또한 다양한 프로그램 키보드 이벤트로 인해 스푸핑 공격이 발생하여 브라우저 공급 업체가 사용자에게 고소 당할 가능성을 상상하십시오.
대안 및 자세한 내용 은이 게시물 을 참조하십시오. 항상 플래시 기반 복사하여 붙여 넣기가 있습니다. 여기 우아한 예가 있습니다. 동시에 웹이 플러그인 공급 업체에서 멀어지고 있다는 증거입니다.
옵트 인 CORS 정책 의 경우 프로그래밍 방식으로 원격 컨텐츠에 액세스하기 위해 유사한 보안 마인드가 적용됩니다 .
답은
정상적인 상황에서 샌드 박스 브라우저 환경에서 프로그래밍 트리거 입력 키에 방법은 없습니다 .
결론 : 미래의 특별한 브라우저 모드 및 / 또는 게임의 최종 목표 또는 유사한 사용자 경험에 대한 특권으로 인해 그것이 불가능할 것이라고는 말하지 않습니다. 그러나 이러한 모드로 들어가기 전에 사용자는 Fullscreen API 모델 과 유사한 권한 및 위험을 묻습니다 .
유용한 : 키 코드의 맥락에서, 이 도구와 키 코드 매핑이 유용합니다.
공개 : 답변은 여기 에있는 답변을 기반으로합니다 .
다음과 같은 요소에서 키보드 이벤트를 전달할 수 있습니다.
element.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));
당신은 사용할 수 있습니다 dispatchEvent()
:
function simulateKeyPress() {
var evt = document.createEvent("KeyboardEvent");
evt.initKeyboardEvent("keypress", true, true, window,
0, 0, 0, 0,
0, "e".charCodeAt(0))
var body = document.body;
var canceled = !body.dispatchEvent(evt);
if(canceled) {
// A handler called preventDefault
alert("canceled");
} else {
// None of the handlers called preventDefault
alert("not canceled");
}
}
나는 이것을 테스트하지 않았지만 dispatchEvent () documentation 의 코드에서 조정되었습니다 . 아마 그 내용과 createEvent () 및 initKeyEvent ()에 대한 문서를 읽고 싶을 것입니다.
키보드 이벤트를 생성하고 전달할 수 있으며 등록 된 적절한 이벤트 핸들러를 트리거하지만 입력 요소로 전달되는 경우 text를 생성하지 않습니다 .
텍스트 입력을 완전히 시뮬레이션하려면 일련의 키보드 이벤트를 생성하고 입력 요소의 텍스트를 명시 적으로 설정해야합니다. 이벤트 순서는 텍스트 입력을 얼마나 철저하게 시뮬레이트할지에 따라 다릅니다.
가장 간단한 형태는 다음과 같습니다.
$('input').val('123');
$('input').change();
alex2k8의 답변을 바탕으로 jQuery가 지원하는 모든 브라우저에서 작동하는 수정 된 버전이 있습니다 (문제는 jQuery.event.trigger에 대한 인수가 누락되어 내부 함수를 사용할 때 잊을 수 없음).
// jQuery plugin. Called on a jQuery object, not directly.
jQuery.fn.simulateKeyPress = function (character) {
// Internally calls jQuery.event.trigger with arguments (Event, data, elem).
// That last argument, 'elem', is very important!
jQuery(this).trigger({ type: 'keypress', which: character.charCodeAt(0) });
};
jQuery(function ($) {
// Bind event handler
$('body').keypress(function (e) {
alert(String.fromCharCode(e.which));
console.log(e);
});
// Simulate the key press
$('body').simulateKeyPress('x');
});
이것을 더 밀어 넣고 이벤트를 시뮬레이션 할뿐만 아니라 실제로 문자를 입력 요소 (삽입 요소 인 경우)를 삽입 할 수는 있지만 그렇게 할 때 브라우저 간 문제가 많이 있습니다. SendKeys 와 같은보다 정교한 플러그인을 사용하는 것이 좋습니다.
경우에 따라 keypress
이벤트가 필요한 기능을 제공하지 못할 수도 있습니다. mozilla 문서 에서 해당 기능이 더 이상 사용되지 않음을 알 수 있습니다.
이 기능은 더 이상 권장되지 않습니다. 일부 브라우저는 여전히이 브라우저를 지원할 수 있지만 관련 웹 표준에서 이미 제거되었거나 삭제 중이거나 호환성을 위해서만 유지 될 수 있습니다. 사용하지 말고 가능한 경우 기존 코드를 업데이트하십시오. 결정을 안내하려면이 페이지 하단의 호환성 표를 참조하십시오. 이 기능은 언제든지 작동하지 않을 수 있습니다.
따라서 keypress
이벤트는 결과적으로 발생하는 두 개의 이벤트 keydown
와 keyup
동일한 키에 대한 다음 이벤트에서 결합 되므로 이벤트를 하나씩 생성하십시오.
element.dispatchEvent(new KeyboardEvent('keydown',{'key':'Shift'}));
element.dispatchEvent(new KeyboardEvent('keyup',{'key':'Shift'}));
관심있는 사람들은 실제로 키보드 입력 이벤트를 안정적으로 다시 만들 수 있습니다. 입력 영역에서 텍스트를 변경하려면 (커서 또는 입력 문자를 통해 페이지 이동) DOM 이벤트 모델을 밀접하게 따라야합니다. http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
모델은 다음을 수행해야합니다.
- 포커스 (대상 세트와 함께 DOM에 배포 됨)
그런 다음 각 캐릭터에 대해
- 키 다운 (DOM에서 디스패치)
- beforeinput (텍스트 영역 또는 입력 인 경우 대상에서 배포 됨)
- 키 누르기 (DOM에서 제공)
- 입력 (텍스트 영역 또는 입력 인 경우 대상에서 발송 됨)
- 변경 (선택한 경우 대상에 배포)
- 키업 (DOM에 제공)
그런 다음 선택적으로 대부분의 경우 :
- 흐림 (대상 세트와 함께 DOM에 배포 됨)
이것은 실제로 값 문장을 수정하지 않고 자바 스크립트를 통해 페이지의 텍스트를 변경하고 자바 스크립트 리스너 / 핸들러를 적절하게 설정합니다. 시퀀스를 엉망으로 만들면 자바 스크립트가 적절한 순서로 실행되지 않고 입력 상자의 텍스트가 변경되지 않거나 선택 사항이 변경되지 않거나 커서가 텍스트 영역의 다음 공간으로 이동하지 않습니다.
불행히도 코드는 NDA 하에서 고용주를 위해 작성되었으므로 공유 할 수는 없지만 가능하지만 각 요소의 전체 키 입력 "스택"을 올바른 순서로 다시 작성해야합니다.
이 접근 방식은 브라우저의 키 코드 값 변경을 지원 합니다 . 출처
var $textBox = $("#myTextBox");
var press = jQuery.Event("keypress");
press.altGraphKey = false;
press.altKey = false;
press.bubbles = true;
press.cancelBubble = false;
press.cancelable = true;
press.charCode = 13;
press.clipboardData = undefined;
press.ctrlKey = false;
press.currentTarget = $textBox[0];
press.defaultPrevented = false;
press.detail = 0;
press.eventPhase = 2;
press.keyCode = 13;
press.keyIdentifier = "";
press.keyLocation = 0;
press.layerX = 0;
press.layerY = 0;
press.metaKey = false;
press.pageX = 0;
press.pageY = 0;
press.returnValue = true;
press.shiftKey = false;
press.srcElement = $textBox[0];
press.target = $textBox[0];
press.type = "keypress";
press.view = Window;
press.which = 13;
$textBox.trigger(press);
그냥 CustomEvent를 사용하십시오
Node.prototype.fire=function(type,options){
var event=new CustomEvent(type);
for(var p in options){
event[p]=options[p];
}
this.dispatchEvent(event);
}
4 전 Ctrl + Z를 시뮬레이트하고 싶습니다
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})
https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js가 도움이되는 라이브러리가 있습니다
어디에서 왔는지 모르겠지만 도움이됩니다. 그것은 추가 .simulate()
로 방법을 window.KeyEvent
간단히와 함께 사용할 수 있도록, KeyEvent.simulate(0, 13)
을 시뮬레이션 enter
또는 KeyEvent.simulate(81, 81)
A에 대한 'Q'
.
https://github.com/ccampbell/mousetrap/tree/master/tests 에서 얻었습니다 .
이것은 나를 위해 일했고 내 textaera의 키 업을 시뮬레이트합니다. 당신은 전체 페이지를 원하는 경우 단지를 넣어 KeySimulation()
에 <body>
이 같은 <body onmousemove="KeySimulation()">
아닌지 onmousemove
후 onmouseover
또는 onload
작품도.
<script>
function KeySimulation()
{
var e = document.createEvent("KeyboardEvent");
if (e.initKeyboardEvent) { // Chrome, IE
e.initKeyboardEvent("keyup", true, true, document.defaultView, "Enter", 0, "", false, "");
} else { // FireFox
e.initKeyEvent("keyup", true, true, document.defaultView, false, false, false, false, 13, 0);
}
document.getElementById("MyTextArea").dispatchEvent(e);
}
</script>
<input type="button" onclick="KeySimulation();" value=" Key Simulation " />
<textarea id="MyTextArea" rows="15" cols="30"></textarea>
다음은 Chrome 및 Chromium에서 작동하는 솔루션입니다 (이러한 플랫폼 만 테스트했습니다). Chrome에 키 코드 처리에 대한 버그 나 자체 접근 방식이 있으므로이 속성을 KeyboardEvent에 별도로 추가해야합니다.
function simulateKeydown (keycode,isCtrl,isAlt,isShift){
var e = new KeyboardEvent( "keydown", { bubbles:true, cancelable:true, char:String.fromCharCode(keycode), key:String.fromCharCode(keycode), shiftKey:isShift, ctrlKey:isCtrl, altKey:isAlt } );
Object.defineProperty(e, 'keyCode', {get : function() { return this.keyCodeVal; } });
e.keyCodeVal = keycode;
document.dispatchEvent(e);
}
단일 행 바닐라 자바 스크립트 웹 관리자가 콘솔 에 복사 + 붙여 넣기 할 준비가되었습니다 (이 녀석은 이미 대부분의 개발자에게 매력적이므로 그를 확인하려고하지 마십시오-그는 싱글이어야합니다.)
var pressthiskey = "q"/* <--- :) !? q for example */;
var e = new Event("keydown");
e.key = pressthiskey;
e.keyCode = e.key.charCodeAt(0);
e.which = e.keyCode;
e.altKey = false;
e.ctrlKey = true;
e.shiftKey = false;
e.metaKey = false;
e.bubbles = true;
document.dispatchEvent(e);
이것이 내가 찾은 것입니다.
function createKeyboardEvent(name, key, altKey, ctrlKey, shiftKey, metaKey, bubbles) {
var e = new Event(name)
e.key = key
e.keyCode = e.key.charCodeAt(0)
e.which = e.keyCode
e.altKey = altKey
e.ctrlKey = ctrlKey
e.shiftKey = shiftKey
e.metaKey = metaKey
e.bubbles = bubbles
return e
}
var name = 'keydown'
var key = 'a'
var event = createKeyboardEvent(name, key, false, false, false, false, true)
document.addEventListener(name, () => {})
document.dispatchEvent(event)
질문에 키 누르기를 시뮬레이션하는 자바 스크립트 방법이 필요하다는 것을 알고 있습니다. 그러나 jQuery를 사용하는 사람들을 위해 :
var e = jQuery.Event("keypress");
e.which = 13 //or e.keyCode = 13 that simulates an <ENTER>
$("#element_id").trigger(e);
사용자가 문제의 키를 누르 자마자 그 참조를 저장하고 다른 HTML 요소에서 사용할 수 있습니다.
EnterKeyPressToEmulate<input class="lineEditInput" id="addr333_1" type="text" style="width:60%;right:0%;float:right" onkeydown="keyPressRecorder(event)"></input>
TypeHereToEmulateKeyPress<input class="lineEditInput" id="addr333_2" type="text" style="width:60%;right:0%;float:right" onkeydown="triggerKeyPressOnNextSiblingFromWithinKeyPress(event)">
Itappears Here Too<input class="lineEditInput" id="addr333_3" type="text" style="width:60%;right:0%;float:right;" onkeydown="keyPressHandler(event)">
<script>
var gZeroEvent;
function keyPressRecorder(e)
{
gZeroEvent = e;
}
function triggerKeyPressOnNextSiblingFromWithinKeyPress(TTT)
{
if(typeof(gZeroEvent) != 'undefined') {
TTT.currentTarget.nextElementSibling.dispatchEvent(gZeroEvent);
keyPressHandler(TTT);
}
}
function keyPressHandler(TTT)
{
if(typeof(gZeroEvent) != 'undefined') {
TTT.currentTarget.value+= gZeroEvent.key;
event.preventDefault();
event.stopPropagation();
}
}
</script>
자체 이벤트를 생성하면 keyCode를 설정할 수 있습니다. dispatchEvent 작업 이후의 대상을 무시하고 실제 키보드 이벤트에서 기존 매개 변수를 복사 할 수 있습니다.
ta = new KeyboardEvent('keypress',{ctrlKey:true,key:'Escape'})
TypeScript가 지원되는 기본 JavaScript 솔루션 :
keyCode 또는 사용중인 특성을 입력하고 KeyboardEventInit에 캐스트하십시오.
예
const event = new KeyboardEvent("keydown", {
keyCode: 38,
} as KeyboardEventInit);
일이 점점의 중요한 부분은 그것을 실현하는 것입니다 charCode
, keyCode
그리고 which
하는 모든 방법을 사용되지 . 따라서 키 누름 이벤트를 처리 하는 코드 가이 세 가지 중 하나를 사용하는 경우 가짜 응답을받습니다 (예 : 기본값 0).
와 같이 사용되지 않는 방법으로 키 누르기 이벤트에 액세스하는 한 key
괜찮습니다.
완료를 위해 이벤트를 트리거하기위한 기본 Javascript 코드를 추가했습니다.
const rightArrowKey = 39
const event = new KeyboardEvent('keydown',{'key':rightArrowKey})
document.dispatchEvent(event)
'Programming' 카테고리의 다른 글
자식 커밋 및 태그를 동시에 푸시 (0) | 2020.03.05 |
---|---|
kotlin 소스 파일을 Java 소스 파일로 변환하는 방법 (0) | 2020.03.04 |
Android : 프로그래밍 방식으로 .apk 설치 (0) | 2020.03.04 |
UI 용어 : 로그온 및 로그인 (0) | 2020.03.04 |
반품, 반품 없음, 전혀 반품 없음? (0) | 2020.03.04 |