【问题标题】:Trying to use getBoundingClientRect() on an element added programmatically returns width and height 0尝试在以编程方式添加的元素上使用 getBoundingClientRect() 返回宽度和高度 0
【发布时间】:2019-02-18 15:15:19
【问题描述】:

我正在尝试获取刚刚添加到bodyobject 元素的getBoundingClientRect(),但它返回widthheight 0。目前我修复了将SVG 添加到包含相同图片的 html 并将可见性设置为隐藏,然后从中获取宽度和高度。对象的大小是窗口大小的百分比,所以我无法提前知道。

let bulletSVG = document.createElement("object");
bulletSVG.setAttribute("class", "bullet"); 
bulletSVG.setAttribute("type", "image/svg+xml"); 
bulletSVG.setAttribute("data", "imgs/bullet.svg");

document.body.appendChild(bulletSVG);

console.log(bulletSVG.getBoundingClientRect());

我宁愿不为 body 添加 SVG 来获取宽度和高度。我该怎么办?

【问题讨论】:

    标签: javascript svg getboundingclientrect


    【解决方案1】:

    我有根据的猜测是浏览器还不知道图像的大小,因为您没有等待图像完全加载。我会这样做:

    const load = (obj) => 
      new Promise(resolve => obj.onload = resolve);
    
    async function addSVG() {
      let bulletSVG = document.createElement("object");
      bulletSVG.setAttribute("class", "bullet"); 
      bulletSVG.setAttribute("type", "image/svg+xml"); 
      bulletSVG.setAttribute("data", "imgs/bullet.svg");
    
      document.body.appendChild(bulletSVG);
    
      await load(bulletSVG);
    
      console.log(bulletSVG.getBoundingClientRect());
    }
    
    addSVG();
    

    更新 如果您的浏览器不支持 Promise,并且您不能/不想使用转译器(例如 Babel 7);您可以直接使用事件处理程序使其工作,尽管它不会那么优雅:

    function addSVG() {
      let bulletSVG = document.createElement("object");
      bulletSVG.setAttribute("class", "bullet"); 
      bulletSVG.setAttribute("type", "image/svg+xml"); 
      bulletSVG.setAttribute("data", "imgs/bullet.svg");
    
      document.body.appendChild(bulletSVG);
    
      bulletSVG.onload = function() {
        console.log(bulletSVG.getBoundingClientRect());
      }
    }
    

    【讨论】:

    • 谢谢。我必须在 IE11 上完成这项工作,但似乎不支持承诺。
    • 谢谢!我会尝试实施您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多