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


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.