6
4

3 回答 3

11

好吧,今晚我真的很无聊,我想做一些不是功课的事情,所以我为你挖掘了很多规范和论坛。

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 中选择元素,它应该有一个onloadandonerror事件,如果不是object.addEventListener. 如果您查看 Mozilla Developer Network 的SVG和文档<object>,许多 JavaScript 文档是不完整的。真可惜。

只是玩弄 JSFiddle 和 Chrome 开发工具和 Firefox Web 控制台,我发现它们都支持onloadand 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 中删除该元素并重新添加它,但我无法让它工作

于 2012-04-29T22:03:47.437 回答
6

实际上,我遇到了完全相同的问题。看看http://jsfiddle.net/unesJ/,我用下面的代码解决了它:

的HTML:

<object id="graph" data="image1.svg" type="image/svg+xml"></object>

的JavaScript:

var new_url = 'image2.svg';
$('#graph').attr('data', new_url);
$('#graph').load(new_url);

它对我有用

  • 铬 24.0.1312.52 m
  • 火狐 17.0.1
于 2013-01-21T23:25:00.490 回答
2

我已经尝试了很多东西。不幸的是,我不得不采取以下措施:

setTimeout(function(){
  $('body').trigger('click');
}, 40);

不,我真的没有更好的解决方案,但它可以完成工作。

于 2012-08-08T22:58:33.287 回答