JavaScript - 动态 SVG - onload 属性 - 未触发事件

JavaScript - dynamic SVG - onload attribute - event not triggered

将动态 SVG 内容插入 DOM 无法按预期工作,具有 SVG 元素 onload 属性(包含 JavaScript)关于:"setInterval()".

如该问题的搜索标签中所述;这是普通的 (valilla) JavaScript(不是 jQuery);这是问题的细分:

奇怪的问题:

更多信息:

在运行时(启动)期间,SVG 代码是从现有的 embed 元素 .getSVGDocument() 中获取的(加载后)并准备为普通的 HTML用作模板,从相同的源代码创建许多其他的。我没有使用 cloneNode(true) - 因为:间隔用于动画(连续 慢速和平滑 旋转) - 这可能会对客户端资源产生重大影响,因此,我认为最好获取代码并将其保留为模板 - 然后从 DOM.

中删除原始代码

考虑到以上所有内容,一切正常:

下面的代码是一个非常简短的示例,并且(遗憾的是)它可以工作;但是,在我的生产应用程序中却没有。

代码:

var html = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" onload="setInterval(function(){ console.log(\'testing\'); },500);">';
var temp = document.createElement('div');  temp.innerHTML = html;
var node = temp.getElementsByTagName('svg')[0];

document.body.appendChild(node);

如果你在一个新的js文件中测试上面的代码,它是有效的;但是,对于我的一生,我找不到它在我的应用程序中崩溃的原因;如前所述,这真的很简单。

问题:

有人知道是否有一些 "gotcha" 我不知道的吗?也许名称间距?

如果需要源代码,我可以在 JSFiddle 或 CodePen 上加载它 - 如果需要的话,但是,它有很多代码和很多文件,可能不是发布所必需的。

我确定这只是一些小事;例如,计时器如何根据范围进行注册,以及它在 .bind() 中如何受到影响?

我真的被这个困住了,我有点需要它来为求职面试留下好印象;因此,如果您知道任何可以提供帮助的信息,我将非常感谢您的意见。

谢谢。

嵌入内容、onload 属性和 DOM

以下内容可能对相关场景有所帮助:

  • 针对异步源时,请确保 contentDocumentgetSVGDocument() 包含您需要访问的资源。 window.onload,或者DOMContentLoaded事件是相对于当前的DOM,所以它可能有助于构建你自己的跨浏览器解决方案的监听器->触发器,因为你需要的内容可能没有以同步方式准备好。

  • 插入非异步加载的动态内容时不会触发onloadattribute/event,但在某些情况下可能会触发,因此,再次自定义:
    listen->trigger 会解决这个问题。

具体问题

问题与上面第二点直接相关,答案很简单:

  • 在所述 SVG 的 "onload" 属性中,设置一个简单的值作为 属性 of this like:
    <svg onload="this.ready = true; setTinterval(...)"
  • 在构造函数中,动态创建元素后,只需检查 svg-node 的 onload 事件是否像这样触发:
    if (!svgNode.ready){ svgNode.onload(); }

如果您的代码中有错误,但没有显示错误,请确保 window.onerrornull - 或者如果它是一个函数,请确保它不会 return true - 否则它可能会抑制错误,你将很难找出问题所在。

请随时改进这个答案,或者发表评论,我会相应地改进;然而,更好的答案将不胜感激。