Pregunta

Me he encontrado con un problema al recuperar un JSONP respuesta de un servidor en un dominio diferente utilizando IE6.

Cuando me hacen la misma llamada AJAX usando JSONP a un servidor en el mismo dominio que la página web, todo va bien en todos los navegadores (incluyendo IE6).Sin embargo, cuando hago llamadas entre dominios (XSS) usando JSONP, Internet Explorer 6 se bloquea.Específicamente, los picos de CPU al 100% y el "éxito" de devolución de llamada nunca llegó.La única vez que he tenido éxito entre dominios es cuando la respuesta es muy corto (menos de 150 bytes normalmente).La longitud de la respuesta parece importante.

Estoy usando jQuery 1.2.6.He probado el $.getJSON() el método y el $.ajax(tipo de datos:"jsonp") método sin éxito.Esto funciona muy bien en FF3 y IE7.No he sido capaz de encontrar a alguien con un problema similar.Yo pensaba que este tipo de funcionalidad fue plenamente apoyada por el jQuery en IE6.

Cualquier ayuda es muy apreciada,

Andrew


Aquí está el código de la página html de hacer la llamada AJAX.Hacer una copia local de este archivo (y la biblioteca jquery) y darle un tiro utilizando IE6.Para mí, siempre lo hace la CPU de la espiga sin respuesta 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>

Aquí está el JSON que viene de vuelta en la respuesta.De acuerdo a JSLint, es válido JSON (una vez que se retire la llamada al método que lo rodea).Los resultados reales sean diferentes, pero este parecía el ejemplo más sencillo que podría causar este error.El servidor es un ASP.Net aplicación de devolver una respuesta de tipo " application/json.' He intentado cambiar el tipo de respuesta a la solicitud/javascript' y 'application/x-javascript' pero no tienen ningún efecto.Realmente aprecio la ayuda.

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"])
¿Fue útil?

Solución

no te va a gustar mucho esta respuesta, pero estoy convencido de que está en tu lado del servidor.

He aquí por qué:

He recreado su escenario y cuando ejecuto con su respondedor JSONP me cuelgo IE6, como usted ha explicado.

Sin embargo, cuando cambio el respondedor JSONP a mi propio código (exactamente el mismo resultado que proporcionó anteriormente) funciona sin ningún problema (en todos los navegadores, pero particularmente IE6).

Aquí está el ejemplo del que me burlé:

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

La devolución de llamada está llegando a http://jsbin.com/rs.php?callback=?

Pequeña nota: inicialmente sospeché la longitud de la cadena: he leído que las cadenas en IE tienen una longitud máxima de ~ 1Mb, que es lo que estaba golpeando (no estoy 100% seguro de si esto es correcto), pero cambié la concatenación a un empuje de matriz, que generalmente es más rápido de todos modos.

Otros consejos

Puede que no tenga ninguna relación, pero acabo de descubrir que en IE6, cuando el código se inicia desde un controlador de eventos onclick, es posible que nunca se ejecute una devolución de llamada JSONP.

La solución a este problema es adjuntar el código mediante un HREF en lugar del evento de clic.

¿Valida json en jslint ? Si tiene una ur e incluye la jquery lib completa, puedo depurarla o publicar la json y puedo intentar recrear el problema. Solo por la información dada, es bastante difícil saberlo. He visto algunas cosas extrañas antes con los nombres reales de las teclas en el json que se rompe en ie6.

¿Has probado mime-type: application / x-javascript?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top