簡體   English   中英

jQuery $ .ajax“異步:錯誤”錯誤?

[英]JQuery $.ajax “async: false” bug?

感謝您對以下方面的意見/建議

情境

HTML具有PDF文件的昵稱,后端具有每個昵稱的URL。

鏈接URL始終為download.php?what=%PDF_Nick%以確保為禁用JS的客戶端下載。

對於啟用了JS的客戶端,我進行JQuery AJAX調用,並將鏈接URL從download.php?what=%PDF_Nick%重寫為http://examplesite.com/requestedPFF.pdf以激活從客戶端的下載。 我設置為"async: false"以允許AJAX獲取新的網址。

問題

AJAX返回有效的腳本重寫JS url變量,但是location.href再次運行到初始url,從而創建了額外的后端調用

您是否認為這與忽略"async: false,"定義的錯誤有關,還是我犯了一個錯誤卻錯過了?

先感謝您

HTML代碼


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

JS代碼

function download ( what )  {

   var url = "download.php?what="+what;

   $.ajax({
      type: "GET",
      url: "download.php?ajax=true",
      data: "what=" + what
      async: false,
      dataType: "script"
  });

  // if AJAX got the download URL I expect actual download to start:
  location.href = url;
}

后端(download.php)代碼

$myPDF = array();
$myPDF["PDF_A"] = "PDF_A.pdf";
....
$url = "http://examplesite.com/" . $myPDF["PDF_A"];
...
if ( $_GET["ajax"] === "true" ) {
    // overwrite JS url variable
    print('url = "'.$url.'";');
} else {
    header("Location: ". $url );
    header("Connection: close");
}

您在這里遇到范圍問題。 JS代碼中的URL變量是通過download函數范圍內的var關鍵字聲明的。 這意味着只有下載功能中的代碼才能修改該特定的url值。

從返回的download.php腳本正在修改在全球范圍內(在瀏覽器上,這是“窗口”對象)的URL值,這是一樣的值作為下載功能的范圍內的URL。

如果您在url變量的聲明中不使用'var'關鍵字,它將在全局范圍內自動創建,並且您的代碼將按預期運行。

我同意其他人的看法,但是您的設計存在固有缺陷,因此應該重新考慮。

您是否有理由禁用AJAX請求的異步性質? 它將鎖定瀏覽器,直到請求完成。 您最好改用回調:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});

或者,您可以使用帶有.responseText的同步ajax調用,如以下示例所示:

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

對於您的代碼,這意味着:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM