JQuery $ .ajax "async: false" błąd?

głosy
1

Byłbym wdzięczny swoją opinię / porady na poniższych

Scenariusz

HTML ma pliku PDF pseudonim, back-end ma URL dla każdego nicka.

Link URL jest zawsze download.php? Co =% PDF_Nick% do zapewnienia pobrania dla JS klientów niepełnosprawnych.

JS włączone dla klientów zrobić jQuery AJAX zadzwonić i przepisać łącza URL z download.php? Co =% PDF_Nick% do http://mysite.com/requestedPFF.pdf aktywować pobrać z klientem. I ustaw async: false, aby umożliwić AJAX uzyskać nowy adres URL.

Problem

AJAX zwraca poprawny skrypt przepisywanie url zmiennej JS, ale location.href biegnie ponownie do początkowego adresu URL, tworząc dodatkową tylną zakończenia połączenia

Czy uważasz, że jest to związane z błędem ignorowanie „async: false”, definicji czy to błąd zrobiłem i nieodebranych złapać?

Z góry dziękuję

Kod HTML


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

kod JS

Pobieranie funkcji (co) {

   var url = download.php co = + co;

   $ .ajax ({
      wpisać: GET,
      url: download.php ajax = true
      Dane: „co =” + co
      async: false,
      dataType: skrypt
  });

  // jeśli AJAX dostał pobierania URL Spodziewam rzeczywista pobieranie, aby rozpocząć:
  location.href = url;
}

Back-end (download.php) kod

$ MyPDF = tablica ();
$ MyPDF [ PDF_A] = PDF_A.pdf;
....
$ Url = http://mysite.com/. $ MyPDF [ PDF_A];
...
if ($ _GET [ ajax] === true) {
    // zastąpić zmienną url JS
    print ( 'url = '. $ url.; ');
} Else {
    Nagłówek (. Lokalizacja: $ url);
    header ( Connection: close);
}
Utwórz 09/12/2008 o 15:55
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
4

Jesteś napotykają problem określania zakresu tutaj. Zmienna URL w kodzie JS jest deklarowana przez słowa kluczowego var wewnątrz zakresu funkcji pobierania. Oznacza to, że tylko kod wewnątrz funkcji pobierania mogą modyfikować tę szczególną wartość URL.

Skrypt wrócił z download.php modyfikuje wartość URL w zasięgu globalnym (w przeglądarce, jest to „okno” object), który jest nie taka sama wartość jak adres URL wewnątrz zakresu funkcji pobierania.

Jeśli nie używać „var” słowa kluczowego w deklaracji zmiennej zawartości, to zostanie utworzony automatycznie w zasięgu globalnym i Twój kod będzie działać zgodnie z oczekiwaniami.

Zgadzam się z innymi, że projekt jest z natury wadliwa i powinna zostać zweryfikowana, jednak.

Odpowiedział 07/01/2009 o 01:19
źródło użytkownik

głosy
3

Lub można użyć połączenia synchron ajax z .responseText jak w poniższym przykładzie:

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

Dla kodu oznacza to:

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;
}
Odpowiedział 09/12/2008 o 16:27
źródło użytkownik

głosy
3

Czy istnieje powód wyłączenia asynchroniczną naturę żądania AJAX? będzie zablokować przeglądarkę aż wniosek zostanie zakończona. Jesteś lepiej wyłączyć za pomocą zwrotnego zamiast:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Odpowiedział 09/12/2008 o 16:02
źródło użytkownik

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