페이지 처리 속도를 높이려면 이벤트 핸들러를 '수동'으로 표시하십시오.


217

드래그하는 데 망치를 사용하고 있으며 다른 경고 메시지가 표시되어 다른 물건을 넣을 때 고르지 않습니다.

'touchstart'입력 이벤트 처리가 메인 스레드 사용 중으로 인해 X ms 동안 지연되었습니다. 페이지 처리 속도를 높이려면 이벤트 핸들러를 '수동'으로 표시하십시오.

그래서 청취자에게 '수동'을 추가하려고했습니다.

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}로 터치 및 휠 리스너에 주석을 달아 preventDefault를 호출하지 않을 것임을 나타낼 수 있습니다. 이 기능은 Chrome 51, Firefox 49와 함께 제공되며 WebKit으로 제공됩니다. 자세한 공식 설명은 여기를 참조하십시오.

참조 : 수동 이벤트 리스너은 무엇입니까?

.js 라이브러리가 지원을 구현할 때까지 기다려야 할 수도 있습니다.

JavaScript 라이브러리를 통해 간접적으로 이벤트를 처리하는 경우 해당 라이브러리가 기능을 지원하는 데 도움이 될 수 있습니다. 2019 년 12 월 현재 주요 라이브러리가 지원을 구현 한 것처럼 보이지 않습니다. 몇 가지 예 :


16
이온 라이브러리는 어떻습니까?
— ab

10
전화 중입니다 preventDefault()-이 경고를 표시하지 않을 수 있습니까?
— maja


12
Google Maps JavaScript API 버전 3도 이러한 경고를 생성합니다. issuetracker.google.com/issues/63211698 에서 문제를 추적하고 있습니다. (아이러니의 종류, 구글 크롬 Google지도 자바 스크립트 API가 생성하는 위반에 대해 경고하고 있음을 고려.)
— Jochem Schulenklopper

6
이 경고를 표시하지 않으려면`addEventListener ( 'touchstart', this.callPassedFuntion, {수동 : 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án Rodríguez

확실히 이반! 그렇습니다. 야, 지금 궁금하다 ... d3 플러그인을 사용하고 있으며 2300 건의 위반이 발생하고있다. 아마도 당신의 코드가 도움이 될 것입니다! 난 당신이 게시 계속됩니다!
— yardpenalty.com

@ yardpenalty.com, 아니오, 이벤트 중지는 목표가 아닙니다! 경고는 이벤트의 기본 동작을 막을 수 있는지 여부를 지정하지 않고 리스너를 배치했음을 나타냅니다. 전화를 걸 preventDefault()경우를 지정해야 passive: false합니다. 그렇지 않으면을 지정하십시오 passive: true. 둘 중 하나를 지정하지 않으면 경고 만 표시됩니다. 지정 passive: true하고 preventDefault()호출되면 오류가 발생하고 기본값이 방지되지 않습니다. 여기서 지정하는 passive것은 해킹이 아닙니다. 그것은의 솔루션 . 경고가 요구하는 것입니다!
— tao

의견을 주셔서 감사합니다. 몇 년이 지났지 만 미래의 해결책을 분명히 기억할 것입니다!
— yardpenalty.com

1

Laravel의 select2 드롭 다운 플러그인에서도이 문제가 발생합니다. 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-touch-punch로 jquery-ui-dragable의 경우 Iván Rodrí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 slim 에서 작동하는 솔루션을 찾았습니다.

축소하지 않은 후 {passive: true}다음과 같이 1567 행에서 addEventListener 함수에 추가하십시오 .

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

아무것도 깨지 않고 등대 감사는 청취자에 대해 불평하지 않습니다.


2
라이브러리의 소스 코드를 변경하지 마십시오. 대신 재정의해야합니다.
— 랩터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.