Question

J'ai rencontré un problème lors de la récupération d'une réponse JSONP à partir d'un serveur d'un domaine différent à l'aide d'IE6.

Lorsque je fais le même appel AJAX en utilisant JSONP vers un serveur du même domaine que la page Web, tout se passe bien dans tous les navigateurs (y compris IE6).Cependant, lorsque j'effectue des appels entre domaines (XSS) à l'aide de JSONP, Internet Explorer 6 se bloque.Plus précisément, le processeur atteint 100 % et le rappel « succès » n'est jamais atteint.La seule fois où j'ai réussi à passer d'un domaine à l'autre, c'est lorsque la réponse est très courte (généralement moins de 150 octets).La longueur de la réponse semble importante.

J'utilise jQuery 1.2.6.J'ai essayé la méthode $.getJSON() et la méthode $.ajax(dataType :"jsonp") sans succès.Cela fonctionne à merveille dans FF3 et IE7.Je n'ai trouvé personne d'autre avec un problème similaire.Je pensais que ce type de fonctionnalité était entièrement pris en charge par jQuery dans IE6.

Toute aide est très appréciée,

André


Voici le code de la page html effectuant l'appel AJAX.Faites une copie locale de ce fichier (et de la bibliothèque jquery) et essayez-la en utilisant IE6.Pour moi, cela provoque toujours une augmentation du processeur sans aucune réponse.

<!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>

Voici le JSON qui revient dans la réponse.Selon JSLint, il s'agit d'un JSON valide (une fois que vous avez supprimé l'appel de méthode qui l'entoure).Les résultats réels seraient différents, mais cela semblait être l’exemple le plus simple qui ferait échouer cette démarche.Le serveur est une application ASP.NET renvoyant une réponse de type «Application / JSON». J'ai essayé de modifier le type de réponse en «application / javascript» et «application / x-javascript» mais cela n'a eu aucun effet.J'apprécie vraiment l'aide.

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"])
Était-ce utile?

La solution

vous n'allez pas tellement aimer cette réponse, mais je suis convaincu que c'est du côté serveur.

Voici pourquoi:

J'ai recréé votre scénario et lorsque je lance avec votre répondeur JSONP, IE6 se bloque, comme vous l'avez expliqué.

Cependant, lorsque je remplace le répondeur JSONP par mon propre code (exactement le même résultat que ce que vous avez indiqué ci-dessus), cela fonctionne sans problème (dans tous les navigateurs, mais surtout dans IE6).

Voici l'exemple que je me suis moqué:

http://jsbin.com/udako (pour modifier http://jsbin.com/udako/edit )

Le rappel fait appel à http://jsbin.com/rs.php?callback=?

Petite remarque - Au départ, je soupçonnais la longueur de la chaîne: j'ai lu que les chaînes dans IE avaient une longueur maximale de ~ 1 Mo, ce que vous frappiez (je ne suis pas sûr à 100% si cela est exact), mais j'ai changé la concaténation à un tableau push - ce qui est généralement plus rapide de toute façon.

Autres conseils

Cela n'a peut-être aucun rapport, mais je viens de découvrir que dans IE6, lorsque le code est lancé à partir d'un gestionnaire d'événements onclick, un rappel JSONP peut ne jamais s'exécuter.

La solution à ce problème consiste à joindre le code via un HREF au lieu de l'événement click.

Validez-vous votre JSON sur jslint ? Si vous avez un ur et que vous incluez l'intégralité de jquery lib, je peux le déboguer pour vous ou poster le json et essayer de recréer le problème. Juste à partir des informations données, il est assez difficile à dire. J’ai déjà vu des choses étranges avec les noms réels des clés du JSON qui s’éclatent sur ie6.

Avez-vous essayé le type mime: application / x-javascript?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top