当某个函数运行时删除EventListener

时间:2019-08-30 07:42:52

标签: javascript jquery

我有以下代码:

function setEvents() {
  // do some code
  myValidation();
}

function myValidation() {
 // do some checks
 // if checks passed, then set the values to URL parameters
 window.location.replace(window.location.href + "?myName=" + capture_name);
}

setEvents();

$( "#edit-submitted-name-consolidation" ).click(function() {

   window.addEventListener("beforeunload", function(e){
     (e || window.event).returnValue = setEvents();           
   }, false);

});

说明:

我上面的代码调用了setEvent()函数,该函数从内部调用了myValidation()函数。

此外,我有一个代码beforeunload,可以在用户关闭浏览器时运行相同的功能。仅当单击某些输入时才会发生这种情况。

但是,我希望myValidation()不要运行此beforeunload

换句话说,我希望浏览器始终运行beforeunload,但是当调用/使用myValidation()时,应该删除beforeunload

为此,这是我尝试过的

function setEvents() {
  // do some code
  myValidation();
}

function myValidation() {
 // do some checks
 // if checks passed, then set the values to URL parameters
 window.removeEventListener("beforeunload",(e));
 window.location.replace(window.location.href + "?myName=" + capture_name);
}

setEvents();

$( "#edit-submitted-name-consolidation" ).click(function() {
   window.addEventListener("beforeunload", function(e){
     (e || window.event).returnValue = setEvents();           
   }, false);
});

因此,我在window.removeEventListener("beforeunload",(e));中添加了myValidation()。但是,这对我不起作用。

所以我想问,如果正在使用beforeunload,如何从myValidation()删除?

1 个答案:

答案 0 :(得分:2)

问题是您应该将处理程序提取到一个变量中,因为这是两个单独的函数,您必须具有对原始函数的引用,您不能像这样删除侦听器。

您现在正在做的是删除一个不存在的事件监听器。

const handler = function(e){
  (e || window.event).returnValue = setEvents();           
}

window.addEventListener("beforeunload", handler, false);
window.removeEventListener("beforeunload", handler);

进一步的解释:试试这个=>

const x = () => {}
const y = () => {}

console.log(x === y) // should be true right? wrong. functions are compared by reference.
console.log(x === x) // this is true, since the reference is the same