Domanda

Ho riscontrato un problema durante il recupero di un JSONP risposta da un server in un dominio diverso utilizzando IE6.

Quando faccio la stessa chiamata AJAX utilizzando JSONP a un server nello stesso dominio della pagina web, tutto va bene in tutti i browser (tra cui IE6).Tuttavia, quando faccio le chiamate tra domini (XSS) utilizzando JSONP, Internet Explorer 6 si blocca.In particolare, i picchi di CPU al 100% e il 'successo' di callback non è mai raggiunto.L'unica volta che ho avuto successo tra i domini, quando la risposta è molto breve (meno di 150 byte in genere).La lunghezza della risposta sembra importante.

Sto utilizzando jQuery 1.2.6.Ho provato il $.getJSON() e il metodo $.ajax(tipo di dati:"jsonp") metodo senza successo.Questo funziona perfettamente in FF3 e IE7.Non sono stato in grado di trovare chiunque altro con un problema simile.Ho pensato che questo tipo di funzionalità è stato pienamente supportato da jQuery in IE6.

Qualsiasi aiuto è molto apprezzato,

Andrew


Ecco il codice della pagina html effettuare la chiamata AJAX.Fare una copia locale del file (e libreria jquery) e dare un colpo utilizzando IE6.Per me, esso provoca sempre la CPU a picco con nessuna risposta resa.

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

Qui è il JSON che torna nella risposta.Secondo JSLint, è valido JSON (una volta che si rimuove la chiamata al metodo che lo circonda).I risultati sarebbero diversi, ma questo era un semplice esempio che potrebbe causare questo esito negativo.Il server è un ASP.Net applicazione di restituire una risposta di tipo " application/json.' Ho provato a cambiare il tipo di risposta a ', 'application/javascript' e ', 'application/x-javascript", ma non hanno alcun effetto.Apprezzo molto l'aiuto.

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"])
È stato utile?

Soluzione

non ti piacerà molto questa risposta, ma sono convinto che sia dalla tua parte del server.

Ecco perché:

Ho ricreato il tuo scenario e quando corro con il tuo risponditore JSONP ottengo IE6 sospeso, come hai spiegato.

Tuttavia, quando cambio il risponditore JSONP al mio codice (esattamente lo stesso output che hai dato sopra) funziona senza problemi (in tutti i browser, ma in particolare IE6).

Ecco l'esempio che ho deriso insieme:

http://jsbin.com/udako (per modificare http://jsbin.com/udako/edit )

Il callback sta colpendo http://jsbin.com/rs.php?callback=?

Piccola nota - inizialmente sospettavo la lunghezza della stringa: ho letto che le stringhe in IE hanno una lunghezza massima di ~ 1Mb che è quello che stavi colpendo (non sono sicuro al 100% se questo è accurato), ma ho cambiato la concatenazione a un push di array - che è comunque generalmente più veloce.

Altri suggerimenti

Può essere completamente estranei, ma ho appena scoperto che in IE6, quando il codice viene avviata da un gestore di evento onclick, un JSONP richiamata non può mai eseguire.

La correzione di questo problema è quello di collegare il codice tramite un HREF anziché l'evento click.

Json convalida su jslint ? Se hai un tuo e includi l'intera libreria jquery, posso eseguire il debug per te o pubblicare il json e posso provare a ricreare il problema. Solo dalle informazioni fornite è abbastanza difficile da dire. Ho già visto alcune cose strane prima con i nomi effettivi delle chiavi nel json che si interrompe su ie6.

Hai provato mime-type: application / x-javascript?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top