พิจารณาทำเครื่องหมายตัวจัดการเหตุการณ์เป็น 'แฝง' เพื่อให้หน้าตอบสนองได้ดีขึ้น


217

ฉันกำลังใช้ฆ้อนสำหรับลากและมันก็เริ่มขาดหายไปเมื่อโหลดสิ่งอื่น ๆ เนื่องจากข้อความเตือนนี้บอกฉัน

การจัดการกิจกรรมอินพุต 'touchstart' ล่าช้าสำหรับ X ms เนื่องจากเธรดหลักไม่ว่าง พิจารณาทำเครื่องหมายตัวจัดการเหตุการณ์เป็น 'แฝง' เพื่อให้หน้าตอบสนองได้ดีขึ้น

ดังนั้นฉันจึงพยายามเพิ่ม 'passive' ให้กับผู้ฟังเช่นนั้น

Hammer(element[0]).on("touchstart", function(ev) {
  // stuff
}, {
  passive: true
});

แต่ฉันยังคงได้รับคำเตือนนี้

คำตอบ:


264

สำหรับผู้ที่ได้รับคำเตือนนี้เป็นครั้งแรกมันเป็นเพราะคุณสมบัติที่ทันสมัยที่เรียกว่าPassive Event Listenersซึ่งมีการใช้งานในเบราว์เซอร์ค่อนข้างเร็ว ๆ นี้ (ฤดูร้อนปี 2559) จากhttps://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md :

ฟังเหตุการณ์แบบพาสซีฟเป็นคุณสมบัติใหม่ในข้อมูลจำเพาะ DOM ที่ช่วยให้นักพัฒนาสามารถเลือกใช้ประสิทธิภาพการเลื่อนที่ดีขึ้นโดยไม่จำเป็นต้องเลื่อนเพื่อบล็อกผู้ฟังเหตุการณ์แบบสัมผัสและวงล้อ นักพัฒนาซอฟต์แวร์สามารถใส่คำอธิบายประกอบแบบสัมผัสและฟังแบบวงล้อด้วย {passive: true} เพื่อระบุว่าพวกเขาจะไม่เรียกใช้ PreventDefault คุณลักษณะนี้จัดส่งใน Chrome 51, Firefox 49 และลงจอดใน WebKit สำหรับคำอธิบายอย่างเป็นทางการแบบเต็มอ่านเพิ่มเติมได้ที่นี่

ดูเพิ่มเติม: ผู้ฟังเหตุการณ์แฝงคืออะไร

คุณอาจต้องรอให้ไลบรารี. js ของคุณใช้งานการสนับสนุน

หากคุณกำลังจัดการกิจกรรมทางอ้อมผ่านห้องสมุด JavaScript คุณอาจอยู่ในความเมตตาของห้องสมุดที่ให้การสนับสนุนคุณสมบัติดังกล่าว จนถึงเดือนธันวาคม 2562 ดูเหมือนว่าห้องสมุดหลัก ๆ จะมีการสนับสนุน ตัวอย่างบางส่วน:


16
แล้วไอออนิกห้องสมุดล่ะ
abhit

10
ฉันกำลังโทรpreventDefault()- เป็นไปได้หรือไม่ที่จะระงับคำเตือนนี้
maja


12
Google Maps JavaScript API เวอร์ชัน 3 ยังสร้างคำเตือนเหล่านี้ ฉบับที่มีการติดตามที่issuetracker.google.com/issues/63211698 (ชนิดที่น่าขันเมื่อพิจารณาว่า Google Chrome เป็นคำเตือนเกี่ยวกับการละเมิดที่ Google Maps JavaScript API สร้างขึ้น)
Jochem Schulenklopper

6
เพื่อระงับการเตือนนี้คุณสามารถ `addEventListener ('touchstart', this.callPassedFuntion, {passive: false})`
Shlomi Schwartz

9

สิ่งนี้ซ่อนข้อความเตือน:

jQuery.event.special.touchstart = {
  setup: function( _, ns, handle ) {
      this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
  }
};

