เป็นไปได้หรือไม่ที่จะจำลองเหตุการณ์การกดปุ่มแบบเป็นโปรแกรม


380

เป็นไปได้หรือไม่ที่จะจำลองเหตุการณ์การกดปุ่มในโปรแกรมโดยใช้ JavaScript?


2
คุณช่วยอธิบาย 'จำลอง' ได้ไหม? เป็นเป้าหมายของคุณในการทดสอบเว็บไซต์ของคุณหรือเพื่อให้สามารถใช้งานฟังก์ชั่น onclick, onmousedown และอื่น ๆ ของลิงค์ที่ให้มาได้หรือไม่?
เปาโล

คำตอบ:


180

เวอร์ชันที่ไม่ใช่ 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);

8
Philip ดูเหมือนว่ารหัสที่ฉันต้องการ แต่ฉันต้องการส่งเหตุการณ์ keypress ไปที่ textarea ฉันพยายามที่จะแก้ไขรหัสของคุณเพื่อส่งไปยัง textarea แต่มันไม่ทำงานในโครเมียมอย่างน้อยความคิดใด ๆ ที่อาจจะผิด? นี่คือ jsfiddle ที่ฉันทำขึ้นเพื่อสาธิต: jsfiddle.net/szmJu
user280109

4
ปรากฎว่ามีข้อผิดพลาดใน Chromium ด้วย KeyboardEvent dispatching ตรวจสอบหัวข้อนี้สำหรับรายละเอียดเพิ่มเติม: stackoverflow.com/questions/10455626/...
Philip Nuzhnyy

27
keyCodeเป็น 0 เสมอและฉันไม่สามารถเปลี่ยนได้
Ata Iravani

9
ปรากฏว่ามีข้อผิดพลาดในโครเมี่ยมที่ทำให้event.whichจะต้องมีเสมอเมื่อใช้0 document.createEvent("KeyboardEvent")@lluft แบ่งปันรายละเอียดและวิธีแก้ปัญหาซึ่งใช้งานได้สำหรับฉันในความคิดเห็นนี้ในเธรดอื่น โดยทั่วไปคุณต้องใช้document.createEvent('Event')เพื่อสร้างเหตุการณ์ทั่วไปจากนั้นตั้งค่าชนิดเป็นkeydownและให้keyCodeคุณสมบัติเท่ากับ charcode ของคีย์
A-Diddy

8
ดูเหมือนว่าคุณลักษณะนี้จะถูกลบโดยในขณะนี้ MDN ได้พิจารณาว่าเลิกใช้ไประยะหนึ่งแล้ว
Tacticus

72

หากคุณตกลงที่จะใช้ 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");
});

สวัสดีครับสิ่งที่ผมหมายถึงคือ: 1. ลงทะเบียนเป็นเหตุการณ์สำคัญ (ตัวอักษร E รันบาง JS) 2. จากวิธีการอื่น ๆ ที่ฉันต้องการที่จะ programatically กด e ตัวอักษร)
สีน้ำตาล

9
มันทำงานไม่ถูกต้องใน Chrome ขออภัย jQuery สร้างกิจกรรม แต่ไม่มีแอตทริบิวต์ที่สำคัญ - ซึ่ง charCode, keyCode
hamczu

4
@ แทนนี่เป็นไปไม่ได้ ดูคำตอบของฉันสำหรับเหตุผลที่อยู่เบื้องหลัง
Lorenz Lo Sauer


51

สิ่งที่คุณสามารถทำได้คือโปรแกรมเรียกฟัง KeyEventโดยการยิงkeyevents มันสมเหตุสมผลที่จะอนุญาตให้ทำสิ่งนี้จากมุมมองด้านความปลอดภัย เมื่อใช้ความสามารถนี้คุณจะสามารถใช้รูปแบบการสังเกตการณ์ทั่วไปได้ คุณสามารถเรียกวิธีนี้ "จำลอง"

ด้านล่างเป็นตัวอย่างของวิธีการทำให้สำเร็จในมาตรฐาน 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...
  }
}

ตัวอย่างนี้ดัดแปลงมาจาก: 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] ที่จะกระตุ้นให้เกิดสิ่งสำคัญในการออกจากกล่องเบราว์เซอร์ และผู้ค้าเบราว์เซอร์รายใหญ่ทั้งหมดจะยึดมั่นในแนวคิดความปลอดภัยนั้น

