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

时间:2016-05-17 18:09:26

标签: javascript html svg setinterval onload

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

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

  • 我有一些SVG代码(纯文本)插入<div>作为innerHTML
  • SVG元素具有onload属性,其中包含一些JavaScript
  • JavaScript包含setInterval(...) - (根本不起作用)
  • 我从临时div中获取SVG元素并将其作为函数的结果返回。
  • 此结果附加到live DOM(body)中的某个元素中

奇怪的问题:

  • onload属性中的任何其他代码都可以正常工作,
  • 仅限setInterval&amp; setTimeout完全被忽略了

更多信息:

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

考虑到以上所有因素,一切正常:

  • (新)SVG出现在屏幕上,都很好看和花花公子一样
  • 当我console.log使用的(内联)SVG代码时,所有内容看起来都很完美
  • 我没有错误,并且没有错误处理程序将错误(window.onerror == null
  • 静音
  • SVG节点onload属性中的JavaScript(文本)适用于以下内容:console.log(this) - (在日志中生成SVG元素) - 但是,如上所述:setInterval() &安培; setTimeout()只是被忽略 - 没有任何错误,也没有任何警告。

以下代码是一个非常简短的例子,(遗憾的是)它的工作原理;但是,在我的生产应用程序中它没有。

代码:

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文件中测试上面的代码,它可以工作;然而,对于我的生活,我无法找到它在我的应用程序中打破的原因;如上所述,它真的非常简单。

问题:

有没有人知道是否有一些“陷阱”我不知道这件事?也许名字间距?

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

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

我真的被这个困住了,我有点需要它为工作面试留下好印象;所以如果你知道任何有用的东西,我会非常感谢你的意见。

谢谢。

1 个答案:

答案 0 :(得分:0)

嵌入式内容,onload属性&amp; DOM

以下内容可能有助于相关场景:

  • 定位异步源时,请确保contentDocumentgetSVGDocument()包含您需要访问的资源。 window.onloadDOMContentLoaded事件与当前DOM相关,因此它可能有助于为跨浏览器解决方案构建自己的listener-&gt;触发器,因为您需要的内容可能尚未准备就绪以同步的方式。

  • 插入非异步加载的动态内容时,不会触发onload属性/事件,但在某些情况下可能会触发,因此,自定义:
    listen-&gt;触发器将解决这个问题。

具体问题

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

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

如果您的代码出现错误,但未显示错误,请确保window.onerror null - 或者如果它有功能,请确保它不是返回true - 否则可能会导致错误,并且您很难找出错误。

请随时改进此答案或发表评论,我会相应改进;但是,更好的答案将不胜感激。