2012-02-04 20 views
5

ACTUALIZACIÓN: Parece un comportamiento específico del navegador como comentó TimWolla: ¿cómo debo normalizar la versión no escamada, de manera confiable en un navegador cruzado?Cómo evitar que jQuery .html() escape el atributo href automáticamente?

HTML:

<div id="test"><a href="#{one}">#{two}</a></div> 

JS:

$('#test').html() 
=> <a href="#%7Bone%7D">#{two}</a> 

Aviso del #{one} en el href se escapó, mientras que #{two} no lo es.

¿Hay una manera mejor que solo unescape de toda la cadena?

unescape($('#test').html()) 
=> <a href="#{one}">#{two}</a> 

Aquí está el ejemplo: http://jsfiddle.net/kenn/n8veL/

+3

Parece que es un problema específico del navegador. En el motor Googles v8 funciona muy bien. – TimWolla

+0

Ese ancla parece ser una plantilla. ¿Por qué estás analizando una plantilla para el DOM? Las plantillas deben mantenerse en el código fuente (por ejemplo, dentro de un elemento SCRIPT) y procesadas con JavaScript (y solo * luego * analizadas por el navegador). –

+0

TimWolla: maldición! actualizó la pregunta ... – kenn

Respuesta

0

Si usted va a estar realizando una expansión a través de JavaScript en el elemento de todos modos, se puede poner la plantilla "href" en un atributo independiente.

<a href='#dummy' data-href='#{template}'>Hi</a> 

Luego simplemente expanda desde el atributo de datos y suelte el resultado en el "href" real.

+1

Suena como una idea decente, pero lamentablemente en mi caso no es tan bueno como la misma plantilla se comparte en el lado del servidor para algunas páginas estáticas, y duplicar el comportamiento de js en la lógica del servidor parece incómodo. – kenn

+0

Ah, sí, ya veo. Bueno, probablemente no haya un buen trabajo que no sea 'unescape()'. – Pointy

1

Antes que nada, dudo que haya una solución confiable para su pregunta. La razón subyacente es simple: porque el Element.innerHTML que funciona debajo no es estándar y depende únicamente de la implementación del navegador.

Si desea una solución confiable, le sugiero que utilice operaciones DOM en lugar de la plantilla .

+0

Pero ese escape solo se realiza en el atributo "href". Otros atributos no se verán afectados de la misma manera. – Pointy

+0

@Pointy Apuesto a que algunos navegadores (como Firefox) se escapan porque se supone que el 'href' contiene una URL. Entonces, los personajes no permitidos para aparecer en él se escapan. Pero aún así, como dije, es específico del navegador y no tenemos ningún estándar para garantizar su comportamiento. – shinkou

+0

Correcto, pero ningún navegador que he probado ha escapado de un atributo "data-href". En realidad, no importa dónde se guarde la plantilla en el elemento, después de todo. Por supuesto, siempre habría problemas con los metacaracteres HTML en los valores de los atributos, pero para las plantillas simples debería funcionar. – Pointy

Cuestiones relacionadas