สำหรับปลั๊กอินเช่น Adobe Flash - ซึ่งจะขึ้นอยู่กับ NPAPI- และอนุญาตให้ผ่าน sandbox ที่คนเหล่านี้ได้รับการวางขั้นตอนออก ; Firefox

คำอธิบายโดยละเอียด:

คุณทำไม่ได้และคุณจะต้องไม่ใช้เพื่อเหตุผลด้านความปลอดภัย (ตามที่ Pekka ระบุไว้แล้ว) คุณจะต้องมีการโต้ตอบกับผู้ใช้เสมอ นอกจากนี้ให้จินตนาการถึงโอกาสที่ผู้ค้าเบราว์เซอร์จะถูกฟ้องร้องจากผู้ใช้เนื่องจากเหตุการณ์แป้นพิมพ์แบบโปรแกรมต่าง ๆ จะนำไปสู่การปลอมแปลงการโจมตี

ดูโพสต์นี้สำหรับทางเลือกและรายละเอียดเพิ่มเติม มีการคัดลอกและวางที่ใช้แฟลชเสมอ นี่เป็นสง่า ตัวอย่างเช่น ในขณะเดียวกันก็เป็นเครื่องยืนยันได้ว่าทำไมเว็บถึงย้ายออกจากผู้ขายปลั๊กอิน

มีแนวคิดการรักษาความปลอดภัยที่คล้ายกันซึ่งนำไปใช้ในกรณีของนโยบายการเลือกใช้ CORS ในการเข้าถึงเนื้อหาระยะไกลโดยทางโปรแกรม

คำตอบคือ
ไม่มีทางที่จะปุ่มทริกเกอร์อินพุตโปรแกรมในสภาพแวดล้อมที่เบราว์เซอร์ sandboxed ภายใต้สถานการณ์ปกติไม่เป็น

ด้านล่าง:ฉันไม่ได้บอกว่ามันจะเป็นไปไม่ได้ในอนาคตภายใต้โหมดเบราว์เซอร์พิเศษและ / หรือสิทธิพิเศษไปสู่เป้าหมายสุดท้ายของการเล่นเกมหรือประสบการณ์ของผู้ใช้ที่คล้ายกัน แต่ก่อนที่จะเข้าโหมดดังกล่าวผู้ใช้จะถูกถามสิทธิ์และความเสี่ยงที่คล้ายกับรูปแบบเต็มหน้าจอ API

มีประโยชน์:ในบริบทของ KeyCodes เครื่องมือนี้และการจับคู่รหัสจะมีประโยชน์

การเปิดเผยข้อมูล:คำตอบขึ้นอยู่กับคำตอบที่นี่


ดังนั้นด้วย JavaScript KeyboardEvent API ( developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent ) คุณสามารถจำลองเหตุการณ์สำคัญได้เช่นพูดว่ากดคีย์ แต่ไม่สามารถมีเอฟเฟกต์การกดคีย์ได้ เช่นเขียนตัวอักษร 'a', 'b', 'c'? หากเป็นไปได้การเขียนตัวอักษรพื้นฐานเหล่านี้ไม่ใช่ปัญหาด้านความปลอดภัย แต่ฉันเข้าใจว่าควรห้ามใช้คีย์พิเศษเช่น "F12" หรือชุดค่าผสมเช่น "Alt + F4"
baptx

1
นี่คือสิ่งที่ฉันได้รับเมื่อฉันเรียกใช้ jQuery ของคุณใน Chrome: การอ้างอิงที่ไม่ได้บันทึกข้อผิดพลาด: ไม่ได้กำหนดตัวอักษร
Jayden Lawson

29

คุณสามารถส่งเหตุการณ์แป้นพิมพ์บนองค์ประกอบเช่นนี้

element.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));

12
ฉันคิดว่าคำตอบควรพูดถึงความจริงที่ว่าจัดส่งในเหตุการณ์ js ไม่ปรับปรุงเนื้อหาอินพุต
คิริลล์ Reznikov

5
Firefox รุ่นล่าสุดไม่ทันสมัยใช่ไหม
emix

