【问题标题】:How to exit from a call stack in javascript如何从javascript中的调用堆栈退出
【发布时间】:2018-12-07 11:31:11
【问题描述】:

警报发生两次,一次在“dragover_handler”函数内,然后再次在用于拖动的 addEventListener 函数内。

第一次调用后如何退出调用栈?我试过return,还是不行。

Codepen Code

下面是有这个警报的代码部分

function dragover_handler(e) {
e = e || event;
e.preventDefault();

if(e.pageY < 24){        
   e.preventDefault();
   e.stopPropagation();
  e.dataTransfer.dropEffect= "none";
     alert('You will be leaving this window'); 
  document.body.removeEventListener('dragover', function(e){
     this
  });
} else {
   e.dataTransfer.dropEffect = "move";
} 
 }

document.body.addEventListener('dragover', function(e){
dragover_handler(e);// return ;
}, false);

代码在此链接中。首先“右键单击”-然后单击添加-然后在输入标签内输入一些文本并单击“确定”。将形成一个 div,向上拖动该 div 试图将其拉出窗口,当您到达边缘时,警报必须出现 - 它必须只发生一次

【问题讨论】:

  • 您可以在这里发布您的代码以供进一步检查吗?发布代码图片并没有真正的帮助。
  • 请将代码以文本形式发布。
  • 可能你添加了两次事件监听器,或者忘记了 removeEventListener?
  • 编辑了代码链接

标签: javascript callstack


【解决方案1】:
  • 您可以使用“dragenter”事件而不是“dragover”。进入目标时只会开火一次。

  • 否则,您可以在处理程序中使用 removeEventListener。

    const eventHandler = event => {
        document.body.removeEventListener("dragover", eventHandler)
        alert()
    }
    
    document.body.addEventListener("dragover", eventHandler)
    

【讨论】:

  • dragenter 也在那里,但也需要 dragover
  • document.body.removeEventListener('dragover', function(e){ this }); - 删除了处理程序中的 eventlisterner,但仍然无法正常工作
  • 删除事件然后添加警报是吗?
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多