Google chrome 在关闭的窗口上在IE11/Edge中调用removeEventListener时出错,但在Chrome和Firefox中仍然有效

Google chrome 在关闭的窗口上在IE11/Edge中调用removeEventListener时出错,但在Chrome和Firefox中仍然有效,google-chrome,events,dom-events,microsoft-edge,addeventlistener,Google Chrome,Events,Dom Events,Microsoft Edge,Addeventlistener,我创建了一个JSFIDLE来展示这种行为。我观察到IE11/Edge的行为是一种方式,Chrome和Firefox的行为是另一种方式,我不确定这两种情况中的哪一种是bug或设计缺陷 HTML: 这里发生的事情是我打开一个弹出窗口并向其中添加一个事件侦听器。我关闭弹出窗口,然后删除其事件侦听器 在Chrome和Firefox中,popupWin.removeEventListener(“unload”,myHandler,false)正常进行,因为即使弹出窗口关闭,popuwin仍在引用弹出窗口

我创建了一个JSFIDLE来展示这种行为。我观察到IE11/Edge的行为是一种方式,Chrome和Firefox的行为是另一种方式,我不确定这两种情况中的哪一种是bug或设计缺陷

HTML:

这里发生的事情是我打开一个弹出窗口并向其中添加一个事件侦听器。我关闭弹出窗口,然后删除其事件侦听器

在Chrome和Firefox中,
popupWin.removeEventListener(“unload”,myHandler,false)正常进行,因为即使弹出窗口关闭,
popuwin
仍在引用弹出窗口。对于IE11和Edge,该行会抛出一个错误,因为
popupWin
没有引用弹出窗口

请理解,我不是在寻找“不要那样做,这样做”的答案。我试图理解为什么在关闭弹出窗口后,Chrome和Firefox仍然包含对该窗口的引用,而IE11/Edge失去了该引用。这两种情况中,哪种情况正确处理了对弹出窗口的引用

更新

仅供参考:上述内容已在Windows 10虚拟机上进行了测试,版本为Microsoft Edge 12.10240。虚拟机由微软通过其开发中心提供


因此,至少在我这方面,我还没有确认Edge的其他版本,即12.x和13.x,是否存在失去参考的问题。

作为微软Edge团队的成员,这只是我们的一个缺陷。我已经在内部创建了一个问题,在不久的将来(希望如此),它将被修复

作为微软Edge团队的一员,这只是我们的一个缺陷。我已经在内部创建了一个问题,在不久的将来(希望如此),它将被修复

添加第三个参数可能会有所帮助

.addEventListener(“unload”,myHandler,true)

在我的项目中,它在IE11上工作

e、 g


添加第三个参数可能会有所帮助

.addEventListener(“unload”,myHandler,true)

在我的项目中,它在IE11上工作

e、 g


哇!我们家里有个名人。没想到微软的任何人会出现在这个网站上;)说真的,我非常感谢您的回复,您正在研究修复现在被认为是错误的东西。我想IE11不会被更新。我在Win 10虚拟机上测试了它,带有Edge 12.10240。这个bug也出现在Edge w/IE11仿真中,我认为IE10和IE9仿真中。Edge会有持续的微升级和补丁、la Chrome和Firefox,还是像Internet Explorer这样的固定版本?再次感谢您的帮助!还有一件事。我没有使用其他Edge 12版本或Edge 13版本进行测试。因此,我无法确认其他版本的Edge是否没有出现此问题。再次感谢。哈哈:]IE 11将继续进行安全更新。Edge于11月发布,已经有多个更新,并将继续进行SOOW!我们家里有个名人。没想到微软的任何人会出现在这个网站上;)说真的,我非常感谢您的回复,您正在研究修复现在被认为是错误的东西。我想IE11不会被更新。我在Win 10虚拟机上测试了它,带有Edge 12.10240。这个bug也出现在Edge w/IE11仿真中,我认为IE10和IE9仿真中。Edge会有持续的微升级和补丁、la Chrome和Firefox,还是像Internet Explorer这样的固定版本?再次感谢您的帮助!还有一件事。我没有使用其他Edge 12版本或Edge 13版本进行测试。因此,我无法确认其他版本的Edge是否没有出现此问题。再次感谢。哈哈:]IE 11将继续进行安全更新。Edge于11月发布,已经有多个更新,并将继续更新
<div id="output">placeholder</div>
<button id="addEvtPopup">Add Event to Pop-up Window</button>
<button id="removeEvtPopup">Remove Event from Pop-up Window</button>
<button id="popupBtn">Open Pop-up Window</button>
var output = document.getElementById("output");
var addEvtPopupBtn = document.getElementById("addEvtPopup");
var removeEvtPopupBtn = document.getElementById("removeEvtPopup");
var popupBtn = document.getElementById("popupBtn");
var popupWin = null;

function myHandler(evt) {
  output.innerHTML = output.myParam;
}

popupBtn.onclick = function() {
  // Observe the variable referencing the pop-up Window
  popupWin = window.open("", "myPopupWin", "width=100px, height=100px, top=500px, left=-1000px");
};

addEvtPopupBtn.onclick = function() { 
  popupWin.addEventListener("unload", myHandler, false);
  output.innerHTML = "Pop-up Event added";
  output.myParam = "Pop-up Event unloaded";
  popupBtn.eventEnabled = true;
};

removeEvtPopupBtn.onclick = function() {
  // Chrome and Firefox: With pop-up closed, popupWin still has reference to closed pop-up window
  // IE11 and Edge: With pop-up closed, popupWin has no reference to closed pop-up window
  // As a result, the next line will error out in the latter browsers but not in the former browsers
  // In both cases, typeof popupWin evaluates to "object"
  popupWin.removeEventListener("unload", myHandler, false);
  output.innerHTML = "Pop-up Event removed";
  popupBtn.eventEnabled = false;
};
window.addEventListener('scroll', function (){ console.log(152) }, true);