ดูเหมือนว่าkeypressจะถูกคิดค่าเสื่อมราคาโดยใช้keydownแทน -> developer.mozilla.org/en-US/docs/Web/Events/keypress
JMT2080AD

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันด้วย Chrome Embedded ตามที่ฉันต้องการ
เปาโลFrança Lacerda

25

คุณสามารถใช้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 () คุณอาจต้องการอ่านสิ่งนั้นรวมถึงเอกสารสำหรับ createEvent () และ initKeyEvent ()


16
หมายเหตุ: นี่รองรับเบราว์เซอร์ Gecko เท่านั้น
lhunath

3
ตุ๊กแกและเบราว์เซอร์อื่น ๆ ที่ไม่เห็นด้วยกับว่าจะใช้หรือinitKeyEvent initKeyboardEvent()ทั้งสองจะเลิกในความโปรดปรานของการใช้KeyboardEvent ()คอนสตรัค
jkmartindale

21

คุณสามารถสร้างและส่งเหตุการณ์แป้นพิมพ์และพวกเขาจะทริกเกอร์ตัวจัดการเหตุการณ์ที่ลงทะเบียนที่เหมาะสมอย่างไรก็ตามพวกเขาจะไม่สร้างข้อความใด ๆหากส่งไปยังองค์ประกอบการป้อนข้อมูลเช่น

ในการจำลองการป้อนข้อความอย่างสมบูรณ์คุณจะต้องสร้างลำดับเหตุการณ์แป้นพิมพ์รวมทั้งตั้งค่าข้อความขององค์ประกอบอินพุตอย่างชัดเจน ลำดับเหตุการณ์ขึ้นอยู่กับว่าคุณต้องการจำลองการป้อนข้อความแบบละเอียดมากเพียงใด

รูปแบบที่ง่ายที่สุดคือ:

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

15

ในบางกรณีkeypressเหตุการณ์ไม่สามารถให้ funtionality ที่ต้องการ จากmozilla docsเราจะเห็นได้ว่าฟีเจอร์นั้นเลิกใช้แล้ว:

ไม่แนะนำคุณลักษณะนี้อีกต่อไป แม้ว่าเบราว์เซอร์บางตัวอาจยังคงสนับสนุนเบราว์เซอร์นั้นอาจถูกลบออกจากมาตรฐานเว็บที่เกี่ยวข้องแล้วอาจอยู่ระหว่างการตกหล่นหรืออาจถูกเก็บไว้เพื่อความเข้ากันได้เท่านั้น หลีกเลี่ยงการใช้งานและอัปเดตรหัสที่มีอยู่ถ้าเป็นไปได้ ดูตารางความเข้ากันได้ที่ด้านล่างของหน้านี้เพื่อเป็นแนวทางในการตัดสินใจของคุณ โปรดทราบว่าคุณลักษณะนี้อาจหยุดทำงานเมื่อใดก็ได้

ดังนั้นเนื่องจากkeypressเหตุการณ์ถูกรวมเข้าด้วยกันจากทั้งสองเหตุการณ์จึงทำให้เกิดเหตุการณ์keydownและต่อไปนี้keyupสำหรับคีย์เดียวกันเพียงแค่สร้างเหตุการณ์แบบหนึ่งต่อหนึ่ง:

element.dispatchEvent(new KeyboardEvent('keydown',{'key':'Shift'}));
element.dispatchEvent(new KeyboardEvent('keyup',{'key':'Shift'}));

13

สร้างจากคำตอบจาก 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');
});

คุณสามารถผลักดันสิ่งนี้เพิ่มเติมและปล่อยให้มันไม่เพียง แต่จำลองเหตุการณ์ แต่จริง ๆ แล้วแทรกอักขระ (ถ้าเป็นองค์ประกอบอินพุต) อย่างไรก็ตามมี gotcha ข้ามเบราว์เซอร์จำนวนมากเมื่อพยายามทำเช่นนั้น ดีกว่าใช้ปลั๊กอินที่ซับซ้อนมากขึ้นเช่นSendKeys


1
SendKeys ไม่จำลองการกดปุ่มเพียงแค่อัดค่าลงในองค์ประกอบเป้าหมาย
Ahmed Masud

2
ไม่ได้จำลองปุ่มกดฮาร์ดแวร์เพียงแค่เรียกฟังก์ชั่นปุ่มกด binded
Codebeat

8

