[英]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,"
定義的錯誤有關,還是我犯了一個錯誤卻錯過了?
先感謝您
<a href="/download.php?what=PDF_A" onclick="javascript:download
('PDF_A')">Download</a>
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;
}
$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.