【问题标题】:Add listener to SVG unload event when SVG is loaded within an <object> tag在 <object> 标记中加载 SVG 时向 SVG 卸载事件添加侦听器
【发布时间】:2015-05-11 06:14:21
【问题描述】:

我在一个元素中加载了一个 SVG 文件。我将侦听器附加到 load 事件。当显示 SVG 文件并准备好进行任何操作时,将触发此事件。在load 事件之后,我在我的应用层上使用 javascript 来操作 SVG。隐藏/显示某些元素,动画某些元素,添加或删除元素。到目前为止一切正常,所有主流浏览器都支持。

(如果你很好奇,我这样做是因为这个 SVG 是可重用组件的一部分,我向我推荐了这种方法,以隔离 SVG 元素 ID 与应用程序中的元素 ID 不重叠或 SVG 的其他实例。)

当&lt;object&gt; 元素或该元素的某些父元素与文档分离时,就会出现问题。这会导致&lt;object&gt; 卸载。当重新附加分离的元素时,&lt;object&gt; 会自动重新加载,load 事件会再次触发。

我最关心的是在卸载&lt;object&gt; 元素时收到通知。我需要运行一些代码来防止对卸载的&lt;object&gt; 进行任何进一步的 SVG 操作。

据推测,当卸载发生时,'unload' event 会在 &lt;svg&gt; 上触发。我只能在 SVG 文件本身中将此事件的句柄作为属性附加。喜欢:

<svg ... onunload="javascript:console.log('THIS WORKS')">

但是,我的应用层上的 javascript 中似乎无法附加到此事件。假设 theObjectEl 是对我的 &lt;object&gt; 的引用,我希望以下工作:

theObjectEl.contentDocument.rootElement.addEventListener(
    'unload',
    function() {
        console.log("THIS DOES NOT WORK");
    }
);

有趣的是,我能够使用theObjectEl.contentDocument.rootElement.attributes.onunload 获得第一个示例中使用的onunload 属性。但是设置属性绝对不会改变事件的处理程序。

A demo showing how the SVG object gets unloaded and reloaded

有什么想法吗?

注意: SVG 与我的应用程序托管在同一台服务器上,因此没有跨域限制。

【问题讨论】:

  • 你的元素是怎么卸载的,即使有属性我也无法重现。
  • 谢谢。这是一个演示,显示了正在发生的事情。 frank-weindel.github.io/svg-unload

标签: javascript html svg


【解决方案1】:

编辑

知道了:svgDocument.defaultView.addEventListener('unload' , function(){console.log('Gotcha!')})

您必须将事件附加到documentElement 的defaultView 属性。

【讨论】:

  • 我基本上已经弄清楚了那部分。但是我需要 unload 事件,以便我可以取消订阅一些事件处理程序等,以防止它们修改不再存在的 SVG。
  • 甜蜜。谢谢!我更新了我的示例以说明在控制台中工作的卸载事件。这适用于 Chrome、Firefox、Safari,但不适用于 IE9 或 IE10(如图)。但这可能是最好的。
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2019-02-08
  • 2017-01-06
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多