สำหรับผู้ที่สนใจคุณสามารถสร้างกิจกรรมป้อนข้อมูลด้วยแป้นพิมพ์จริง ๆ ได้อย่างน่าเชื่อถือ ในการเปลี่ยนข้อความในพื้นที่ป้อนข้อมูล (เลื่อนเคอร์เซอร์หรือหน้าผ่านอักขระป้อนข้อมูล) คุณต้องติดตามรูปแบบเหตุการณ์ DOM อย่างใกล้ชิด: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents

รูปแบบที่ควรทำ:

  • โฟกัส (จัดส่งบน DOM พร้อมชุดเป้าหมาย)

จากนั้นสำหรับตัวละครแต่ละตัว:

  • keydown (จัดส่งบน DOM)
  • beforeinput (ส่งไปที่เป้าหมายหากเป็น textarea หรือ input)
  • keypress (จัดส่งบน DOM)
  • อินพุต (ส่งไปที่เป้าหมายหากเป็น textarea หรืออินพุต)
  • เปลี่ยน (ส่งไปที่เป้าหมายหากมีการเลือก)
  • keyup (จัดส่งบน DOM)

จากนั้นเลือกมากที่สุด:

  • เบลอ (จัดส่งบน DOM พร้อมชุดเป้าหมาย)

นี่เป็นการเปลี่ยนแปลงข้อความในหน้าเว็บผ่านทางจาวาสคริปต์ (โดยไม่ต้องแก้ไขข้อความสั่งค่า) และตั้งค่าตัวรับฟัง / ตัวจัดการจาวาสคริปต์อย่างเหมาะสม หากคุณทำผิดลำดับ javascript จะไม่ทำงานตามลำดับที่เหมาะสมข้อความในกล่องอินพุตจะไม่เปลี่ยนแปลงการเลือกจะไม่เปลี่ยนแปลงมิฉะนั้นเคอร์เซอร์จะไม่ย้ายไปยังพื้นที่ถัดไปในพื้นที่ข้อความ

น่าเสียดายที่รหัสถูกเขียนขึ้นสำหรับนายจ้างภายใต้ NDA ดังนั้นฉันจึงไม่สามารถแบ่งปันได้ แต่เป็นไปได้อย่างแน่นอน แต่คุณต้องสร้าง "สแต็ค" ป้อนคีย์ทั้งหมดสำหรับแต่ละองค์ประกอบตามลำดับที่ถูกต้อง


8
NDA สำหรับ JavaScript? จริงๆ? อย่างไรก็ตามสำหรับตัวละครแต่ละตัวที่อัลกอริทึมของคุณผิดการจำลองเหตุการณ์ "ป้อนข้อมูล" จะเพิ่มข้อความโดยไม่ต้องผ่านการกดคีย์ทั้งหมดเหตุการณ์คีย์อัพหรือเหตุการณ์อื่น ๆ ปัญหาคือวิธีการจัดการเหตุการณ์ keypress หลายรายการ ฯลฯ เช่นการกดปุ่ม "a" และคาดหวังว่า "aaaaaaa" หลายครั้ง
Akash Kava

1
เคล็ดลับคือการยิงคีย์ดาวน์อินพุตจากนั้นคีย์อัพ หากคุณต้องการหลาย ๆ "aaaaaa" ยังคงยิงเหตุการณ์อินพุต และอย่าบอกใคร
เทรเวอร์

4
ฉันลองสิ่งนี้ แต่ดูเหมือนว่าจะไม่ทำงานอย่างสมบูรณ์: ฉันสามารถทริกเกอร์เหตุการณ์สำหรับปุ่ม Enter, Backspace หรือปุ่มลูกศร แต่ไม่ใช่ด้วยตัวอักษร ตัวอย่างเช่นฉันไม่สามารถป้อนข้อความด้วยวิธีนี้แม้ว่าฉันจะทำตามคำสั่งของคุณอย่างใกล้ชิด
Tacticus

@Tacticus โดยบังเอิญคุณยังมีตัวอย่างโค้ดสำหรับการเรียกใช้ป้อนตามคำตอบนี้หรือไม่?
Siavas

1
ฉันพยายามทำสิ่งนี้โดยไม่มีโชค
Mason

8

ตั้งแต่ปี 2019 โซลูชันนี้ได้ผลสำหรับฉัน:

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.
  })
);

