由于目标被视为被动,因此无法阻止被动事件监听器中的Default

时间:2019-04-01 18:30:01

标签: javascript jquery passive-event-listeners

我使用了以下代码,并开始得到以下提到的错误,该代码有什么问题,及其解决方法是什么。

  

由于目标被视为被动,因此无法阻止被动事件侦听器中的Default。参见https://www.chromestatus.com/features/6662647093133312

<script>
jQuery(window).scroll(function() {

  if (jQuery(this).scrollTop() > 400) {

    jQuery('.headerN').css("width", "100%");
    jQuery('.headerN').slideDown();
  } else {
    jQuery('.headerN').slideUp();
  }
});
</script>

2 个答案:

答案 0 :(得分:0)

在JQuery中,这仍然是一个未解决的问题:https://github.com/jquery/jquery/issues/2871

您可以在事件中使用Vanilla js进行此操作:

el.addEventListener('someEvent', someFn, { passive: false });

这是上面提到的github线程上的某人如何创建他们实施的解决方法:

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

答案 1 :(得分:0)

我不是在回答最初的问题,但我正在添加我使用的解决方案并解决了这个问题“由于目标被视为被动而无法防止被动事件侦听器内的默认”。

为什么会在 jquery 中出现这种情况?

(S.Event.prototype = {
        constructor: S.Event,
        isDefaultPrevented: Ee,
        isPropagationStopped: Ee,
        isImmediatePropagationStopped: Ee,
        isSimulated: !1,
        preventDefault: function () {
            var e = this.originalEvent;
            (this.isDefaultPrevented = Ce), e && !this.isSimulated && **e.preventDefault();**
        },
        stopPropagation: function () {
            var e = this.originalEvent;
            (this.isPropagationStopped = Ce), e && !this.isSimulated && e.stopPropagation();
        },
        stopImmediatePropagation: function () {
            var e = this.originalEvent;
            (this.isImmediatePropagationStopped = Ce), e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation();
        },
    }),

我从 jquery-3.5.js 库中获取了代码片段。粗体代码段会导致此问题,因为所述事件(您遇到问题的事件)是被动的,因此 jquery 无法阻止默认。

就我而言,当我尝试在 ipad 11> 中滚动下拉列表并从下拉列表中选择任何值(jquery 自动完成)时,它不允许我这样做。

解决方案

document.addEventListener('touchstart', function(event) {
jQuery('#'+event.target.id).trigger('click');
}, {passive: false}

这只是一种解决方法。因此,基本上,您必须手动触发事件,因为 jquery lib 阻止了默认行为。最重要的部分是将该事件标记为 {passive: false}