我有以下代码:
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()
删除?
答案 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