ฉันใช้สิ่งนี้ในเกมเบราว์เซอร์เพื่อสนับสนุนอุปกรณ์มือถือด้วยปุ่มกดแบบจำลอง

การชี้แจง:รหัสนี้ยื้อkeydownเหตุการณ์เดียวในขณะที่การกดปุ่มจริงจะทำให้เกิดkeydownเหตุการณ์หนึ่ง(หรือหลายเหตุการณ์ถ้ามันถูกเก็บไว้นานกว่า) จากนั้นkeyupเหตุการณ์หนึ่งเมื่อคุณปล่อยกุญแจนั้น หากคุณต้องการkeyupเหตุการณ์เกินไปก็ยังเป็นไปได้ที่จะจำลองkeyupเหตุการณ์ที่เกิดขึ้นโดยการเปลี่ยน"keydown"ไป"keyup"ในข้อมูลโค้ด

documentนอกจากนี้ยังส่งเหตุการณ์ไปยังหน้าเว็บทั้งหมดจึง หากคุณต้องการเพียงองค์ประกอบเฉพาะที่จะได้รับเหตุการณ์คุณสามารถทดแทนdocumentองค์ประกอบที่ต้องการ


1
นี่เป็นทางออกเดียวที่ทำงานกับฉันใน Qt QWebEngine ฟังก์ชั่น runJavascript ขอบคุณ
Maxx

ไม่สนใจเกม Flash อย่างสมบูรณ์ด้วยเหตุผลบางอย่าง (อาจเป็นเพราะ Flash เพิกเฉยต่อทุกสิ่งที่ไม่ได้เป็นTrusted)
hanshenrik

@hanshenrik - ตามจริงถ้าคุณใช้ Flash ในปี 2020 คุณต้องพิจารณาอีกครั้งว่าเครื่องมือใดเหมาะสมที่สุดสำหรับวัตถุประสงค์ของคุณ
เฮลีย์

7

นี้สนับสนุนแนวทางของเบราว์เซอร์เปลี่ยนค่าของรหัสที่สำคัญ แหล่ง

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);

7

เพียงใช้ 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})

ฉันลองใช้รหัสของคุณ ถ้าฉันกดปุ่มฉันจะเข้าฟัง แต่ document.fire ไม่มีผล
ทำเครื่องหมาย

"(" ไม่ใช่ปัญหาฉันแก้ไขได้ในทันทีมันแค่เข้าไปไม่ได้หลังจาก document.fire BTW ฉันกำลังเรียกใช้โดยคลิกที่ไอคอน
ทำเครื่องหมาย

รหัสของฉันเป็นดังนี้: <img src = "settings.svg" height = "22" width = "24" style = "เคอร์เซอร์: ตัวชี้;" ng-click = "openAdminConsole ()"> ใน openAdminConsole () ฉันกำลังทำ document.fire มันไม่ถูกต้องเหรอ?
ทำเครื่องหมาย

4

นี่คือห้องสมุดที่ช่วยได้จริงๆ: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js

ฉันไม่รู้ว่ามาจากไหน แต่มีประโยชน์ จะเพิ่ม.simulate()วิธีการwindow.KeyEventเพื่อให้คุณใช้งานได้ง่ายด้วยKeyEvent.simulate(0, 13)สำหรับการจำลองenterหรือหาKeyEvent.simulate(81, 81)'Q'

ผมได้รับมันที่https://github.com/ccampbell/mousetrap/tree/master/tests


4

สิ่งนี้ใช้งานได้สำหรับฉันและมันจำลองปุ่มกดสำหรับ 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>

2
ถูกเตือนว่าinitKeyboardEventเลิกใช้แล้ว ( ที่มา )
radiovisual

4

มันเป็นแถวเดียวครั้งเดียวเนื่องจากการใช้งานง่ายในบริบทของคอนโซล แต่ก็ยังคงมีประโยชน์

    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);

2

นี่คือโซลูชันที่ใช้งานได้ใน 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);
}

1

นี่คือสิ่งที่ฉันจัดการเพื่อค้นหา:

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)

1

Native JavaScript พร้อมโซลูชันที่รองรับ TypeScript:

พิมพ์ keyCode หรือคุณสมบัติใด ๆ ที่คุณใช้และส่งไปยัง KeyboardEventInit

ตัวอย่าง

