javascript - 元素必须可见才能使 "load"事件监听器正常工作吗?

标签 javascript event-handling opera addeventlistener image-loading

在我的文档中,有两个 svg 图像:预览和结果。根据预览图像计算结果图像;我通过添加/删除类 hidden-display 来在它们之间切换,它进一步受到 css 的影响,如下所示:

.hidden-display {
display: none;
}

这似乎运作良好。

在计算结果图像时,我想隐藏预览图像并仅显示进度条;加载结果图像后,我希望显示它并隐藏进度条。这是有效的代码;尤其是函数 showResult() 的两次出现:

function resultImageLoaded(event) {
    console.log("Inside add event listener function");
    resultImage.removeEventListener("load", resultImageLoaded, false);
    //showResult();    // Doesn't work if uncommented
    hideProgressBar();
    console.log("End event listener");
}

function submitChanges() {
    showProgressBar();

    var inputData = getInputString();
    var uri = "./ResultImage.cshtml?inputData=" + encodeURIComponent(inputData);

    resultImage.data = uri;
    resultImage.addEventListener("load", resultImageLoaded, false);

    hidePreview();
    showResult();    // Doesn't work if commented out
}

问题:虽然上面的代码有效,但它并没有完全达到我想要的效果:它隐藏预览,显示结果,然后才调用事件监听器函数,这隐藏了进度酒吧。

如果我在函数 submitChanges() 中注释掉 showResult() 并在事件监听器函数中取消注释,监听器函数 resultImageLoaded(event) 从未被调用 - 可能意味着结果图像从未被加载。这让我怀疑不可见元素不会触发“load”事件监听器,但这看起来很奇怪。

我在两个浏览器中对此进行了测试 - Internet Explorer 11 和 Opera 33.0。在 IE 中,一切都按预期工作,事件监听器被调用,但在 Opera 中我遇到了上述问题。

任何帮助将不胜感激。

最佳答案

根据我们的讨论,visibility:hidden 正在解决事件问题。 以下是解决第二个问题(UI 间距)的示例。

function registerEvent() {
  document.getElementById("test").addEventListener("click", function() {
    console.log("Test");
  });
}

function addClass(str) {
  document.getElementById("test").className = str;
}
div {
  height: 100px;
  width: 100px;
  border: 2px solid gray;
  float: left;
  margin: 10px;
  padding: 10px;
}
.display {
  display: none
}
.hidden {
  visibility: hidden
}
.invisible {
  visibility: hidden;
  height: 0px;
  width: 0px;
  margin: 0px;
  padding: 0px;
}
.show {
  visibility: visible;
  display: block;
}
<div id="test">0</div>
<div id="test1">1</div>


<button onclick="addClass('display')">Display</button>
<button onclick="addClass('hidden')">Hidden</button>
<button onclick="addClass('invisible')">Invisible</button>
<button onclick="addClass('show')">Show</button>

希望对你有帮助!

关于javascript - 元素必须可见才能使 "load"事件监听器正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290356/

相关文章:

javascript - 在同一个 HTML/Angular 页面上有两个时间选择器

safari - 是否有解决 Safari/Opera 无法通过超链接进行选项卡的错误的解决方法?

javascript - 在 jest/enzyme 中,如何模拟点击一个元素,其中 eventListener 由 [element].addEventListener(不是 window.addEventListener)绑定(bind)?

c# - MVVM 中的事件处理

C++ MSAPI 5 : SetNotifyCallbackFunction not working

css - 这个流氓空白是从哪里来的?

css - 元视口(viewport)(固定宽度)在具有背景颜色的透明图像上导致不需要的边框

javascript - 如何舍入一个 float ,使小数点后只有两个尾随数字?

javascript - 使用 javascript 呈现 pdf

javascript - Angular 5 从 API 响应中省略 1.0 中的 .0