2012-09-25 18 views

Respuesta

4

No se puede acceder a través de outerHTML porque SVG no es HTML, es un XML specification por separado.

Por eso, por ejemplo, su nodo svg en ese ejemplo tiene su propio espacio de nombres definido (xmlns="http://www.w3.org/2000/svg).

Su ejemplo puede ser el más conveniente para una consulta única, pero en realidad es posible excavar usando atributos nativos. Solo lleva un poco más de trabajo.

Vamos a utilizar el nodo de la muestra enlazada:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
    <text x="0" y="15" fill="black">An SVG element.</text> 
</svg> 

Si desea extraer el espacio de nombres y la versión, utilice la propiedad attributes.

var svgElement = $('svg')[0]; // using your example 
console.log(svgElement.attributes.xmlns); // outputs "http://www.w3.org/2000/svg" 
console.log(svgElement.attributes.version); // outputs "1.1" 

Si desea extraer el contenido real, repita los pasos sobre los elementos secundarios. Similar a lo anterior, la colección attributes de un nodo sin texto contendrá los valores x/y (etc.).

Sin utilizar jQuery, utilizando el ejemplo de nuevo:

for (var i = 0; i < svgElement.childNodes.length; i++) { 
    var child = svgElement.childNodes[i]; 
    if (child.nodeType == 1) { 
     console.log(child.attributes[0].name); // "x" 
     console.log(child.attributes[0].value); // "0" 
     console.log(child.attributes[1].name); // "y" 
     console.log(child.attributes[1].value); // "15" 
    } 
} 

He aquí un violín actualizada, un poco más elegante que demuestra las posibilidades: http://jsfiddle.net/33g8g/8/

19

SVGElements no tienen la propiedad outerHTML.

Se puede definir como esto en puro Javascript

Object.defineProperty(SVGElement.prototype, 'outerHTML', { 
    get: function() { 
     var $node, $temp; 
     $temp = document.createElement('div'); 
     $node = this.cloneNode(true); 
     $temp.appendChild($node); 
     return $temp.innerHTML; 
    }, 
    enumerable: false, 
    configurable: true 
}); 

o una solución jQuery una línea sería

$('<div>').append($(svgElement).clone()).html(); 

Referencia: https://gist.github.com/jarek-foksa/2648095

+0

Gracias por compartir - que estaba teniendo un infierno de tiempo para conseguir outerHTML para trabajar en Safari! – aendrew

+0

Agregaría 'if (! ('OuterHTML' en SVGElement.prototype)) {/ ** * /}' alrededor del polyfill –

6

2013 actualización: El innerHTML y outerHTML van a ser compatibles para svg eleme nts también, por el DOM Parsing specification.

Un parche para esto ha sido descargado en Blink/Chrome y estará disponible pronto, vea http://code.google.com/p/chromium/issues/detail?id=311080.

+0

Wow, eso está bien. – ivkremer

+3

Puedo confirmar que funciona perfectamente en las versiones más recientes de Chrome, Safari y Firefox. Por desgracia, no funciona en Internet Explorer 11. – Husky

1

Usando jQuery, puede crear fácilmente un contenedor de HTML temporal alrededor de cualquier elemento que no admite outerHTML:

function wrappedHtml(elt){ 
    var wrapped = elt.wrap("<wrap></wrap>").parent().html(); 
    elt.unwrap(); 
    return wrapped; 
} 
Cuestiones relacionadas