6
ไม่มีเป้าหมายที่จะหยุดเหตุการณ์จริงเหรอ? ฉันไม่ต้องการซ่อนข้อความจนกว่าฉันจะจัดการปัญหาได้
yardpenalty.com

1
ฉันคิดว่ามันเป็นปัญหาห้องสมุด jquery ฉันคิดว่านักพัฒนาจะต้องแก้ไข แต่ถ้าคุณจะได้รับแจ้งให้ฉันทราบวิธีการทำ ขอบคุณมาก.
IvánRodríguez

แน่นอนอีวาน! ใช่แล้ว. เฮ้ตอนนี้ฉันอยากรู้อยากเห็น ... ฉันกำลังใช้ปลั๊กอิน d3 และฉันได้รับเช่น 2300 ละเมิด บางทีรหัสของคุณอาจช่วยได้! ฉันจะให้คุณโพสต์!
yardpenalty.com

@ yardpenalty.com ไม่หยุดเหตุการณ์ไม่ใช่เป้าหมาย! คำเตือนระบุว่าคุณได้วางผู้ฟังไว้โดยไม่ระบุว่าอาจหรือไม่ป้องกันพฤติกรรมเริ่มต้นในเหตุการณ์ ถ้าคุณมีกรณีที่คุณต้องการโทรคุณควรระบุpreventDefault() ถ้าไม่ได้ระบุpassive: false passive: trueคุณจะได้รับคำเตือนหากคุณไม่ได้ระบุไว้ หากคุณระบุpassive: trueและpreventDefault()ถูกเรียกมันจะส่งผลให้เกิดข้อผิดพลาดและค่าเริ่มต้นจะไม่ถูกป้องกัน การระบุpassiveไม่ใช่การแฮ็กที่นี่ มันเป็นวิธีการแก้ปัญหา มันคือสิ่งที่คำเตือนขอ!
เทาร

@ เทาขอบคุณสำหรับความคิดเห็น ไม่กี่ปีที่ผ่านมา แต่ฉันจะจำวิธีแก้ปัญหาในอนาคต!
yardpenalty.com

1

พบสิ่งนี้ในปลั๊กอินดร็อปดาวน์ select2 ใน Laravel เปลี่ยนค่าตามที่ Alfred Wallace แนะนำ

this.element.addEventListener(t, e, !1)

ถึง

this.element.addEventListener(t, e, { passive: true} )

แก้ปัญหา ทำไมเขาถึงลงคะแนนเสียงฉันไม่รู้ แต่มันเหมาะกับฉัน


0

สำหรับผู้ที่ติดอยู่กับปัญหาแบบดั้งเดิมค้นหาบรรทัดการโยนข้อผิดพลาดและเพิ่ม{passive: true}- เช่น:

this.element.addEventListener(t, e, !1)

กลายเป็น

this.element.addEventListener(t, e, { passive: true} )

0

สำหรับ jquery-ui-dragable กับ jquery-ui-touch-punch ฉันแก้ไขมันคล้ายกับIvánRodríguez แต่มีการแทนที่เหตุการณ์อีกหนึ่งรายการสำหรับ touchmove:

jQuery.event.special.touchstart = {
    setup: function( _, ns, handle ) {
        this.addEventListener('touchstart', handle, { passive: !ns.includes('noPreventDefault') });
    }
};
jQuery.event.special.touchmove = {
    setup: function( _, ns, handle ) {
        this.addEventListener('touchmove', handle, { passive: !ns.includes('noPreventDefault') });
    }
};

-1

ฉันพบวิธีแก้ปัญหาที่ใช้งานได้กับjQuery 3.4.1 แบบบาง

หลังจากยกเลิกการลดขนาดให้เพิ่ม{passive: true}ฟังก์ชัน addEventListener ในบรรทัด 1567 ดังนี้:

t.addEventListener(p, a, {passive: true}))

ไม่มีอะไรหยุดพักและการตรวจสอบประภาคารไม่บ่นเกี่ยวกับผู้ฟัง


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