我在一个网页上有一个<object>标记,它的data属性在JS (特别是jQuery)中以编程方式更改。SVG标记总是指向data图像。
在Firefox中,当data标记发生变化时,新的SVG会加载,所有正确的事件都会触发。在Chrome中,只有在单击SVG画布时才会发生这种情况--一旦发生这种情况,新的SVG就会显示并触发所有与其相关的事件。
为什么会这样呢?当我改变其data属性时,如何强制Chrome刷新<object>?
发布于 2012-04-30 06:03:47
嗯,我今晚真的很无聊,我想做一些课外作业以外的事情,所以我为你挖掘了很多规范和论坛。
HTML4 spec似乎没有提到SVG,所以这是个死胡同。HTML5 Spec Working Draft告诉我们,我们可以使用data来调用插件和加载内容。HTML5 Spec Editor's Draft做了mention SVG,告诉我们SVG属于embedded content类别。
由于<object> 为<object>元素添加了额外的细节(如 中所定义),因此我们可以说加载E122元素的行为不是可接受的标准。(如果我说错了,有人请纠正我。)
无论如何,在<object>规范中,除了所有关于浏览器应该如何通过MIME类型等解释对象的常用技术术语之外……我们找到与这个问题相关的部分:
DNS4.6:如果加载错误失败(例如,有一个HTTP404错误,有一个
错误),在元素上触发一个名为 error 的简单事件,然后跳到整个步骤集中的最后一步(回退)。
..。
10.:一旦资源完全加载了,将一个任务排入队列,以便在元素上触发一个名为的简单事件。
(仅仅意味着事件不会冒泡(因此我们不能在任何父元素中侦听它),并且不能取消,并使用Event接口)
因此,看到这里,我认为如果我从DOM中选择<object>元素,它应该有一个onload和onerror事件,如果没有object.addEventListener的话。如果你看一下SVG和的Mozilla Developer Network文档,你会发现很多JavaScript文档是不完整的。真扫兴。
闲逛JSFiddle、Chrome Dev Tools和Firefox Web控制台,我发现它们都支持onload和onerror,至少我是这么认为的。
Google Chrome (18.0.1025.165)和Firefox (12.0)
正如您从fiddle中看到的,在Chrome中使用load事件会导致无限循环。它不应该这样做(根据editor's draft):
上述算法独立于CSS属性(包括“显示”、“溢出”和“可见性”)。例如,即使元素使用“display:none”CSS样式隐藏,它也会运行,并且如果元素的可见性发生变化,它也不会再次运行。
它看起来像是某个人的already filed a bug,所以如果你去确认一下这个bug,它会对Chrome开发团队有所帮助。
加载对象的行为还不是一个被接受的标准,但是您可以去验证一个bug in the Chromium project。您可以尝试按照@Hello71的建议进行操作,并尝试从DOM中删除该元素,然后重新添加它,但I couldn't get it to work。
https://stackoverflow.com/questions/10366867
复制相似问题