Pregunta

Tengo una función genérica que devuelve las URL. (Es una función de complemento que devuelve las URL a los recursos [imágenes, hojas de estilo] dentro de un complemento).

Utilizo los parámetros GET en esas URL.

Si quiero usar estas URL dentro de una página HTML, para aprobar la validación W3C, necesito enmascarar los ampersands como &

/plugin.php?plugin=xyz&resource=stylesheet&....

Pero, si quiero usar la URL como el parámetro "URL" para una llamada AJAX, el ampersand no se interpreta correctamente, arruinando mis llamadas.

¿Puedo hacer algo Get & Work en Ajax Llamadas?

Me gustaría evitar agregar parámetros a la función de generación de URL (intendedUse = "Ajax" o lo que sea) o manipular la URL en JavaScript, ya que este modelo de complemento será reutilizado muchas veces (y posiblemente por muchas personas) y yo Quiero lo más simple posible.

¿Fue útil?

Solución

Me parece que te estás encontrando con el problema de tener una pieza de tu aplicación cruzan múltiples capas. En este caso es el complemento.

Una URL según lo especificado por RFC 1738 establece que una URL debe usar un & Token para separar los pares de clave/valor entre sí. Sin embargo, Ampersand es un token reservado en HTML y, por lo tanto, debe escaparse a &. Dado que escapar de los Ampersands es un artefacto de HTML, su complemento probablemente no debería escaparlos directamente. En su lugar, debe tener una función o algo que escape de una URL canónica para que pueda incrustarse en el marcado HTML.

Otros consejos

El único lugar en el que es probable que esto suceda es si es:

  • Usando xhtml
  • Servirlo como texto/html
  • Usando en línea <script>

Esta no es una combinación feliz, y la solución es en la especificación.

Use scripts externos si su script usa <o & o]]> o -.

La nota de tipos de medios XHTML incluye el mismo consejo, pero también proporciona una solución Si elige ignorarlo.

Intente devolver JSON en lugar de solo una cadena, de esa manera su JavaScript puede leer el valor de URL como un objeto, y no debería tener ese problema. Aparte de eso, intente simplemente HTML decodificando la cadena, usando algo como:

function escapeHTML (str)
{
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML;
}; 

Obviamente, querrá asegurarse de eliminar cualquier referencia a los elementos DOM que pueda crear (que no he hecho aquí para simplificar el ejemplo).

Utilizo esta técnica en los sitios AJAX que creo en mi trabajo y la he usado muchas veces para resolver este problema.

Cuando tienes marcado del formulario:

<a href="?a=1&amp;b=2">

Entonces el valor del href El atributo es ?a=1&b=2. los &amp; es solo una secuencia de escape en HTML/XML y no afecta el valor del atributo. Esto es similar a:

<a href="&lt;&gt;">

Donde el valor del atributo está <>.

Si, en cambio, tiene código del formulario:

<script>
var s = "?a=1&b=2";
</script>

Entonces puede usar una función JavaScript:

<script>
var amp = String.fromCharCode(38);
var s = "?a=1"+amp+"b=2";
</script>

Esto permite que el código que de otro modo solo sería válido HTML o solo XHTML válido sean válidos en ambos. (Consulte los comentarios de Dorwald para obtener más información).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top