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“异步:假”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 扩展 ajax 发送格式错误的重音字符

Jquery的load加载本地文件出现跨域错误的解决方案

原生和jQuery的ajax用法

JavaScript和Ajax部分

如何使 JQuery-AJAX 请求同步

从Google CDN加载jQuery&jqueryui