JQuery $ .ajax "async: false" bug?

stemmen
1

Ik zou uw mening / advies op prijs stellen op de volgende

Scenario

HTML heeft PDF-bestand bijnaam, back-end heeft URL voor elke nick.

De link URL wordt altijd download.php? Wat =% PDF_Nick% te downloaden voor JS gehandicapte klanten te waarborgen.

Voor JS clients ik doen JQuery AJAX call en herschrijven URL van koppeling van download.php? Wat =% PDF_Nick% tot http://mysite.com/requestedPFF.pdf te downloaden van de cliënt te activeren. Ik stel async: false om AJAX te krijgen nieuwe url.

Probleem

AJAX terugkeert geldig script herschrijven JS url variabel, maar location.href loopt weer naar de oorspronkelijke url, het creëren van extra back-end call

Denk je dat het in verband met de bug te negeren async: false, definition of het is fout die ik heb gemaakt en miste te vangen?

Dank u bij voorbaat

HTML code


    <A href = / download.php wat = PDF_A? Onclick = javascript: download
    ( 'PDF_A') > Download </a>

JS code

functie download (wat) {

   var url = download.php wat = + wat;

   $ .ajax ({
      typt u: GET,
      url: download.php ajax = true,
      gegevens: what = + wat
      async: false,
      dataType: script
  });

  // als AJAX kreeg de download-URL verwacht ik werkelijke download te beginnen:
  location.href = url;
}

Back end (download.php) code

$ MyPDF = array ();
$ MyPDF [ PDF_A] = PDF_A.pdf;
....
$ Url = http://mysite.com/. $ MyPDF [ PDF_A];
...
if ($ _GET [ ajax] === true) {
    // overschrijven JS url variabele
    afdrukken ( 'url = '. $ url. ';');
} Else {
    header (. Location: $ url);
    header ( Connection: close);
}
De vraag is gesteld op 09/12/2008 om 15:55
bron van user
In andere talen...                            


3 antwoorden

stemmen
4

U ondervindt hier een scoping probleem. De URL-variabele in uw JS code wordt gedeclareerd via de var trefwoord binnen de reikwijdte van de downloadfunctie. Dit betekent dat alleen de code in de download functie die bepaalde URL waarde kan wijzigen.

Het script terug van de download.php is het wijzigen van de URL-waarde in het globale bereik (aan de browser, dit is de "venster" object), die niet dezelfde waarde als de url in de omvang van de downloadfunctie.

Als u niet de 'var' keyword te gebruiken op de verklaring van de URL-variabele, wordt deze automatisch aangemaakt in het globale bereik en uw code zal naar verwachting functioneert.

Ik ben het eens met de anderen, dat uw ontwerp is inherent gebrekkig en moeten worden herzien, echter.

antwoordde op 07/01/2009 om 01:19
bron van user

stemmen
3

Of u kunt een synchroon ajax oproep met gebruik .responseText zoals in dit voorbeeld:

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

Voor uw code betekent dit:

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;
}
antwoordde op 09/12/2008 om 16:27
bron van user

stemmen
3

Is er een reden dat je de asynchrone aard van de AJAX verzoek uit te schakelen? het zal de browser te vergrendelen totdat het verzoek is voltooid. Je bent beter af met behulp van een callback plaats:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
antwoordde op 09/12/2008 om 16:02
bron van user

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