是否有任何方法可以恢复Vanilla JavaScript中的默认方法?

是否有任何方法可以恢复Vanilla JavaScript中的默认方法?,javascript,preventdefault,Javascript,Preventdefault,我正在尝试创建一个水平滚动容器。确切地说,我需要恢复e.preventDefault();点击一下 我尝试了很多选项,在else语句中更改“window.location.href”似乎是一个很好的选项。 但是我不知道如何从点击的链接中获取href 任何想法都有助于实现我的目标。:) 您应该删除包含event.preventDefault()的事件侦听器 为此,必须将函数引用保存到变量中,如下所示: const preventClickHandler = (e) => e.preventD

我正在尝试创建一个水平滚动容器。确切地说,我需要恢复e.preventDefault();点击一下

我尝试了很多选项,在else语句中更改“window.location.href”似乎是一个很好的选项。 但是我不知道如何从点击的链接中获取href

任何想法都有助于实现我的目标。:)


您应该删除包含
event.preventDefault()的事件侦听器

为此,必须将函数引用保存到变量中,如下所示:

const preventClickHandler = (e) => e.preventDefault;
slider.addEventListener('mouseup', () => {
    isDown = false;

    // Disable click event (for ever unfortunately)
    if(moved === true) {
        this.addEventListener('click', preventClickHandler);
    } else {
        this.removeEventListener('click', preventClickHandler);
    }
})

通过注册与
mousedown
mousemove
事件侦听器共享
mousedown
变量的
click
事件侦听器,可以有条件地防止在滑块上触发单击事件

该选项表示侦听器不调用
event.preventDefault()
,并节省大量CPU时间,特别是对于每秒可能触发多次的
mousemove
事件

true
参数表示应该在事件开始从目标元素冒泡之前调用事件侦听器。这使得它甚至可以防止传播到已经添加到同一元素上的侦听器,只要它们没有将
useCapture
设置为
true

const slider=document.querySelector('input[type=“range”]”);
//如果在mousedown和mouseup之间发生mousemove,则防止此操作
slider.addEventListener('单击',()=>{
log('单击滑块上激发的事件');
});
//在单击事件之前激发
slider.addEventListener('mouseup',()=>{
log(“滑块上触发的mouseup事件”);
});
let moved=假;
//为每个潜在点击重置
slider.addEventListener('mousedown',()=>{
移动=假;
});
//指示应取消单击
slider.addEventListener('mousemove',()=>{
移动=真;
},{被动:真});
//如果在mousedown和mouseup之间发生mousemove,则防止单击事件
slider.addEventListener('单击',事件=>{
如果(移动){
event.preventDefault();
事件。stopImmediatePropagation();
}
},对)

因此,每次鼠标向上移动时,都会绑定一个新的事件侦听器。。。。那是个糟糕的设计。您将添加许多事件侦听器。我的提示:不要在eventlistener中添加eventlistener。将它们添加到外部,然后创建逻辑来处理它们内部的所有情况。也许可以尝试切换一个删除所有指针事件的类,而不是使用事件对象来防止默认行为。下面是关于
指针事件的MDN:none
@andritodor但不确定您在说什么,将同一个函数与addEventListener一起使用并不会神奇地使它被调用一次。如果您添加相同的引用
(e)=>e,它将被调用一次。这是禁止的。非常感谢你,帕特里克!我必须从mousemove事件侦听器中删除{passive:true}选项,因为我需要一个事件。否则,您的脚本工作得非常好@饼干
因为我需要一个事件
你仍然可以提供
{passive:true}
只要你不在回调中调用
event.preventDefault()
。我使用event.preventDefault();防止浏览器的默认行为,如图像抓取。所以,不幸的是,CPU性能会下降一点。@这并不能解释为什么需要在
mousemove
事件上执行
preventDefault()
,但好吧……我尝试删除event.preventDefault();从mousemove,但每次我尝试单击并拖动滑块时,浏览器都会捕获图像而不是容器。
const preventClickHandler = (e) => e.preventDefault;
slider.addEventListener('mouseup', () => {
    isDown = false;

    // Disable click event (for ever unfortunately)
    if(moved === true) {
        this.addEventListener('click', preventClickHandler);
    } else {
        this.removeEventListener('click', preventClickHandler);
    }
})