javascript - 在 IE11 中的 SVG 元素上捕获 "Image"加载事件

标签 javascript html svg onload-event

希望有人已经解决了这个问题,所以这应该很容易。

我已经遇到的最接近的问题是这个问题:

Is it possible to listen image load event in SVG?

这没有帮助。

场景

我正在使用第 3 方工具包在我正在创建的自定义文档编辑器中创建 SVG 图形。

此第 3 方工具包创建 SVG“..”标签来保存正在编辑的图像。

具体来说,它创建一个输出,如下所示:

<g transform="translate(0.5,0.5)" style="visibility: visible;">
  <image x="4.68" y="0" width="469" height="81" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="genimage?1453893356324" preserveAspectRatio="none">
  </image>
</g>

应用程序的一部分需要知道所有图像何时完成加载,以便完成初始化任务。

为了提供图像加载的通知,我使用 jQuery 为元素添加了一个“load”事件处理程序。

我无法添加“onLoad”或修改正在生成的“”标签,因为我无权访问它。我最快可以访问它是当 svg 已经通过第 3 方工具包注入(inject)到 dom 中时,此时加载已经在进行中,我无法附加或修改任何内容,因为我来不及影响操作。

我尝试过什么以及发生了什么

我添加的“load”事件在 Chrome 和 Firefox 中运行得非常好。我添加以下内容:

$('g image').on('load', (e) => {
  console.log("Image Loaded");
  console.log(e);
});

除了 IE 之外,这一切都很好

除了 IE11 之外,我不针对任何其他浏览器(IE10 是推送的,但仅此而已),但无论我如何尝试,IE11 都不会触发该事件。

现在,这个故事有一个稍微奇怪的转折。

在我设置此事件之前,以及在我告诉第 3 方产品加载其图像之前,我有一个仅使用标准加载的占位符图像

documentMockImage: HTMLImageElement = new Image();
this.documentMockImage.src = "mockimage";

并且,我添加的处理程序在 IE 中触发,告诉我模拟图像已加载(这不是我想要的),但在 Chrome 和 FF 中,它会按预期为每个加载的图像触发图表,但不适用于图像占位符(这是我想要的行为)

所以我的问题是这样的: 如何获得统一的行为,在 svg 图中的每个单独图像之后告诉我,该行为适用于 IE11、Chrome 和 FF。

为了回答我听到人们已经问我的问题:

  • 是的,我正在使用 typescript ,但这对于如何解决这个问题并不重要。
  • 第 3 方工具包是“MxGraph”/“JGraph”,但这不是工具包特定问题,而是 SVG 图像问题
  • 不,我无法提供示例代码(除了我已经展示的代码),这是一个封闭的项目
  • 是的,我的项目中确实有 jQuery,是的,我可以使用它,但我也可以使用 native ,但我宁愿不必添加任何更多的依赖项/库 *该项目目前在 typescript 中使用 jQuery、Knockout、Bootstrap 和 Require,按照 ES6 标准进行编码并在输出时转译为 ES5。

如果有人可以提供任何解决此问题的建议,我们将不胜感激。

更新 1

继续研究这一点,我决定只是看看每个浏览器本身能找到什么,所以我添加了以下内容:

var svgImages = document.getElementsByTagName('image');
console.log(svgImages);

Chrome 和 FF 按预期返回了我文档中的 4 个 SVG 图像

Images in Chrome Debugger

Images in Firefox debugger

然而,Internet Explorer 不仅添加了 svg 中的“image”标签,还添加了文档中其他位置的“img”标签

Images in the IE debugger

这表明 IE 要么故意这样做,要么无法区分“image”和“img”

最佳答案

这是 Kaiido 建议的示例。 我知道这很糟糕,但我找不到 IE 和 Edge 的任何其他选项。

var url = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png";
var svg = document.getElementById('svg');
var img = document.createElementNS("http://www.w3.org/2000/svg", 'image');

var dummy = new Image();
dummy.addEventListener('load', function()
{
  console.log("dummy onload");
  img.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", url);
  img.setAttribute("width", dummy.width);
  img.setAttribute("height", dummy.height);
  svg.appendChild(img);
}, false);
dummy.src = url;
<svg id="svg" width="1000px" height="500px" />

关于javascript - 在 IE11 中的 SVG 元素上捕获 "Image"加载事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036672/

相关文章:

javascript - 使用 jquery 交换文本,如何将其他文本还原为原始文本?

javascript - Keen.js 硬编码图形数据

svg - 如何在 d3.js 中的节点上制作双击事件?

javascript - 如何缩放 SVG 路径

html - Base64 编码的 SVG 无法通过 HTML 标记中的内联样式或通过 CSS 中的类进行着色

javascript - 圆 Angular 的秒数(如时钟)

javascript - JS promise : control flow

javascript - react 要求.确保。无法读取 require 加载的组件的 props

javascript - jQuery slider 最后到第一个过渡

javascript - 从 electron 中的 html 中检索一个类