>

Chrome에서 자바 스크립트를 사용하여 키보드 이벤트를 페이지에 실행하려고합니다. Firefox에서 작동하는 방식이 있습니다 :

pressKey = function(key, shift) {
  var evt = document.createEvent('KeyboardEvent');
  evt.initKeyEvent("keypress", false, true, null, false, false,
                   shift, false, keyCode(key), key.charCodeAt(0));
  document.dispatchEvent(evt);
}

여기서 key는 원하는 키이고 keyCode는 소문자를 대문자로 바꾸고 charCodeAt ()를 호출합니다.

내 문제는 Safari/Chrome의 이벤트에 initKeyEvent가 아니라 initKeyboardEvent가 있다는 것입니다. 내가 알 수있는 주요 차이점은 키 코드와 키 문자를 전달하는 대신 키를 키 코드 (유니 코드 문자처럼 보임)로 전달해야한다는 것입니다. 그럼에도 불구하고 여전히 작동하도록 할 수는 없습니다.

또한 에 설명 된 JQuery 접근 방식을 시도했습니다. 여기 성공하지 못했습니다.

수정 : 좀 더 디버깅했는데 Chrome의 이벤트가 리스너를 트리거하는 것처럼 보이지만 keyCode/charCode는 항상 0입니다. evt.keyCode 또는 evt.charCode를 설정하지 않고 시도했습니다.

  • 답변 # 1

    저는이 기본 스 니펫을 버리고 싶습니다. Chrome에서 작동하며 Paul Irish가 언급 한 해킹을 기반으로합니다.
    키 코드 대신 charCode를 사용하지만 (특정 상황에서 유용 할 수 있음) 원하는 경우 키 코드에 맞게 조정하십시오.

    var keyboardEvent = new KeyboardEvent('keypress', {bubbles:true}); 
    Object.defineProperty(keyboardEvent, 'charCode', {get:function(){return this.charCodeVal;}}); 
    keyboardEvent.charCodeVal = [your char code];
    document.body.dispatchEvent(keyboardEvent);
    
    

  • 답변 # 2

    생성 된 이벤트에는 KeyIdentifier 만 포함되어 있지만 브라우저 소스 코드에서 볼 수 있듯이 keyCode/charCode는없는 Webkit의 버그로이 문제를 추적했습니다. 이 문제를 해결하기위한 패치가있는 것 같습니다. 그래서 나는 이것이 더 이상 올바른 질문이 아니라고 생각합니다 ...

  • 답변 # 3

    필요에 따라 TextEvent가 작동 할 수 있습니다. (크롬의 경우 내 필요에 따라 작동했습니다. 브라우저 간 테스트는 거치지 않았지만 크롬에 대한 문제였습니다.)

    // get a reference to the DOM element you want to affect
    var input = document.getElementsByTagName('input')[0];
    // create a TextEvent
    var textEvent = document.createEvent('TextEvent');
    // initialize the TextEvent
    textEvent.initTextEvent('textInput', true, true, null, String.fromCharCode(13)+"\r\n", 9, "en-US");
    // dispatch ('fire') the TextEvent
    input.dispatchEvent(textEvent);
    
    

  • 답변 # 4

    createEvent('Event') 를 사용하여 웹킷 버그를 해결할 수 있습니다   createEvent('KeyboardEvent') 보다는 그런 다음 keyCode 를 지정하십시오.  재산. 이 답변과이 예를 참조하십시오.

관련 자료

  • 이전 c# - WCF 서비스를 비동기 적으로 호출하는 방법은 무엇입니까?
  • 다음 c++ - 다중 상속을 사용할 때 어떻게 죽음의 다이아몬드를 피할 수 있습니까?