【问题标题】:How to know when an <embed> element's content has loaded如何知道 <embed> 元素的内容何时加载
【发布时间】:2013-10-08 20:45:12
【问题描述】:

我正在以编程方式将&lt;embed&gt; 标记添加到我的 HTML 文档中:

var e = document.createElement('embed');
e.src = "some-image.svg";
e.type = "image/svg+xml";
document.body.appendChild(e);

这工作正常,SVG 元素按预期显示。但是,我想使用 JavaScript 操作 SVG 元素,并且在将元素添加到 DOM 后立即尝试这样做会失败,因为内容尚未加载。

我该怎么做。请注意,我想在 不使用 jQuery 的情况下执行此操作,因此请不要指向 jQuery API。

【问题讨论】:

标签: javascript embed-tag


【解决方案1】:

正如@RGraham 在评论中指出的那样,&lt;embed&gt; 元素会在其内容准备好时引发load 事件。

所以我的代码变成了:

var e = document.createElement('embed');
e.src = "img/z-slider.svg";
e.type = "image/svg+xml";
document.body.appendChild(e);

e.addEventListener('load', function()
{
    // Operate upon the SVG DOM here
    e.getSVGDocument().querySelector('#some-node').textContent = "New text!";
});

这比轮询更好,因为没有闪烁。 SVG 会在加载后立即修改,然后再绘制。

【讨论】:

  • 该事件在 Safari 中没有触发
【解决方案2】:

为创建的元素分配一个id。

  function check_if_loaded() {
    var your_svg = document.getElementById("id").getSVGDocument();
    if (your_svg) {
        alert("loaded");

    } else {
        console.log("not yet loaded")
    }
}

your_element.addEventListener('load',check_if_loaded, false)

【讨论】:

  • 感谢您的回答。为什么你认为需要投票?在我对 Chrome/Firefox/IE 的实验中,当load 事件触发时,SVG 文档是可用的。
  • 另外,我不需要向元素添加id,因为我已经引用了它(在我的示例中为e。)
  • 只是一个快速的解决方案..你的解决方案更好。我将摆脱投票部分
  • 此外,clear_me_later 是事件回调函数的私有,因此对 clearInterval 的调用将不起作用。
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多