JQuery $ .ajax "async: false" bug?

votos
1

Gostaria muito de receber a sua opinião / conselhos sobre o seguinte

Cenário

HTML tem arquivo PDF apelido, back-end tem URL para cada nick.

O link URL é sempre download.php? O =% PDF_Nick% para garantir a transferência para JS clientes com mobilidade condicionada.

Para JS clientes habilitados eu faço chamada JQuery AJAX e reescrever URL link de download.php? O =% PDF_Nick% a http://mysite.com/requestedPFF.pdf para ativar transferência a partir do cliente. I set async: false para permitir AJAX obter nova url.

Problema

AJAX retorna roteiro válido reescrever JS variável url, mas location.href corre novamente para a URL inicial, criando chamada back-end adicional

Você acha que isso está relacionado com o bug ignorando async: false, definição ou é erro que eu fiz e perdeu para pegar?

Agradeço antecipadamente

Código HTML


    <A href = / download.php o = PDF_A? Onclick = javascript: Download
    ( 'PDF_A') > Baixar </a>

código JS

Download função (o) {

   var url = download.php o =? + o;

   $ .ajax ({
      digite: GET,
      url: download.php ajax = true,
      dados: o = + o
      async: false,
      dataType: script
  });

  // se AJAX tem o URL de download espero download real para começar:
  location.href = URL;
}

back-end código (download.php)

$ MyPDF = matriz ();
$ MyPDF [ PDF_A] = PDF_A.pdf;
....
$ Url = http://mysite.com/. $ MyPDF [ PDF_A];
...
if ($ _GET [ ajax] === true) {
    // substituir JS variável url
    print ( 'url = '. $ url. ';');
} outro {
    cabeçalho (. Localização: $ url);
    header ( Connection: close);
}
Publicado 09/12/2008 em 15:55
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Existe uma razão que você desativar a natureza assíncrona do pedido AJAX? ele irá travar o navegador até que a solicitação seja concluída. Você é melhor fora de usar uma chamada de retorno em vez disso:

$.ajax({
  type: "GET",
  url: "download.php?ajax=true",
  data: "what=" + what,
  dataType: "script",
  success: function(msg) {
      location.href = url;
  }
});
Respondeu 09/12/2008 em 16:02
fonte usuário

votos
3

Ou você pode usar uma chamada synchron ajax com .responseText como neste exemplo:

var html = $.ajax({
  url: "some.php",
  async: false
}).responseText;

Para o seu código, isso significa:

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;
}
Respondeu 09/12/2008 em 16:27
fonte usuário

votos
4

Você está encontrando um problema de escopo aqui. A variável URL em seu código JS é declarada via a palavra-chave var dentro do escopo da função de download. Isto significa que somente o código dentro da função de download pode modificar esse valor url particular.

O script retornado do download.php está modificando o valor URL no escopo global (no navegador, este é o objeto "janela"), que é não o mesmo valor que a url dentro do escopo da função de download.

Se você não usar a palavra-chave 'var' na declaração da variável url, ele será criado automaticamente no escopo global e seu código funcionará como o esperado.

Concordo com os outros, que o seu design é inerentemente defeituoso e deve ser revista, no entanto.

Respondeu 07/01/2009 em 01:19
fonte usuário

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