Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用编程调度的事件防止默认操作_Javascript_Promise_Dom Events_Event Loop_Web Scripting - Fatal编程技术网

Javascript 使用编程调度的事件防止默认操作

Javascript 使用编程调度的事件防止默认操作,javascript,promise,dom-events,event-loop,web-scripting,Javascript,Promise,Dom Events,Event Loop,Web Scripting,在32:50时,扬声器显示以下代码: const nextClick = new Promise(resolve => { link.addEventListener('click', resolve, { once: true }); }); nextClick.then(event => { event.preventDefault(); // Handle event }); 他解释了为什么当用户交互直接导致点击事件时,它会阻止点击事件的默认操作,但

在32:50时,扬声器显示以下代码:

const nextClick = new Promise(resolve => {
    link.addEventListener('click', resolve, { once: true });
});

nextClick.then(event => {
    event.preventDefault();
    // Handle event
});
他解释了为什么当用户交互直接导致
点击事件时,它会阻止
点击事件的默认操作,但当调度是编程的,例如
link.click()
时,它不会阻止该事件的默认操作。在后一种情况下,是否有一种简单的方法使其与前一种情况相同

编辑以详细说明动机
@Kaido在评论中问我(或者更确切地说是演讲者)为什么在这里使用承诺——我想他会建议直接附加调用
preventDefault
的函数作为事件侦听器。如果我想使用promise.all或其他组合器将承诺与其他承诺结合起来,那么这个承诺是很方便的。

视频完美地解释了发生了什么,但似乎我们无论如何都必须解释它

在“本机”事件的情况下,浏览器将“将任务排队”到,这将依次到达您的目标和所有侦听器,以及。因为JS堆栈在每次回调执行之间是空的,并且在这些回调期间解析的承诺会执行它们的回调。
只有在调用了所有这些侦听器之后,如果没有引发事件,则将执行默认操作

const link=document.querySelector(“a”);
link.addEventListener(“单击”,(evt)=>{
日志(“事件1:,evt.defaultPrevented”);
Promise.resolve()然后(()=>{
console.log(“微任务1:”,evt.defaultPrevented);//false
evt.preventDefault();
});
});
link.addEventListener(“单击”,(evt)=>{
console.log(“事件2:,evt.defaultPrevented);//true
Promise.resolve()然后(()=>{
console.log(“微任务2:,evt.defaultPrevented);//true
});
});
#目标{
边际上限:600vh;
}


目标
事件.preventDefault()始终被调用,但如果事件是以编程方式调度的,则不会阻止默认操作。链接视频解释了原因。
一次
是不相关的。区别在于,当用户单击
链接时,
单击
事件的默认操作将被阻止,但当执行
链接.click()
时,情况并非如此。上面的评论针对的是一个显然删除了3条评论及其答案以及我的评论的人。视频似乎解释了一切,有什么你不明白的?你为什么要使用承诺?@kaido,如果我想将承诺与其他使用承诺的承诺结合起来,那么这个承诺是很方便的。视频只是说明了问题,解释了行为,但没有提供解决方案。