2009-10-08 9 views
6

Estoy usando las funciones ajax de jquery para tomar un fragmento de página y mostrarlo en una sección de una página; este fragmento incluye html y referencias a archivos js externos.¿Cómo impido que jquery agregue una identificación única a las secuencias de comandos llamadas a través de ajax?

flujo

El programa es el siguiente:

Página Principal llama -> página fragmento que llama -> varios archivos de gran tamaño a través de etiquetas de script js.

He activado la opción de caché en mi llamada inicial ajax para que la página de fragement se almacene en caché (no se añaden ID únicos a la url), sin embargo, cuando se carga el fragmento, parece que jquery reescribe las URL de las secuencias de comandos incluya una marca de tiempo de Unix para que el navegador descargue una nueva copia de los scripts todo el tiempo. Los scripts que estoy llamando tienen una minima de 250kb y realmente está perjudicando la experiencia del usuario ya que el navegador se bloquea cada vez que se los llama. ¿Es este un comportamiento deseado de jquery? ¿Hay alguna manera de desactivar las reescrituras de URL?

Muchas muchas gracias por su ayuda

Respuesta

4

Parece que la función evalScript de jQuerys le está arruinando ...

Línea 543 de jQuery:

function evalScript(i, elem) { 
    if (elem.src) 
     jQuery.ajax({ 
      url: elem.src, 
      async: false, 
      dataType: "script" 
     }); 

    else 
     jQuery.globalEval(elem.text || elem.textContent || elem.innerHTML || ""); 

    if (elem.parentNode) 
     elem.parentNode.removeChild(elem); 
} 

Aquí está el desglose de lo que sucede: La Página Principal de Llamadas JS:

$.ajax({ 
    url:"frag.htm", 
    type:"GET", 
    success:callBackFunction 
}) 

y obtiene frag.htm que contiene algo como esto:

<html><head><script src="test.js"></script></head><body>Content</body></html> 

entonces su función de devolución de llamada, la cual probablemente se parece a esto:

function callBackFunction(data){ 
    $("#ajaxContent").html(data); // <- this is the beginning of your problems... 
} 

Cuando la función de jQuery HTML (datos) se llama es " limpia "el HTML eliminando cualquier etiqueta de script y luego llama a evalScript en cada uno. evalScript, como puede ver, no especifica "cache: true", por lo tanto, cuando pasa por $ .ajax, la caché es nula. Cuando la memoria caché es nula y el tipo de datos es "secuencia de comandos" jQuery establece caché = falso.

lo tanto, para evitar este problema intente esto:

function callBackFunction(data){ 
    var tempAJAX = $.ajax; // save the original $.ajax 
     $.ajax=function(s){ // wrap the old $.ajax so set cache to true... 
      s.cache=true; 
      tempAJAX(s); // call old $.ajax 
     } 
     $("#ajaxContent").html(data); // insert the HTML and download the <script>s 
     $.ajax = tempAJAX; // reset $.ajax to the original. 
    } 
} 

Antes de insertar el nuevo código HTML de "frag.htm" en la página principal que interceptar todas las llamadas a $ .ajax, modifique el objeto de incluir cache = true, y luego de cargar el script, inserte el HTML.

Avíseme si tiene alguna pregunta.

+0

Fantástico, funciona, gracias! –

+0

No hay problema. De hecho, estoy usando esto en una aplicación que estoy armando ahora. : o) –

0
  1. Fuerza del servidor web para servir a la secuencia de comandos con una fecha de caducidad en el futuro.

  2. Si usa dataType = "script" como una opción para jquery ajax, el almacenamiento en caché se desactivará de forma predeterminada, consulte http://docs.jquery.com/Ajax/jQuery.ajax#options, intente configurarlo manualmente en "html".

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "html" // if not set jquery will guess what type it is and disables caching when matching "script" 
}); 
+0

hola, gracias, pero lo he intentado, sólo la solicitud inicial se está llamando a través de AJAX y que se almacena en caché fina , esa petición Ajax vuelve contenidos como:

  • 11. Cómo "proteger" las llamadas AJAX?
  • 12. jQuery móvil recuperación previa de una página que carga contenido a través de Ajax
  • 13. Las llamadas AJAX a HTTPS no confiable (autofirmado) fallan silenciosamente
  • 14. ¿Cómo se ejecuta una única consulta a través de mysql desde la línea de comandos?
  • 15. jQuery - ¿Cómo PONER JSON a través de Ajax?
  • 16. Cómo llama a varias secuencias de comandos de MSBuild desde una secuencia de comandos de MSBuild
  • 17. Carga de archivos a través de AJAX dentro de JQuery
  • 18. Formulario Symfony2 con CSRF pasado a través de JQuery AJAX
  • 19. jQuery: Cargar Contenido diálogo modal a través de Ajax
  • 20. jQuery 1.5.1 rompe todas las llamadas de ajax()
  • 21. ¿Cómo integrar las secuencias de comandos de Sikuli en Selenium?
  • 22. UUID a la identificación entera única?
  • 23. jQuery y data-attributes para manejar todas las llamadas ajax?
  • 24. Asegurar las solicitudes AJAX a través de GUID
  • 25. ¿Cómo atrapar las excepciones lanzadas en las devoluciones de llamadas pasadas a jQuery?
  • 26. Identificación única de Android
  • 27. Cómo encadenar llamadas ajax usando jquery
  • 28. Consigue desplazamiento de búfer en vim (en particular, a través de secuencias de comandos de Python)
  • 29. ¿Cómo hacer todas las llamadas AJAX secuencialmente?
  • 30. ¿Cómo enviar contenido html a través de una solicitud ajax?