我将非常感谢您对以下内容的意见/建议
情景
HTML有PDF文件昵称,后端有每个昵称的URL。
链接URL始终是download.php?what =%PDF_Nick%以确保为已禁用的JS客户端下载。
对于支持JS的客户端,我执行JQuery AJAX调用并从download.php?what =%PDF_Nick%重写链接URL到http://mysite.com/requestedPFF.pdf以激活从客户端下载。我设置“async:false”以允许AJAX获取新的URL。
问题
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://mysite.com/" . $myPDF["PDF_A"]; ... if ( $_GET["ajax"] === "true" ) { // overwrite JS url variable print('url = "'.$url.'";'); } else { header("Location: ". $url ); header("Connection: close"); }
答案 0 :(得分:4)
你在这里遇到了一个范围问题。 JS代码中的URL变量是通过下载函数范围内的var关键字声明的。这意味着只有下载功能中的代码才能修改该特定的url值。
download.php返回的脚本正在修改全局范围内的URL值(在浏览器上,这是“窗口”对象),不与url相同的值在下载功能范围内。
如果你没有在url变量的声明中使用'var'关键字,它将在全局范围内自动创建,你的代码将按预期运行。
我同意其他人的意见,不过你的设计本质上存在缺陷,应该重新审视。
答案 1 :(得分:3)
您是否有理由禁用AJAX请求的异步性质?它会锁定浏览器,直到请求完成。 你最好使用回调:
$.ajax({
type: "GET",
url: "download.php?ajax=true",
data: "what=" + what,
dataType: "script",
success: function(msg) {
location.href = url;
}
});
答案 2 :(得分:3)
或者你可以像在这个例子中一样使用带有 .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;
}