Ошибка JQuery $ .ajax "async: false"? - PullRequest
1 голос
/ 09 декабря 2008

Буду признателен за ваше мнение / совет по поводу следующего

Сценарий

В HTML есть псевдоним PDF-файла, в конце есть URL для каждого ник.

URL-адрес ссылки всегда является download.php? What =% PDF_Nick%, чтобы обеспечить загрузку для отключенных клиентов JS.

Для клиентов с поддержкой JS я выполняю вызов JQuery AJAX и переписываю URL ссылки с download.php? Чем =% PDF_Nick% до http://mysite.com/requestedPFF.pdf, чтобы активировать загрузку с клиента. Я установил «async: false», чтобы позволить AJAX получить новый URL.

Задача

AJAX возвращает действительный сценарий, переписывающий переменную URL-адреса JS, но 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 ]

4 голосов
/ 07 января 2009

Здесь вы столкнулись с проблемой определения объема. Переменная URL в вашем коде JS объявляется с помощью ключевого слова var в области действия функции загрузки. Это означает, что только код внутри функции загрузки может изменить это конкретное значение URL.

Сценарий, возвращаемый из файла download.php, изменяет значение URL в глобальной области (в браузере это объект "окна"), которое не совпадает со значением внутри URL объем функции загрузки.

Если вы не используете ключевое слово 'var' в объявлении переменной url, оно будет автоматически создано в глобальной области видимости, и ваш код будет работать так, как вы ожидаете.

Я согласен с остальными, что ваш дизайн по своей сути несовершенен и, тем не менее, должен быть пересмотрен.

3 голосов
/ 09 декабря 2008

Или вы можете использовать синхронный вызов ajax с .responseText , как в этом примере:

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;
}
3 голосов
/ 09 декабря 2008

Есть ли причина, по которой вы отключаете асинхронный характер запроса AJAX? он будет блокировать браузер, пока запрос не будет завершен. Вам лучше использовать обратный вызов вместо:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...