O seguinte funciona em todos os navegadores, exceto no IE (estou testando no IE 9).
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert('marked as read');
},
error: function(a,b,c) {
alert('failed');
},
type: 'post'
}
);
Eu tenho outra função que usa dataType: 'jsonp'
, mas não preciso de nenhum dado retornado nessa chamada AJAX. Meu último recurso será retornar algumas bobagens envoltas em JSONP apenas para fazê-lo funcionar.
Alguma idéia de por que o IE está estragando uma solicitação CORS que não retorna dados?
jquery
internet-explorer-9
cross-domain
jsonp
cors
Garrett
fonte
fonte
Respostas:
Este é um bug conhecido do jQuery. A equipe do jQuery "não tem planos de suportar isso no núcleo e é mais adequada como um plug-in". (Veja este comentário ). O IE não usa o XMLHttpRequest , mas um objeto alternativo chamado XDomainRequest .
Não é um plugin disponível para apoiar isso em jQuery, que pode ser encontrada aqui : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDIT A função
$.ajaxTransport
registra uma fábrica de transportadores. Um transportador é usado internamente pelo$.ajax
para executar solicitações. Portanto, suponho que você consiga ligar$.ajax
normalmente. Informações sobre transportadores e extensão$.ajax
podem ser encontradas aqui .Além disso, uma versão talvez melhor deste plugin pode ser encontrada aqui .
Duas outras notas:
Editar 2: problema de http para https
Fonte: http://blogs.msdn.com/b/ieinternals/archive/2010/05/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
fonte
http
parahttps
), domínios (google.com
parabing.com
), subdomínios (mail.google.com
paramaps.google.com
) ou protocolos (google.com:80
- a porta padrão paragoogle.com:8080
) acionará uma solicitação de "domínio cruzado". Basicamente, tudo o que precede o primeiro/
no seu URL precisa ser idêntico.Com base na resposta aceita por @dennisg, consegui isso com sucesso usando jQuery.XDomainRequest.js do MoonScript.
O código a seguir funcionou corretamente no Chrome, Firefox e IE10, mas falhou no IE9. Simplesmente incluí o script e agora funciona automaticamente no IE9. (E provavelmente 8, mas ainda não testei.)
fonte
Instruções completas sobre como fazer isso usando o plug-in "jQuery-ajaxTransport-XDomainRequest" podem ser encontradas aqui: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
Este plugin é suportado ativamente e lida com HTML, JSON e XML. O arquivo também está hospedado no CDNJS, para que você possa soltar diretamente o script em sua página sem nenhuma configuração adicional: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js
fonte
O problema é que o IE9 e abaixo não suportam o CORS. O XDomainRequest suporta apenas GET / POST e o
text/plain
tipo de conteúdo, conforme descrito aqui: http://blogs.msdn.com/b/ieinternals/archive/2010/05/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspxPortanto, se você quiser usar todos os verbos HTTP e / ou json, etc, precisará usar outra solução. Eu escrevi um proxy que fará o downgrade para proxy se o IE9 ou menos for usado. Você não precisa alterar seu código se estiver usando o ASP.NET.
A solução está em duas partes. O primeiro é um script jquery que se conecta ao processamento ajax do jQuery. Ele chamará automaticamente o servidor da Web se uma solicitação crossDomain for feita e o navegador for IE:
No servidor da web, você precisa receber a solicitação, obter o valor do cabeçalho http X-CorsProxy-Url e fazer uma solicitação HTTP e, finalmente, retornar o resultado.
Minha postagem no blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
fonte
Acabei de fazer todos os pedidos JSONP, porque era a única solução para todos os nossos navegadores suportados (IE7 + e regulares). Lembre-se, sua resposta tecnicamente funciona para o IE9, para que você tenha a resposta correta.
fonte
Com base na solução do MoonScript, você pode tentar isso:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
O benefício é que, como é uma solução de nível inferior, ele habilita o CORS (na medida do possível) no IE 8/9 com outras estruturas, não apenas com o jQuery. Eu tive sucesso usando-o com o AngularJS, assim como o jQuery 1.xe 2.x.
fonte
Obtendo um JSON entre domínios com jQuery no Internet Explorer 8 e versões mais recentes
Link muito útil:
http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/
Pode ajudar com o problema de retornar o json de uma solicitação de domínio X.
Espero que isso ajude alguém.
fonte
Para resolver esse problema, verifique também se você incluiu alguns .js no arquivo ajax chamado: Recebi erro de acesso negado ao incluir shadowbox.js no meu ajax.php
fonte
Eu estava testando um serviço da web CORS na minha máquina de desenvolvimento e estava recebendo a mensagem de erro "Acesso negado" apenas no IE. Firefox e Chrome funcionaram bem. Acontece que isso foi causado pelo uso do host local na chamada ajax! Portanto, o URL do meu navegador era algo como:
http: //my_computer.my_domain.local/CORS_Service/test.html
e minha chamada ajax dentro do test.html era algo como:
Tudo funcionou depois que eu mudei a chamada ajax para usar o IP do meu computador em vez do localhost.
A guia "Rede" da janela de ferramentas de desenvolvimento do IE também mostra a solicitação CORS Preflight OPTIONS seguida pelo XMLHttpRequest GET, que é exatamente o que eu esperava ver.
fonte
Atualize a partir do início de 2015. O xDomain é uma biblioteca amplamente usada para suportar o CORS no IE9 com codificação extra limitada.
https://github.com/jpillora/xdomain
fonte
Tente usar o plug - in jquery-transport-xdr jQuery para solicitações CORS no IE8 / 9.
fonte
Nota - Nota
não use " http://www.domain.xxx " ou " http: // localhost / " ou "IP >> 127.0.0.1" para URL no ajax. use somente o caminho (diretório) e o nome da página sem endereço.
estado falso:
verdadeiro estado:
fonte