在JavaScript中,可以在捕获或冒泡阶段将事件设置为preventDefault操作吗?
简短的问题是:您是否可以执行在JavaScript中,可以在捕获或冒泡阶段将事件设置为preventDefault操作吗?,javascript,event-handling,event-bubbling,event-capturing,Javascript,Event Handling,Event Bubbling,Event Capturing,简短的问题是:您是否可以执行event.preventDefault(),无论您在哪个元素上设置事件处理程序,只要该元素是“捕获”、“在”和“冒泡”阶段的一部分 我想让页面上的所有内容都不可选择,所以一开始我想这样做 document.addEventListener("selectstart", function(ev) { ev.stopPropagation(); }, true); 因此,当它处于捕获阶段的最开始时,它不会向下传播到页面内容元素,那么就不会进行选择 但看起来,即使停
event.preventDefault()
,无论您在哪个元素上设置事件处理程序,只要该元素是“捕获”、“在”和“冒泡”阶段的一部分
我想让页面上的所有内容都不可选择,所以一开始我想这样做
document.addEventListener("selectstart", function(ev) {
ev.stopPropagation();
}, true);
因此,当它处于捕获阶段的最开始时,它不会向下传播到页面内容元素,那么就不会进行选择
但看起来,即使停止传播,默认操作仍然会执行
然后,我尝试在捕获阶段这样做:
document.addEventListener("selectstart", function(ev) {
ev.preventDefault();
}, true);
document.addEventListener("selectstart", function(ev) {
ev.preventDefault();
}, false);
然后将true
更改为false
,以使处理程序在冒泡阶段被调用:
document.addEventListener("selectstart", function(ev) {
ev.preventDefault();
}, true);
document.addEventListener("selectstart", function(ev) {
ev.preventDefault();
}, false);
而且它也有效
我曾经认为“preventDefault”是每个元素
那么,在捕获阶段、at阶段和冒泡阶段,您可以调用
ev.preventDefault()
,并且它是完全相同的事件对象,并且您可以阻止默认操作,无论您在哪个元素上设置处理程序,只要该元素位于“捕获”、“at”和“冒泡”位置循环?它要么是字面上相同的事件对象,要么实现的行为就好像它是。我从来没有向自己证明过哪一个是跨浏览器的情况。:-)很确定这是同一个物体。(见下文。)
但是可以,在事件上调用preventDefault
会告诉浏览器不要执行默认操作,无论您何时执行该操作
让我们证明它是同一个物体:
var-CAPTURE=true;
var冒泡=错误
无功电流=零;
钩子(document.body,“body”);
钩子(document.getElementById(“中间”),“中间”);
hook(document.getElementById(“target”),“target”);
函数挂钩(元素、名称){
元素。addEventListener(“单击”,函数(e){
if(元素===document.body){
console.log(名称+捕获);
电流=e;
}否则{
log(name+“capture,same?”+(e==current));
}
},捕获);
变量阶段=名称==“目标”?“目标”:“冒泡”;
元素。addEventListener(“单击”,函数(e){
日志(名称+“”+phase+“”,相同?”+(当前===e));
},冒泡);
}
点击我
Ok,在“Microsoft Edge 40.15063.0.0”中的所有日志消息报告true
@ScottMarcus:谢谢!