JQuery $.ajax“异步:假”错误?
Posted
技术标签:
【中文标题】JQuery $.ajax“异步:假”错误?【英文标题】:JQuery $.ajax "async: false" bug? 【发布时间】:2010-09-26 01:31:33 【问题描述】:感谢您对以下内容的意见/建议
场景
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 获取新的url。
问题
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");
【问题讨论】:
【参考方案1】:您在此处遇到了范围界定问题。 JS 代码中的 URL 变量是通过下载函数范围内的 var 关键字声明的。这意味着只有下载函数中的代码才能修改该特定的 url 值。
download.php 返回的脚本正在修改全局范围内的 URL 值(在浏览器上,这是“窗口”对象),它与 url 的值不在下载函数的范围内。
如果您在 url 变量的声明中不使用 'var' 关键字,它将在全局范围内自动创建,您的代码将按预期运行。
我同意其他人的观点,您的设计本身就有缺陷,应该重新审视。
【讨论】:
【参考方案2】:您是否有理由禁用 AJAX 请求的异步特性?它将锁定浏览器,直到请求完成。 你最好使用回调:
$.ajax(
type: "GET",
url: "download.php?ajax=true",
data: "what=" + what,
dataType: "script",
success: function(msg)
location.href = url;
);
【讨论】:
现代浏览器仍然实际上锁定?我很难相信这一点。异步请求被完全高估了。【参考方案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;
【讨论】:
我使用了一个不工作的同步调用成功传回我的变量。这帮助很大,谢谢。话虽如此,我将寻求更正我的代码以使其异步,但是有一些缓解因素。以上是关于JQuery $.ajax“异步:假”错误?的主要内容,如果未能解决你的问题,请参考以下文章