JQuery $ .ajax "async: false" ¿error?

votos
1

Agradecería su opinión / consejo sobre lo siguiente

Guión

HTML tiene un apodo de archivo PDF, el extremo posterior tiene URL para cada nick.

La URL del enlace siempre es download.php? What =% PDF_Nick% para garantizar la descarga de clientes con discapacidad JS.

Para los clientes habilitados para JS, hago una llamada a JQuery AJAX y reescribo la URL del enlace de download.php? What =% PDF_Nick% a http://mysite.com/requestedPFF.pdf para activar la descarga desde el cliente. Configuré async: false para permitir que AJAX obtenga una nueva url.

Problema

AJAX devuelve un script válido que reescribe la variable url de JS, pero location.href se ejecuta nuevamente en la url inicial, creando una llamada de fondo adicional

¿Crees que está relacionado con el error que ignora la definición async: false o es un error que cometí y dejé de captar?

Gracias de antemano

Código HTML


    <a href = / download.php? what = PDF_A onclick = javascript: descargar
    ('PDF_A') > Descargar </a>

Código JS

descarga de función (qué) {

   var url = download.php? what = + qué;

   $ .ajax ({
      tipo: GET,
      url: download.php? ajax = true,
      datos: qué = + qué
      async: falso,
      dataType: script
  });

  // si AJAX obtuvo la URL de descarga, espero que comience la descarga real:
  location.href = url;
}

Código de fondo (download.php)

$ myPDF = array ();
$ myPDF [PDF_A] = PDF_A.pdf;
....
$ url = http://misitio.com/. $ myPDF [PDF_A];
...
if ($ _GET [ajax] === true) {
    // sobrescribe la variable url JS
    print ('url = '. $ url. ';');
} else {
    encabezado (Ubicación:. $ url);
    encabezado (Conexión: cerrar);
}
Publicado el 09/12/2008 a las 15:55
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
4

Estás encontrando un problema de alcance aquí. La variable URL en su código JS se declara a través de la palabra clave var dentro del alcance de la función de descarga. Esto significa que solo el código dentro de la función de descarga puede modificar ese valor de url particular.

El script devuelto por download.php modifica el valor de la URL en el ámbito global (en el navegador, este es el objeto "ventana"), que no tiene el mismo valor que la url dentro del alcance de la función de descarga.

Si no usa la palabra clave 'var' en la declaración de la variable url, se creará automáticamente en el alcance global y su código funcionará como esperaba.

Estoy de acuerdo con los demás, que su diseño es intrínsecamente defectuoso y debe ser revisado, sin embargo.

Respondida el 07/01/2009 a las 01:19
fuente por usuario

votos
3

O puede usar una llamada ajax sincronizada con .responseText como en este ejemplo:

var html = $.ajax({
  url: "some.php",
  async: false
}).responseText;

Para su código esto significa:

function download ( what )  {
  var url = "download.php?what="+what;

  location.href = $.ajax({
       type: "GET",
       url: "download.php?ajax=true",
       data: "what=" + what
       async: false,
       dataType: "script"
  }).responseText;
}
Respondida el 09/12/2008 a las 16:27
fuente por usuario

votos
3

¿Hay alguna razón para desactivar la naturaleza asincrónica de la solicitud AJAX? bloqueará el navegador hasta que se complete la solicitud. Es mejor utilizar una devolución de llamada en su lugar:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Respondida el 09/12/2008 a las 16:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more