如何使用JavaScript在<object>标签内选择SVG元素?

时间:2015-10-27 19:03:13

标签: javascript html angularjs svg cross-domain

在我的Angular appliation中,我希望能够使用JavaScript或Angular jqLit​​e选择<object>标记的嵌入式SVG元素。

通常,要执行此操作,必须编写类似于:

的内容
// Create <object> element of the SVG
var objElement = document.createElement('object');
objElement.setAttribute('type',"image/svg+xml");

// Assume $rootScope.b64 contains the base64 data of the SVG
objElement.setAttribute('data', $rootScope.b64);

// Append the <object> inside the DOM's body
angular.element(document.body).append(objElement);

console.log(objElement);
console.log(objElement.getSVGDocument());
console.log(objElement.contentDocument);

在我的控制台中,objElement返回带有<object>元素及其内容的完整<svg>(假设数据属性包含完整的base64数据字符串(b64))。

    <object id="svgObject" data="b64" type="image/svg+xml">
          #document
             <svg>
             </svg>
    </object>

但是,getSVGDocument()会返回nullcontentDocument会返回

    #document
       <html>
          <head></head>
          <body></body>
       <html>

为什么我无法检索SVG元素?如何正确获取SVG元素?我已经查看了很多文章,但我无法获得<svg>元素。这可能与跨省政策有关吗?

3 个答案:

答案 0 :(得分:1)

即使SVG明显加载到DOM中,我也无法使用document.querySelector("svg")之类的东西来选择SVG。原来我需要这样做:

var obj = document.querySelector("object");
var svg = obj.contentDocument.querySelector("svg");

显然主要文件与此子文档之间存在边界,您必须使用contentDocument来弥合鸿沟。

答案 1 :(得分:0)

似乎不推荐使用getSVGDocument()。你尝试过document.querySelector('object svg')吗?

答案 2 :(得分:0)

您看不到该对象的原因是因为您很可能在 DOM 加载之前对其进行了探测。试试:

// Create <object> element of the SVG
var objElement = document.createElement('object');
objElement.setAttribute('type',"image/svg+xml");

// Assume $rootScope.b64 contains the base64 data of the SVG
objElement.setAttribute('data', $rootScope.b64);

// Append the <object> inside the DOM's body
angular.element(document.body).append(objElement);

objElement.addEventListener('load', doStuff);

function doStuff() {
  console.log(objElement);
  var svgDoc = getSVGDoc(objElement);
  console.log('svgDoc', svgDoc);
}


function getSVGDoc(element) {
  console.log('getting obj');
  try {
    return element.contentDocument;
  } catch (e) {
    try {
      return element.getSVGDocument();
    } catch (e) {
      console.log('SVG unsupported within this browser');
    }
  }
}