ตรวจสอบว่าเหตุการณ์ถูกเรียกโดยมนุษย์


140

ฉันมีตัวจัดการติดอยู่กับเหตุการณ์และฉันต้องการให้ดำเนินการเฉพาะเมื่อมันถูกกระตุ้นโดยมนุษย์ไม่ใช่โดยวิธีการทริกเกอร์ () ฉันจะบอกความแตกต่างได้อย่างไร

ตัวอย่างเช่น,

$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

คำตอบ:


212

คุณสามารถตรวจสอบe.originalEvent: หากมีการกำหนดว่าคลิกนั้นเป็นมนุษย์

ดูซอที่http://jsfiddle.net/Uf8Wv/

$('.checkbox').change(function(e){
  if (e.originalEvent !== undefined)
  {
    alert ('human');
  }
});

ตัวอย่างของฉันในซอ:

<input type='checkbox' id='try' >try
<button id='click'>Click</button>

$("#try").click(function(event) {
    if (event.originalEvent === undefined) {
        alert('not human')
    } else {
        alert(' human');
    }


});

$('#click').click(function(event) {
    $("#try").click();
});

1
@Nicola เอกสารนี้มีอยู่ทุกที่หรือไม่?
Šime Vidas

@ เวลาฉันไม่รู้ แต่ฉันคิดว่ามันเป็นมาตรฐาน ดูที่นี่: api.jquery.com/category/events/event-object
Nicola Peluchetti

@ Nicola ฉันเห็นว่ามันเป็นสิ่งที่ jQuery jQuery เก็บวัตถุเหตุการณ์ดั้งเดิมไว้ภายในคุณสมบัตินี้ แต่คุณหมายถึงอะไรคุณไม่รู้ คุณเพิ่งให้ลิงก์ไปยังเอกสารประกอบ:)
Šime Vidas

1
ดูเหมือนว่าคุณสามารถใช้event.isTrigger
avoliva

1
@ Anurag ฉันพบปัญหาเดียวกันในตอนนี้ ดูเหมือนว่า jQuery จะเติมข้อมูลoriginalEventเมื่อมีการเรียกใช้เหตุการณ์DOM.click()แต่คุณสามารถใช้$($("#try")[0]).click();ซึ่งเป็น clunky แต่ใช้งานได้
Daniel Garrett

19

ตรงไปข้างหน้ามากกว่าด้านบนจะเป็น:

$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

นี่คือคำตอบที่ดีที่สุด สำหรับคำอธิบายโปรดดูที่: stackoverflow.com/questions/10704168/…
jaredjacobs

3
ในขณะที่สิ่งนี้ดึงดูดและน่าเป็นไปได้ในทางปฏิบัติโปรดทราบว่าผู้พัฒนา jQuery ไม่ต้องการที่isTriggerจะเปลี่ยนเป็น API สาธารณะณ เวลานี้นี้
Jon

7

ผมคิดว่าวิธีเดียวที่จะทำเช่นนี้จะส่งผ่านพารามิเตอร์เพิ่มเติมเกี่ยวกับtriggerการโทรตามเอกสาร

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

ตัวอย่าง: http://jsfiddle.net/wG2KY/


1
คุณสามารถตรวจสอบสถานที่ให้บริการดั้งเดิมเหตุการณ์ของวัตถุเหตุการณ์: ถ้าเหตุการณ์ไม่ได้มาจากการคลิกก็ไม่ได้กำหนด
Nicola Peluchetti

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

1
ด้วยเหตุผลบางอย่าง event.originalEvent ไม่ทำงานสำหรับฉัน (เพิ่งเก็บไว้ 1) เมื่อใช้ตัวจัดการ 'คลิก' ของ Zepto ดังนั้นฉันจึงลองวิธีแก้ปัญหาข้างต้น ทำงานเหมือนจับใจ
Larrydx

7

คำตอบที่ยอมรับไม่ได้สำหรับฉัน 6 ปีแล้วที่ jQuery มีการเปลี่ยนแปลงมากมายตั้งแต่นั้นมา

