Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luc.Vysk

Ajax não funciona(as vezes) no IE

Recommended Posts

Galera,

boa noite.

 

Estou com sérios problemas com o uso do ajax. Estou fazendo um site, e o cliente pediu que tivesse um player de música no site dele. Não poderia usar link normal, pois se não a música começaria denovo.

Optei por usar ajax, fugindo de iframe. Nunca havia trabalhado com ele antes.

 

Entre todos os problemas que tive(lightbox) e etc, hoje, quando pensava que tudo estava funcionando e fui colocar o site no ar, o ajax para de funcionar no IE. Mas só no IE do Cliente e do meu chefe, parece brincadeira né?!

 

O site é feito no sistema wordpress, e já funcionava online, no entanto, bastou eu tirar a função que verifica se o usuário está logado ou não, que o problema começou. Vale dizer que que o site é composto por um slide de fundo(ocupando a tela toda) em flash, um player(flash) e as páginas posicionadas sobre esse fundo(css). No entanto no ie do meu chefe, pude verificar que o flash do player não estava chamando o XML da música, e de uma amiga minha também. Logo, pode-se deduzir que se o ajax tem problema, o player também, ou vice-versa, apesar de nenhum ter alguma relação entre o outro.

Procurei um pouco e acredito que o problema seja em alguna filtros de segurança do IE, quando os mesmos estão ativados.

 

O engraçado é que se eu chamo um página interna separada, por exemplo: http://www.****.com/quem-somos, o ajax funciona normalmente. Sendo que ele chama o mesmo header, tudo.

 

A minha pergunta é, existe uma solução ou algum tipo de função que diga para caso a página não for carregada em ajax abra como link normal??

 

Dêem um olhada no código:

 

$(".menu li a").click(function(event) {
event.preventDefault(); 
var toLoad = $(this).attr('href')+' #conteudo';

 $('#load').remove();
 $('body').append('<span id="load"></span>');
 $('#load').fadeIn('slow');

 $("#conteudo").slideUp('slow', function() {
     $("#conteudo").load(toLoad, function () {
	 $(this).slideDown('slow',hideLoader(), slideProdutos(), resizeSide() );
     });
 });

function hideLoader() {
     $('#load').fadeOut('slow');		
} 
});

 

Explicando:

Eu comecei de maneira errada, e fui me complicando cada vez mais que tentava tapar buraco.

Reparem:

eu tenho o site normal, onde todas as páginas abrem com a função acima, porém eu tenho uma página Produtos, que deve usar a mesma função, daí que eu chamo "slideProdutos()". Estúpido né?! É, como falei, comecei tudo errado.

O "resizeSide()" é apenas para controlar a altura da barra lateral, que deve ser 100%. Pórém como ela tem um "buraco", que pediram que pulasse o menu, não funcionaria com css, logo coloquei o javascript que sempre controla a altura dela.

 

Seria muito mais fácil com a imagem do layout, no entanto eu estou em casa, e só tenho essa imagem no trabalho.

Espero muito que vocês possam me ajudar, qualquer coisa, por favor. Que eu não aguento mais esse site.

 

 

Att. Lucas

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe uma solução ou algum tipo de função que diga para caso a página não for carregada em ajax abra como link normal??

a requisição ajax pode falhar, então não vai retornar o 200.

 

ai você pode capturar com um error

 

no caso, se o suporte a js estiver desabilitado, acho q o teu sistema já resolve. Então a unica coisa q pensei, foi a requisição falhar, ai você será direcionado para o error.

veja trocando o .load() por um $.ajax() ai você vai ter mais controle do retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente, muito obrigado por me responder. Você foi o único nas minhas tentativas, rs.

 

Veja bem, tentei usar, e não adiantou. Veja se fiz certo, por favor:

 

$("#conteudo").slideUp('slow', function() {
   $("#conteudo").ajax({ url: toLoad, success: function(msg){  alert(msg); } });	 
});

 

No entanto, procurei um pouco mais e encontrei esse tópico: http://forum.imasters.com.br/topic/435279-ajax-nao-funciona/

 

A função ajaxInit() chama alguns termos XML, que nunca vi ou usei, e acredito que pode ser uma solução, ou não?! já que o o xml do player também não funciona. Vale lembrar que o flash de fundo também chama as imagens de um XML.

 

O layout é nessa estrutura:

 

layoutpsd.th.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

oque eu pensei, foi isso aqui:

 

$.ajax({ 
  url: toLoad, 
  success: function( msg ){  
       alert( msg ); 
  },
  error: function( msg ){
       document.location.href = toLoad;
  }
});

entendeu ?

 

caso a requisição falhar, vai jogar para o error, e ai você redireciona "na mão".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada William, parece que ele "pula" a função. Pois ele não dá alerta em caso de sucesso, nem em caso de erro.

 

Vale lembrar, que nas páginas internas do site o ajax funciona. Por isso que para mim não faz sentido algum. Estou procurando sobre esse "XMLHttpRequest()", você acha que tem alguma relação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada William, parece que ele "pula" a função. Pois ele não dá alerta em caso de sucesso, nem em caso de erro.

Okay, conhece o Firebug ?

 

Aperte Ctrl+Shif+J no teu Firefox. Vamos rastrear essa requisição.

Duas leituras pertinentes:

 

http://wbruno.com.br/blog/2011/03/31/como-debugar-javascript-firefox-erros-comuns/

http://wbruno.com.br/blog/2011/04/14/como-debugar-ajax-firebug/

 

 

Estou procurando sobre esse "XMLHttpRequest()", você acha que tem alguma relação?

não cara.

 

