JQuery $ Schnipsel "async: false" Fehler?

stimmen
1

Ich würde Ihre Meinung / Beratung zu folgenden schätzen

Szenario

HTML PDF-Datei nick Namen hat, zurück Ende für jeden nick URL.

Die Link-URL wird immer download.php? Was% = PDF_Nick% Download für JS behinderte Kunden zu gewährleisten.

Ich JQuery AJAX - Aufruf für JS Kunden aktiviert und schreibe Link - URL von download.php? Was% = PDF_Nick% auf http://mysite.com/requestedPFF.pdf Download vom Client zu aktivieren. Ich habe „async: false“ zu ermöglichen AJAX neue URL erhalten.

Problem

AJAX gibt gültigen Skript JS url Variable Umschreiben, aber location.href läuft wieder auf die ursprüngliche URL, zusätzlichen Backend-Aufruf zu schaffen

Halten Sie es auf den Bug in engem Zusammenhang steht ignorieren „async: false,“ Definition oder es Fehler, den ich gemacht habe und verpasst zu fangen?

Vielen Dank im Voraus

HTML Quelltext


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

JS-Code

Funktion herunterladen (was) {

   var url = download.php was = + was;

   $ Schnipsel ({
      Typ: GET,
      url: download.php ajax = true,
      Daten: what = + was
      async: false,
      datatype: script
  });

  // wenn AJAX die Download-URL bekam erwarte ich, dass tatsächliche Download zu starten:
  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) {
    // JS url Variable überschreiben
    print ( 'url = '. $ url ';');
} Else {
    Header (. Location: $ url);
    header ( Connection: close);
}
Veröffentlicht am 09/12/2008 um 15:55
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
3

Gibt es einen Grund, warum Sie die asynchrone Natur des AJAX-Request deaktivieren? es wird der Browser sperren, bis die Anforderung abgeschlossen ist. Sie sind besser dran, anstatt einen Rückruf verwenden:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Beantwortet am 09/12/2008 um 16:02
quelle vom benutzer

stimmen
3

Oder Sie können einen SYNCHRON Ajax - Aufruf mit verwenden .responseText wie in diesem Beispiel:

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

Für Ihren Code bedeutet dies:

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;
}
Beantwortet am 09/12/2008 um 16:27
quelle vom benutzer

stimmen
4

Sie begegnen ein Scoping-Problem. Das URL-Variable in Ihrem JS-Code wird über das Schlüsselwort var innerhalb des Umfangs der Download-Funktion erklärt. Dies bedeutet, dass nur Code innerhalb der Download-Funktion, dass bestimmten URL-Wert verändern kann.

Das Skript von der download.php zurückgegeben Modifizieren den URL - Wert im globalen Bereich (auf dem Browser, das ist das „Fenster“ Objekt), das ist nicht der gleiche Wert wie die URL innerhalb des Umfangs der Download - Funktion.

Wenn Sie nicht das ‚var‘ Schlüsselwort in der Deklaration des URL-Variable verwenden, wird es automatisch im globalen Bereich erstellt werden und der Code funktioniert wie Sie es erwarten.

Ich stimme mit den anderen, dass Ihr Design von Natur aus fehlerhaft und sollte jedoch überprüft werden.

Beantwortet am 07/01/2009 um 01:19
quelle vom benutzer

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