Розгляньте позначення обробника подій як "пасивного", щоб зробити сторінку більш чуйною


217

Я використовую молоток для перетягування, і він стає розбитим при завантаженні інших речей, як це попередження повідомляє мені.

Обробка події введення "touchstart" затримано на X мс через зайнятість основної нитки. Розгляньте позначення обробника подій як "пасивного", щоб зробити сторінку більш чуйною.

Тож я намагався так додати «пасивного» слухачеві

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

але я все одно отримую це попередження.

Відповіді:


264

Для тих, хто отримує це попередження вперше, це пояснюється функцією крайового кровотоку під назвою Слухачі пасивних подій , яка впроваджена в браузери зовсім недавно (літо 2016 року). З https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md :

Слухачі пасивних подій - це нова особливість специфікації DOM, яка дозволяє розробникам увімкнути кращу продуктивність прокрутки, усуваючи необхідність прокрутки для блокування слухачів подій на дотик та колесо. Розробники можуть коментувати слухачів дотику та колеса за допомогою {passive: true}, щоб вказати, що вони ніколи не посилаються на prevenDefault. Ця функція постачається в Chrome 51, Firefox 49 та прибуває в WebKit. Повне офіційне пояснення читайте тут.

Дивитися також: Що таке пасивні слухачі подій?

Можливо, доведеться чекати, коли ваша бібліотека .js реалізує підтримку.

Якщо ви обробляєте події опосередковано через бібліотеку JavaScript, ви, можливо, будете сподіватися підтримки цієї конкретної бібліотеки для цієї функції. Станом на грудень 2019 року, схоже, жодна з основних бібліотек не реалізувала підтримку. Деякі приклади:


16
що з іонними бібліотеками?
abhit

10
Я дзвоню preventDefault()- чи можна придушити це попередження?
Maja


12
API Google Maps JavaScript версії 3 також генерує ці застереження. Проблема відстежується на веб- сайті issueetracker.google.com/isissue/63211698 . (Вигляд іронічного, враховуючи, що Google Chrome попереджає про порушення, які генерує JavaScript API Google Maps.)
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. Я думаю, розробники повинні це виправити. Але якщо ви отримаєте це, дайте мені знати, як це зробити, будь ласка. Дуже дякую.
Іван Родрігес

Напевно Іване! Так. Гей, зараз мені цікаво ... Я використовую плагін d3, і я отримую як 2300 порушень. Можливо, ваш код допоможе! Я буду тримати вас у курсі!
yardpenalty.com

@ jarpenalty.com, ні, зупиняти подію - не мета! У попередженні зазначається, що ви розмістили свого слухача, не вказуючи, може це чи не може перешкодити поведінці за замовчуванням події. Якщо у вас є випадки, коли ви хочете зателефонувати preventDefault(), вам слід вказати passive: false. Якщо ні, вкажіть passive: true. Ви отримуєте попередження лише в тому випадку, якщо не вказали жодне з них. Якщо вказати passive: trueта preventDefault()викликати, це призведе до помилки, а за замовчуванням не завадить. Вказівка passiveтут не є злому. Це рішення . Це те, про що вимагає попередження!
дао

@tao дякую за коментар. Минуло кілька років, але я обов'язково запам'ятаю рішення в майбутньому!
yardpenalty.com

1

Також зустрічайтеся з цим у випадаючому плагіні select2 у Laravel. Зміна значення, як запропонував Альфред Уоллес від

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 я виправив його подібним до Івана Родрігеса, але з ще однією подією, що перекриває для 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 slim

Після {passive: true}відміни даних додайте до функції addEventListener у рядку 1567 так:

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

Нічого не ламає і перевірки маяків не скаржаться на слухачів.


2
ніколи не змінюйте вихідний код бібліотеки; вам слід замінити це замість цього.
Раптор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.