JQuery $ .ajax "asin: fals" bug?

voturi
1

Aș aprecia opinia dumneavoastră / consiliere cu privire la următoarele

Scenariu

HTML are fișier PDF nick name, back-end are adresă URL pentru fiecare nick.

Link-ul de URL-ul este întotdeauna download.php? Ceea ce =% PDF_Nick% pentru a se asigura de descărcare pentru clienții cu handicap JS.

Pentru JS activat clienții fac apel JQuery AJAX și rescrie link - ul URL - ul de la download.php? Ce =% PDF_Nick% la http://mysite.com/requestedPFF.pdf pentru a activa descărcare de la client. Am stabilit „asin: fals“ , pentru a permite AJAX obține noua adresă URL.

Problemă

AJAX returnează script valid rescrierea JS variabila URL, dar location.href se execută din nou la URL-ul inițial, creând suplimentar spate terminare apel

Crezi că are legătură cu bug-ul ignorând „asin: fals“, definiția sau greșeala am făcut și a ratat pentru a prinde?

Multumesc anticipat

codul HTML


    <A href = / download.php ce = PDF_A? Onclick = javascript: descărcare
    ( 'PDF_A') > Descărcare </a>

cod JS

Funcția de descărcare (ce) {

   var url = download.php ce =? + ce;

   $ .ajax ({
      tip: GET,
      URL: ? download.php ajax = true,
      Date: „Ce =“ + ce
      async: fals,
      dataType: script
  });

  // dacă AJAX primit URL de descărcare mă aștept descărcare reală pentru a începe:
  location.href = url;
}

Înapoi capăt (download.php) codul

$ MyPDF = array ();
$ MyPDF [ PDF_A] = PDF_A.pdf;
....
$ Url = http://mysite.com/. $ MyPDF [ PDF_A];
...
în cazul în care ($ _GET [ ajax] === true) {
    // suprascrie JS variabila URL
    print ( 'url = '. $ URL. '');
} Else {
    antet (. Locul de amplasare: $ URL);
    antet ( Conexiune: închidere);
}
Întrebat 09/12/2008 la 15:55
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
4

Vă confruntați cu o problemă de definire a domeniului aici. Variabila URL-ul în codul JS este declarată prin cuvântul cheie var în interiorul domeniului de aplicare al funcției de descărcare. Acest lucru înseamnă că numai cod în interiorul funcției de descărcare poate modifica acea valoare URL.

Script - ul întors de la download.php este modificarea valorii URL - ul în domeniul de aplicare la nivel mondial (pe browser - ul, acesta este obiectul „fereastra“), care este nu aceeași valoare ca și adresa URL în interiorul domeniului de aplicare al funcției de descărcare.

Dacă nu utilizați cuvântul cheie „var“ pe declarația variabilei URL, acesta va fi creat automat în domeniul de aplicare la nivel mondial și codul va funcționa așa cum vă așteptați.

Sunt de acord cu ceilalți, că design-ul este în mod inerent eronată și ar trebui să fie revizuite, cu toate acestea.

Publicat 07/01/2009 la 01:19
sursa de către utilizator

voturi
3

Sau puteți utiliza un apel Synchron ajax cu .responseText ca în acest exemplu:

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

Pentru codul aceasta înseamnă:

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;
}
Publicat 09/12/2008 la 16:27
sursa de către utilizator

voturi
3

Există un motiv pentru a dezactiva natura asincronă a cererii AJAX? acesta va bloca browser-ul până când cererea este finalizată. Sunteți mai bine folosind un apel invers în schimb:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Publicat 09/12/2008 la 16:02
sursa de către utilizator

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