Pergunta

Eu encontrei um problema ao recuperar um JSONP resposta de um servidor em um domínio diferente usando o IE6.

Quando eu fazer a mesma chamada AJAX usando JSONP para um servidor no mesmo domínio da página da web, tudo vai bem em todos os navegadores (incluindo IE6).No entanto, quando eu fazer chamadas entre domínios (XSS) usando JSONP, o Internet Explorer 6 trava.Especificamente, os picos de CPU a 100% e o "sucesso" de retorno de chamada nunca é atingido.A única vez que eu tive sucesso entre domínios é quando a resposta é muito curto (menos de 150 bytes normalmente).O comprimento da resposta parece importante.

Estou usando o jQuery 1.2.6.Eu tentei o $.getJSON() e o método $.ajax(tipo de dados:"jsonp") método sem sucesso.Isso funciona lindamente no FF3 e IE7.Eu não tenho sido capaz de encontrar qualquer pessoa com um problema semelhante.Eu pensei que este tipo de funcionalidade foi totalmente suportado pelo jQuery no IE6.

Qualquer ajuda é muito apreciada,

André


Aqui está o código para a página html de fazer a chamada AJAX.Fazer uma cópia local do ficheiro (e a biblioteca jquery) e dar-lhe um tiro usando o IE6.Para mim, ele sempre faz com que a CPU picos com nenhuma resposta prestados.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript" src="Scripts/jquery-1.2.6.min.js"></script>
    <script type="text/javascript" src="http://devhubplus/portal/search.js"></script>
</head>
<body>
<a href="javascript:test1(500, 'wikiResults');">Test</a>
<div id="wikiResults" style="margin-top: 35px;"></div>

<script type="text/javascript">
    function test1(count, targetId)
    {
        var dataSourceUrl = "http://code.katzenbach.com/Default.aspx?callback=?";
        $.getJSON(dataSourceUrl, {c: count, test: "true", nt: new Date().getTime()}, function(results) {
                var response = new String();
                response += "<div>";
                for(i in results)
                {
                    response += results[i];
                    response += " ";

                }
                response += "</div>";
                $("#" + targetId).html(response);
        });
    }


</script>
</body>
</html>

Aqui é o JSON que volta em resposta.De acordo com o JSLint, é válido JSON (uma vez que você remover a chamada do método que a rodeiam).Os resultados reais seria diferente, mas parecia que o exemplo mais simples que poderia causar esta falha.O servidor é um ASP.Net aplicação de retornar uma resposta do tipo 'application/json.' Eu tentei alterar o tipo de resposta a 'application/javascript' e 'application/x-javascript' mas ele não tem qualquer efeito.Eu realmente aprecio a ajuda.

jsonp1222350625589(["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"

,"19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38"

,"39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58"

,"59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78"

,"79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98"

,"99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115"

,"116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132"

,"133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149"

,"150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166"

,"167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183"

,"184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200"

,"201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217"

,"218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234"

,"235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251"

,"252","253","254","255","256","257","258","259","260","261","262","263","264","265","266","267","268"

,"269","270","271","272","273","274","275","276","277","278","279","280","281","282","283","284","285"

,"286","287","288","289","290","291","292","293","294","295","296","297","298","299","300","301","302"

,"303","304","305","306","307","308","309","310","311","312","313","314","315","316","317","318","319"

,"320","321","322","323","324","325","326","327","328","329","330","331","332","333","334","335","336"

,"337","338","339","340","341","342","343","344","345","346","347","348","349","350","351","352","353"

,"354","355","356","357","358","359","360","361","362","363","364","365","366","367","368","369","370"

,"371","372","373","374","375","376","377","378","379","380","381","382","383","384","385","386","387"

,"388","389","390","391","392","393","394","395","396","397","398","399","400","401","402","403","404"

,"405","406","407","408","409","410","411","412","413","414","415","416","417","418","419","420","421"

,"422","423","424","425","426","427","428","429","430","431","432","433","434","435","436","437","438"

,"439","440","441","442","443","444","445","446","447","448","449","450","451","452","453","454","455"

,"456","457","458","459","460","461","462","463","464","465","466","467","468","469","470","471","472"

,"473","474","475","476","477","478","479","480","481","482","483","484","485","486","487","488","489"

,"490","491","492","493","494","495","496","497","498","499"])
Foi útil?

Solução

Você não vai gostar muito dessa resposta, mas estou convencido de que está do lado do servidor.

Aqui está o porquê:

Recriu seu cenário e, quando corro com o seu atendimento JSONP, fico pendurado no IE6, como você explicou.

No entanto, quando altero o respondente JSONP para o meu próprio código (exatamente a mesma saída que você dá acima), ele funciona sem nenhum problema (em todos os navegadores, mas particularmente IE6).

Aqui está o exemplo que eu zombei:

http://jsbin.com/udako (editar http://jsbin.com/udako/edit)

O retorno de chamada está atingindo http://jsbin.com/rs.php?callback=?

Nota pequena - inicialmente suspeitei do comprimento da corda: eu li que as cordas no IE têm um comprimento máximo de ~ 1 MB, que é o que você estava acertando (não tenho 100% de certeza se isso é preciso), mas mudei a concatenação para Um empurrão de matriz - que geralmente é mais rápido de qualquer maneira.

Outras dicas

Pode ser completamente diferente, mas eu só descobri que no IE6, quando o código é iniciada a partir de um manipulador de eventos onclick, um JSONP de retorno de chamada pode nunca ser executado.

A correcção para este problema é anexar o código através de um HREF em vez de o evento de clique.

Você JSON valida em JSLINT? Se você tem um UR e inclua o jQuery completo, posso depurar para você ou postar o JSON e posso tentar recriar o problema. Apenas a partir das informações, dado que é muito difícil dizer. Eu já vi algumas coisas estranhas antes com os nomes reais das chaves no JSON que quebra no IE6.

Você já experimentou o tipo MIME: Application/X-Javascript?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top