const event = new KeyboardEvent("keydown", {
          keyCode: 38,
        } as KeyboardEventInit);

1

นั่นคือสิ่งที่ฉันลองกับ js / typescript ใน chrome ขอบคุณ คำตอบสำหรับแรงบันดาลใจนี้

const x = document.querySelector('input');

const keyboardEvent = new KeyboardEvent("keypress", { bubbles: true });
Object.defineProperty(keyboardEvent, "charCode", {
  get() {
    return 13;
  },
});
x.dispatchEvent(keyboardEvent);

0

ทันทีที่ผู้ใช้กดปุ่มที่เป็นปัญหาคุณสามารถจัดเก็บการอ้างอิงถึงแม้กระทั่งและใช้มันในองค์ประกอบอื่น ๆ 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'})

0

ฉันรู้ว่าคำถามถามหาวิธีจาวาสคริปต์ในการจำลองปุ่มกด แต่สำหรับผู้ที่กำลังมองหาวิธี jQuery ในการทำสิ่งต่าง ๆ :

var e = jQuery.Event("keypress");
e.which = 13 //or e.keyCode = 13 that simulates an <ENTER>
$("#element_id").trigger(e); 

0

ส่วนที่สำคัญของการได้รับการทำงานก็คือการตระหนักว่าcharCode, keyCodeและwhichมีวิธีการเลิกทั้งหมด ดังนั้นหากประมวลผลรหัสเหตุการณ์การกดปุ่มใช้สามอย่างใดอย่างหนึ่งมันจะได้รับคำตอบปลอม (เช่นค่าเริ่มต้น 0)

ตราบใดที่คุณเข้าถึงเหตุการณ์การกดปุ่มด้วยวิธีที่ไม่ได้รับการปฏิเสธเช่นkeyคุณควรจะตกลง

เมื่อเสร็จแล้วฉันได้เพิ่มรหัส Javascript พื้นฐานสำหรับการเรียกใช้เหตุการณ์:

const rightArrowKey = 39
const event = new KeyboardEvent('keydown',{'key':rightArrowKey})
document.dispatchEvent(event)

0

ฉันต้องการจำลองการกด 'Tab' ... การตอบคำถามของ Trevor เราจะเห็นว่ามีการกดปุ่มพิเศษเช่น 'tab' แต่เราไม่เห็นผลลัพธ์ที่แท้จริงซึ่งกด 'tab' จะมี .. .

ลองด้วยการส่งเหตุการณ์เหล่านี้สำหรับ 'activeElement' เช่นเดียวกับวัตถุเอกสารทั่วโลกทั้งสอง - รหัสสำหรับทั้งสองเพิ่มด้านล่าง;

ตัวอย่างด้านล่าง:

var element = document.getElementById("firstInput");

document.addEventListener("keydown", function(event) {

  console.log('we got key:', event.key, '  keyCode:', event.keyCode, '  charCode:', event.charCode);

  /* enter is pressed */
  if (event.keyCode == 13) {
    console.log('enter pressed:', event);

    setTimeout(function() {
      /*  event.keyCode = 13;  event.target.value += 'b';  */

      theKey = 'Tab';
      var e = new window.KeyboardEvent('focus', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keydown', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('beforeinput', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keypress', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('input', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('change', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
      e = new window.KeyboardEvent('keyup', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.activeElement.dispatchEvent(e);
    }, 4);

    setTimeout(function() {
      theKey = 'Tab';
      var e = new window.KeyboardEvent('focus', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keydown', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('beforeinput', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keypress', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('input', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('change', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
      e = new window.KeyboardEvent('keyup', {
        bubbles: true,
        key: theKey,
        keyCode: 9,
        charCode: 0,
      });
      document.dispatchEvent(e);
    }, 100);



  } else if (event.keyCode != 0) {
    console.log('we got a non-enter press...: :', event.key, '  keyCode:', event.keyCode, '  charCode:', event.charCode);
  }

});
<h2>convert each enter to a tab in JavaScript... check console for output</h2>
<h3>we dispatchEvents on the activeElement... and the global element as well</h3>

<input type='text' id='firstInput' />
<input type='text' id='secondInput' />

<button type="button" onclick="document.getElementById('demo').innerHTML = Date()">
    Click me to display Date and Time.</button>
<p id="demo"></p>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.