ตัวอย่างเช่นevent.originalEventคืนค่าเสมอtrueด้วย jQuery 1.9.x ฉันหมายถึงวัตถุมีอยู่เสมอ แต่เนื้อหานั้นแตกต่างกัน

ผู้ที่ใช้ jQuery เวอร์ชันที่ใหม่กว่าสามารถลองได้ ใช้งานได้กับ Chrome, Edge, IE, Opera, FF

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}

3

เบราว์เซอร์ส่วนใหญ่ในปัจจุบันรองรับเหตุการณ์ isTrusted :

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

จากเอกสาร :

นี้ IsTrustedอ่านอย่างเดียวทรัพย์สินของEventอินเตอร์เฟซที่เป็นBoolean ที่เป็นจริงเมื่อมีเหตุการณ์ที่ถูกสร้างขึ้นโดยการกระทำของผู้ใช้และเท็จ เมื่อมีเหตุการณ์ที่ถูกสร้างหรือแก้ไขโดยสคริปต์หรือส่งผ่าน EventTarget.dispatchEvent ()


0

คุณสามารถใช้ onmousedown เพื่อตรวจจับการคลิกเมาส์และทริกเกอร์ () โทร


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

0

ฉันจะคิดถึงความเป็นไปได้ที่คุณจะตรวจสอบตำแหน่งของเมาส์เช่น:

  • คลิก
  • รับตำแหน่งเมาส์
  • ซ้อนทับกันของปุ่ม
  • ...

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

0

ในกรณีที่คุณมีการควบคุมของรหัสของคุณทุกสายไม่มีคนต่างด้าวกว่า$(input).focus()setFocus()

ใช้ตัวแปรทั่วโลกเป็นวิธีที่ถูกต้องสำหรับฉัน

var globalIsHuman = true;

$('input').on('focus', function (){
    if(globalIsHuman){
        console.log('hello human, come and give me a hug');
    }else{
        console.log('alien, get away, i hate you..');
    }
    globalIsHuman = true;
});

// alien set focus
function setFocus(){
    globalIsHuman = false;
    $('input').focus();
}
// human use mouse, finger, foot... whatever to touch the input

หากเอเลี่ยนบางคนยังต้องการโทร$(input).focus()จากดาวเคราะห์ดวงอื่น ขอให้โชคดีหรือตรวจสอบคำตอบอื่น ๆ


การทำเช่นนี้เป็นการป้องกันไม่ให้ผู้อื่นโทรเท่านั้น แต่setFocus()จะไม่ป้องกันไม่ให้บุคคลเรียกเหตุการณ์การโฟกัส การไม่เขียนsetFocus()เลยจะป้องกันไม่ให้ผู้คนเรียกมันดังนั้นฉันจึงไม่เห็นประโยชน์ ในความเป็นจริงผู้คนยังสามารถโทร$('input').focus()และผ่านมันได้
Rob

ว้าวครั้งแรกที่ฉันมีคนแสดงความคิดเห็นทันทีหลังจากที่ฉันตอบคำถามฉันจะอัปเดตคำตอบ
vanduc1102

หากคุณกำลังทำงานในสภาพแวดล้อมที่ปิดสนิทโดยไม่มีสคริปต์บุคคลที่สาม / อื่น ๆ สิ่งนี้จะใช้ได้ในโลกที่สมบูรณ์แบบ อย่างไรก็ตามแอปพลิเคชันที่ใช้งานได้จริงส่วนใหญ่มีไว้สำหรับไซต์ลูกค้าที่มีปลั๊กอินและสคริปต์ทุกประเภทที่เพิ่มเข้ามาซึ่งอาจเรียกได้ว่าโฟกัสได้เป็นอย่างดี สิ่งหนึ่งที่อาจช่วยได้คือการห่อโค้ดของคุณ (และโค้ดใด ๆ ที่จำเป็นต้องเรียกใช้ฟังก์ชันนั้น) ในฟังก์ชันที่กำหนดขอบเขตดังนี้: (function(){/*your code here*/})();สิ่งนี้จะทำให้ฟังก์ชั่น setFocus ปลอดภัยจากการถูกเรียกใช้และบูลีนจากการเปลี่ยนแปลงโดยสคริปต์ภายนอก
Xandor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.