好吧,今晚我真的很无聊,我想做一些不是功课的事情,所以我为你挖掘了很多规范和论坛。
HTML4 规范似乎没有提到 SVG,所以这是一条死胡同。HTML5 Spec Working Draft告诉我们,我们可以使用它来data
调用插件和加载内容。HTML5 Spec Editor's Draft 确实 提到了 SVG,告诉我们 SVG 属于嵌入内容的范畴。
因为编辑草案为工作草案<object>
中定义的元素添加了额外的细节,我们可以说加载元素的行为不是公认的标准。<object>
(如果我错了,请有人纠正我。)
无论如何,在<object>
规范中,除了关于浏览器应该如何通过 MIME 类型解释对象等的所有常用技术术语之外......我们找到了与这个问题相关的部分:
4.6:如果加载失败(例如,有一个HTTP 404错误,有一个DNS错误),在元素上触发一个名为error的简单事件,然后跳转到整个步骤集的最后一步(回退)。
...
10.:一旦资源完全加载,排队一个任务以在元素上触发一个名为load的简单事件。
(简单事件仅仅意味着事件不会冒泡(所以我们不能在任何父元素中监听它)并且不可取消,并使用Event
接口)
所以,看着这个,我想如果我从<object>
DOM 中选择元素,它应该有一个onload
andonerror
事件,如果不是object.addEventListener
. 如果您查看 Mozilla Developer Network 的SVG和文档<object>
,许多 JavaScript 文档是不完整的。真可惜。
只是玩弄 JSFiddle 和 Chrome 开发工具和 Firefox Web 控制台,我发现它们都支持onload
and onerror
,或者我想。
测试结果
谷歌浏览器 (18.0.1025.165) 和 Firefox (12.0)
支持:
addEventListener('load', function(){})
obj.onload = function(){};
不支持(事件似乎没有触发):
addEventListener('error', function(){})
obj.onerror = function(){}
从fiddle可以看出,在 Chrome 中使用该load
事件会导致无限循环。它不应该这样做(根据编辑的草稿):
上述算法独立于 CSS 属性(包括“显示”、“溢出”和“可见性”)。例如,即使元素以 'display:none' CSS 样式隐藏,它也会运行,并且如果元素的可见性发生变化,它也不会再次运行。
看起来有人已经提交了一个错误,所以如果你去确认这个错误,它将帮助 Chrome 开发团队。
TL;博士
加载对象的行为还不是公认的标准,但您可以去验证Chromium 项目中的错误。您可以尝试按照@Hello71 的建议进行操作,并尝试从 DOM 中删除该元素并重新添加它,但我无法让它工作。