você está usando jQuery. Portanto dentro da lib, existe o objeto XMLHttpRequest, só que escondido dos teus olhos. Entendeu ?

o .load() usa o $.ajax() que por sua vez usa o objeto XMLHttpRequest()

 

no caso, você está usando uma lib que te esconde os processos da linguagem javascript. Isso não é um problema.

Mas não entendi essa historia de funcionar nas internas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, no caso foi um erro meu mesmo não ter usado o Fire antes, pois estava mais preocupado com o IE.

 

O erro é esse:

 

Erro: $("#conteudo").ajax is not a function
Arquivo-fonte: ****
Linha: 15

 

Mas essa função é assim mesmo?

" $("#conteudo").ajax({ "

 

Eu posso ter passar o link do site por msg para você dar uma olhada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não.

 

a função é assim:

 

 

$.ajax({
  //..
});

acompanhe no manual:

 

http://api.jquery.com/jQuery.ajax/

 

 

 

desculpe, falha minha não ter corrigido isso no meu post acima. Eh que eu estava mais preocupado com a funcionalidade, doq com a sintaxe.

Va debugando ai e corrigindo. Leu os 2 posts? Não sei o teu nivel de conhecimento, mas serão de grande valia nessa empreitada.

 

 

 

Cara, num rola eu ver por MP.. tb tenho trabalho pra fazer.. oq puder vai colocando aqui no tópico, até pq você não depende de mim. Outros usuarios podem te ajudar.

E se eu não estiver disponível, ou demorar para voltar, é pq tb tenho todo o restante do fórum para olhar :lol:

 

boa sorte, vá postando conforme tenha duvidas ou progressos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não queria deixar aberto para preservar o cliente. Descobri que o problema é mesmo o de filtro de segurança do navegador.

E as vezes (nos outros pcs) funciona, as vezes não. Além de que o IE8 tem um bug no código, que precisa de atualização.

Provavelmente não vai funcionar no pc do cliente, pelo velho e bom karma.

 

Logo, para passar pelo fim de semana, coloquei um código para verificar se o navegador é ie, ele carrega a página normalmente, se não, com ajax.

 

Assim eu ganho um tempo para procurar na internet uma condição para verificar se o filtro de segurança está ativado ou não. Se alguem souber, eu agradeço.

 

Eu não consegui de jeito nenhum usar o $.ajax(). Se você tiver algum código parecido com o que eu usei usando essa função, você poderia me passar?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Descobri que o problema é mesmo o de filtro de segurança do navegador.
como assim ?

está fazendo requisições cross domain ?

 

 

 

Eu não consegui de jeito nenhum usar o $.ajax(). Se você tiver algum código parecido com o que eu usei usando essa função, você poderia me passar?

http://wbruno.com.br/blog/2011/05/27/navegacao-sem-refresh-%E2%80%93-carregando-conteudo-ajax-em-div-2/

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Chrome, quando dá o erro, ele fala sobre crossdomain.xml. Mas não faço a mínima idéia do que seja.

 

Penso que é o filtro por que o XML do player também não funciona, e se eu desativo o filtro de segurança, funciona(tudo). Ou seja, pode ser isso. O engraçado é que existem 2 flashs, e ambos chamam XML (diferentes). Acredito que seja a programação do AS, um é 2 e outro 3, sei lá.

 

Um cara me falou também que como a URL amigável chama link completo (http://...) pode cair no filtro, mas não acho que tenha relação.

 

Vou testar o $.ajax amanhã de manhã e dou uma resposta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um cara me falou também que como a URL amigável chama link completo (http://...) pode cair no filtro, mas não acho que tenha relação.

sim, exatamente.

 

se você chamar o caminho completo com http://, o navegador vai entender q você esta fazendo requisições externas, por isso cai no filtro de crossdomain.

 

não use http://, use caminhos relativos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça alguns testes, e antes de enviar para o ajax, remova o caminho absoluto, passando apenas uma URL relativa. (manipulação de string)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A minha pergunta era para saber como fazer essa manipulação para funcionar no wordpress rs.

 

Mas tá beleza cara, o $.ajax() funcionou. Nem acredito... rs

 

O único problema é que essa função acaba carregando o css da classe, invés de carregar só o id. Ou seja, nas página mais internas (produtos>produtos2) se por exemplo eu tivesse uma margem superior “80px”, na página produtos2 eu teria “160px”. Eu não consegui resolver nem com “position:absolute”. O que fiz foi retirar a classe mesmo, ai o problema seria quando não tivesse js, que ia carregar com a página colada no menu, mas isso é o de menos.

 

Só peço que não feche o tópico ainda, por que funcionou no pc aqui da agência. Até o final do dia eu procuro falar com o cliente. Agora não dá por que o atendimento não está aqui.

 

Mas brigadão pela atenção cara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A minha pergunta era para saber como fazer essa manipulação

independe ser wordpress ou não.

 

essa manipulação é javascript básico.

você pode usar o método .replace(), substr() e dai em diante..

 

 

o problema do teu css duplicado, pode ser por você estar carregando um elemento dentro dele mesmo.

ai a idéia é que você reduza o scopo do q vai ser carregado. Dá uma analisada o HTML virtual q foi carregado, usando o Firebug (inspecionar elemento).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim beleza, mas para abrir uma página do wordpress sem o link completo, dá?! Como que faria para passar os termos (id) ?

 

Mas, entretanto, muito obrigado mesmo. O cliente já viu e está tudo certo! Brigadão mesmo.

 

E apesar de eu estar fugindo do Ajax, ele me persegue e logo logo eu já vou estar aqui de volta, rs.

 

Valeu cara, abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.