2009-08-31 8 views
8

El código aquí no devuelve lo que uno espera:¿JQuery (..). Html() tiene errores en jQuery 1.3.2?

jQuery('<div>Look here: [ jQuery0="null" ]</div>').html() 

Más bien, se obtiene:

Look here: [ ] 

El código fuente de jQuery en cuestión:

html: function(value) { 
     return value === undefined ? 
       (this[0] ? 
         this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
         null) : 
       this.empty().append(value); 
}, 

¿Cuál sería la motivación detrás del .replace? No tengo tiempo para repasar el resto de jQuery, pero un código como este me hace pensar si debería usar jQuery en producción.

Respuesta

4

Este código es nuevo en 1.3.2, no estaba en 1.3.1. Me parece que jQuery usa atributos cuyos nombres comienzan con "jQuery" para almacenar datos en elementos, y esta es su manera de no exponer eso cuando solicite el html.

Claramente no es un error. El autor intentó eliminar ese código HTML antes de devolverle la cadena.

¿Afecta esto su código? Al igual que con cualquier biblioteca, debe probar su código de producción a fondo antes de implementarlo.

+1

De acuerdo, todavía no afecta mi código, pero rompe el invariante 'x.html (y) .html() == y', que hace sonar una alarma. Gracias por la información sobre cuándo se introdujo esto. Tienes razón, no es un error, sino una decisión de diseño cuestionable. – t0yv0

11

¿Cuál sería la motivación detrás de .replace?

Para ocultar los atributos que jQuery utiliza con fines internos.

Este código hace que me pregunte si debería usar jQuery en la producción.

Sí, tuve exactamente la misma reacción. Es increíblemente descuidado. Intentar procesar HTML con expresiones regulares es el tipo de truco ingenuo que se espera de los pósteres de preguntas por primera vez, no el tipo de comportamiento que esperaría ver en el marco que tantos usuarios de SO parecen adorar.

No es el único lugar donde jQuery se dispara intentando analizar el marcado con expresiones regulares; algunas de las cosas del selector también están rotas. Estos pueden ser casos de esquina oscuros, pero para mí es una gran bandera roja indicativa del enfoque equivocado.

+4

Por cierto, hay una solución fácil para esto. IE solo incluye las propiedades de expansión en su serialización 'innerHTML' cuando sus valores son tipos simples como 'String' y' Number'. Otros objetos como Array no aparecen. Entonces, todo lo que jQuery necesita hacer es establecer 'node [expando] = [uuid];' en lugar de 'node [expando] = uuid;' y todo este procesamiento sin sentido de expresiones regex puede desaparecer. – bobince

+0

¿Alguna vez te dije cuánto te amo? :-P Eres, como, el dios de las correcciones IE ocultas, o algo así. –