JavaScript - 动态 SVG - onload 属性 - 未触发事件
JavaScript - dynamic SVG - onload attribute - event not triggered
将动态 SVG 内容插入 DOM 无法按预期工作,具有 SVG 元素 onload 属性(包含 JavaScript)关于:"setInterval()".
如该问题的搜索标签中所述;这是普通的 (valilla) JavaScript(不是 jQuery);这是问题的细分:
- 我有一些 SVG 代码(纯文本)被插入到
<div>
中作为 innerHTML
- SVG 元素有一个
onload
属性,里面有一些 JavaScript
- JavaScript 包含
setInterval(...)
-(根本不起作用)
- 我从临时 div 中获取 SVG 元素并 return 它作为函数的结果。
- 此结果附加到实时 DOM(正文)中的某个元素中
奇怪的问题:
onload
属性中的任何其他代码都可以正常工作,
- 只有
setInterval
& 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文件中测试上面的代码,它是有效的;但是,对于我的一生,我找不到它在我的应用程序中崩溃的原因;如前所述,这真的很简单。
问题:
有人知道是否有一些 "gotcha" 我不知道的吗?也许名称间距?
如果需要源代码,我可以在 JSFiddle 或 CodePen 上加载它 - 如果需要的话,但是,它有很多代码和很多文件,可能不是发布所必需的。
我确定这只是一些小事;例如,计时器如何根据范围进行注册,以及它在 .bind()
中如何受到影响?
我真的被这个困住了,我有点需要它来为求职面试留下好印象;因此,如果您知道任何可以提供帮助的信息,我将非常感谢您的意见。
谢谢。
嵌入内容、onload 属性和 DOM
以下内容可能对相关场景有所帮助:
针对异步源时,请确保 contentDocument
或 getSVGDocument()
包含您需要访问的资源。 window.onload
,或者DOMContentLoaded
事件是相对于当前的DOM,所以它可能有助于构建你自己的跨浏览器解决方案的监听器->触发器,因为你需要的内容可能没有以同步方式准备好。
插入非异步加载的动态内容时不会触发onload
attribute/event,但在某些情况下可能会触发,因此,再次自定义:
listen->trigger 会解决这个问题。
具体问题
问题与上面第二点直接相关,答案很简单:
- 在所述 SVG 的 "onload" 属性中,设置一个简单的值作为 属性 of this like:
<svg onload="this.ready = true; setTinterval(...)"
- 在构造函数中,动态创建元素后,只需检查 svg-node 的
onload
事件是否像这样触发:
if (!svgNode.ready){ svgNode.onload(); }
如果您的代码中有错误,但没有显示错误,请确保 window.onerror
是 null - 或者如果它是一个函数,请确保它不会 return true
- 否则它可能会抑制错误,你将很难找出问题所在。
请随时改进这个答案,或者发表评论,我会相应地改进;然而,更好的答案将不胜感激。
将动态 SVG 内容插入 DOM 无法按预期工作,具有 SVG 元素 onload 属性(包含 JavaScript)关于:"setInterval()".
如该问题的搜索标签中所述;这是普通的 (valilla) JavaScript(不是 jQuery);这是问题的细分:
- 我有一些 SVG 代码(纯文本)被插入到
<div>
中作为innerHTML
- SVG 元素有一个
onload
属性,里面有一些 JavaScript - JavaScript 包含
setInterval(...)
-(根本不起作用) - 我从临时 div 中获取 SVG 元素并 return 它作为函数的结果。
- 此结果附加到实时 DOM(正文)中的某个元素中
奇怪的问题:
onload
属性中的任何其他代码都可以正常工作,- 只有
setInterval
&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文件中测试上面的代码,它是有效的;但是,对于我的一生,我找不到它在我的应用程序中崩溃的原因;如前所述,这真的很简单。
问题:
有人知道是否有一些 "gotcha" 我不知道的吗?也许名称间距?
如果需要源代码,我可以在 JSFiddle 或 CodePen 上加载它 - 如果需要的话,但是,它有很多代码和很多文件,可能不是发布所必需的。
我确定这只是一些小事;例如,计时器如何根据范围进行注册,以及它在 .bind()
中如何受到影响?
我真的被这个困住了,我有点需要它来为求职面试留下好印象;因此,如果您知道任何可以提供帮助的信息,我将非常感谢您的意见。
谢谢。
嵌入内容、onload 属性和 DOM
以下内容可能对相关场景有所帮助:
针对异步源时,请确保
contentDocument
或getSVGDocument()
包含您需要访问的资源。window.onload
,或者DOMContentLoaded
事件是相对于当前的DOM,所以它可能有助于构建你自己的跨浏览器解决方案的监听器->触发器,因为你需要的内容可能没有以同步方式准备好。插入非异步加载的动态内容时不会触发
onload
attribute/event,但在某些情况下可能会触发,因此,再次自定义:
listen->trigger 会解决这个问题。
具体问题
问题与上面第二点直接相关,答案很简单:
- 在所述 SVG 的 "onload" 属性中,设置一个简单的值作为 属性 of this like:
<svg onload="this.ready = true; setTinterval(...)"
- 在构造函数中,动态创建元素后,只需检查 svg-node 的
onload
事件是否像这样触发:
if (!svgNode.ready){ svgNode.onload(); }
如果您的代码中有错误,但没有显示错误,请确保 window.onerror
是 null - 或者如果它是一个函数,请确保它不会 return true
- 否则它可能会抑制错误,你将很难找出问题所在。
请随时改进这个答案,或者发表评论,我会相应地改进;然而,更好的答案将不胜感激。