JQuery $ .ajax "асинхр: ложная" ошибка?

голоса
1

Я был бы признателен за Ваше мнение / рекомендации по следующим

сценарий

HTML имеет PDF имя файла зарубки, задний конец имеет URL для каждого ника.

URL ссылка всегда download.php? Что =% PDF_Nick%, чтобы обеспечить загрузку для JS клиентов с ограниченными физическими возможностями.

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

проблема

AJAX возвращает правильный сценарий переписывания переменной URL-адрес JS, но location.href снова бежит к исходному URL, создавая дополнительный задний конец вызова

Как вы думаете, что это связано с ошибкой, игнорируя «асинхр: ложный,» определение или это ошибка, которую я сделал, и пропустил поймать?

заранее спасибо

HTML код


    <A HREF = / download.php, что = PDF_A? OnClick = JavaScript: скачать
    ( 'PDF_A') > Скачать </a>

JS код

Функция загрузки (что) {

   вар URL = download.php, что =? + что;

   $ .ajax ({
      типа: GET,
      URL: download.php Аякса = истина,
      данные: «что =» + что
      асинхронный: ложь,
      DATATYPE: сценарий
  });

  // если AJAX получил скачать URL Я ожидаю фактической загрузки, чтобы начать:
  location.href = URL;
}

Назад конец (download.php код)

$ MyPDF = массив ();
$ MyPDF [ PDF_A] = PDF_A.pdf;
....
$ URL = http://mysite.com/. $ MyPDF [ PDF_A];
...
если ($ _GET [ Аякс] === истина) {
    // перезаписать переменную URL-адрес JS
    печать ( 'URL = '. $ URL.; );
} Еще {
    Заголовок (. Расположение: $ URL);
    заголовок ( Connection: близко);
}
Задан 09/12/2008 в 15:55
источник пользователем
На других языках...                            


3 ответов

голоса
4

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

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

Если вы не используете «Var» ключевое слово в объявлении переменной URL-адреса, то он будет создан автоматически в глобальном масштабе, и ваш код будет работать, как вы ожидаете.

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

Ответил 07/01/2009 в 01:19
источник пользователем

голоса
3

Или вы можете использовать синхронный 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;
}
Ответил 09/12/2008 в 16:27
источник пользователем

голоса
3

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

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Ответил 09/12/2008 в 16:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more