2011-07-09 10 views
6

Después de examinar la fuente de jQuery, veo que el problema que tengo es que replaceWith llama a , que no existe para los documentos XML. ¿No se supone que replaceWith funciona en documentos XML?replaceWith on XML problem

He encontrado que esto es cierto sencilla solución, en caso de que alguien lo necesita en el futuro, que va a lograr lo que estoy tratando de hacer:

xml.find('b').each(function() { 
    $(this).replaceWith($('<c>yo</c>')) // this way you can custom taylor the XML based on each node's attributes and such 
}); 

Pero todavía me gustaría saber por qué el camino más fácil no funciona


No sé mucho sobre jQuery, pero ¿no debería funcionar?

xml = $.parseXML('<a><b>hey</b></a>') 
$(xml).find('b').replaceWith('<c>yo</c>') 

En lugar de xml que representa <a><c>yo</c></a> falla y representa <a></a>. ¿Hice algo mal? Estoy usando jQuery 1.6.2.

Editar:

Como nota al margen, si trato de usar la versión de la función de replaceWith, así:

$(xml).find('b').replaceWith(function() { 
    return '<c>yo</c>' // doesn't matter what I return here 
}) 

consigo este error:

TypeError: Cannot call method 'replace' of undefined 

Editar 2:

replaceAll funciona sin embargo, pero necesito utilizar la versión de función por lo que no puede conformarse con esto:

$('<c>yo</c>').replaceAll($(xml).find('b')) // works 

Datos 3:

Esto también funciona:

xml.find('b').replaceWith($('<c>yo</c>')) // but not with the $() around the argument 

Respuesta

2

Esto parece una limitación de diseño con replaceWith() o un error.

cuando corro:

$(xml).find('b').replaceWith(function() { 
    return '<c>yo</c>'; 
}) 

me sale una excepción "this[0].innerHTML is undefined". See this jsFiddle.

Perforación en xml, el nodo b no tiene un miembro de innerHTML - lo que hace un poco de sentido, ya que no es HTML. ;)

Parece que replaceWith() no siempre funciona bien con XML. Consider reporting a bug.

+0

¿Lo consideraría útil? –

+0

@Seth: Claro, ¿por qué no? Lo peor que puede pasar es que obtendrá un "no arreglará" y al menos el problema será documentado. –

+0

Sí. No funciona como las personas razonables esperarían, o como lo implica la documentación. Solo busque errores previos antes de publicar (hice una búsqueda * rápida * y no vi nada). –

0

sí. este es un viejo error y todavía existe. puede solucionarlo:

$.ajax 
    dataType: "xml" 
    ... 
    success: (data) -> 
    $(data).find("section").each -> 
     ugly_but_working_clone = $($(".existing_dom_element").append(this).html())