JQuery $ .ajax“async:false”错误?

时间:2008-12-09 14:55:37

标签: php javascript jquery ajax

我将非常感谢您对以下内容的意见/建议

情景

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”定义的错误相关,或者是我犯了错误并错过了?

提前谢谢

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://mysite.com/" . $myPDF["PDF_A"];
...
if ( $_GET["ajax"] === "true" ) {
    // overwrite JS url variable
    print('url = "'.$url.'";');
} else {
    header("Location: ". $url );
    header("Connection: close");
}

3 个答案:

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