Проблема jQuery JSONP в IE6
-
02-07-2019 - |
Вопрос
Я столкнулся с проблемой при получении ответа JSONP с сервера в другом домене с помощью IE6.
Когда я делаю тот же вызов AJAX с использованием JSONP на сервер в том же домене, что и веб-страница, во всех браузерах (включая IE6) все работает хорошо.Однако когда я совершаю вызовы между доменами (XSS) с использованием JSONP, Internet Explorer 6 блокируется.В частности, загрузка ЦП достигает 100%, а обратный вызов «успех» никогда не достигается.Единственный раз, когда мне удавалось успешно переключаться между доменами, это когда ответ был очень коротким (обычно менее 150 байт).Длина ответа кажется важной.
Я использую jQuery 1.2.6.Я попробовал метод $.getJSON() и метод $.ajax(dataType:"jsonp") безуспешно.Это прекрасно работает в FF3 и IE7.Мне не удалось найти никого с подобной проблемой.Я думал, что этот тип функциональности полностью поддерживается jQuery в IE6.
Любая помощь очень ценится,
Андрей
Вот код html-страницы, выполняющей вызов AJAX..Сделайте локальную копию этого файла (и библиотеки jquery) и попробуйте его с помощью IE6.Для меня это всегда приводит к перегрузке процессора без какого-либо ответа.
<!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>
Вот JSON, который возвращается в ответе.Согласно JSLint, это действительный JSON (как только вы удалите окружающий его вызов метода).Реальные результаты были бы другими, но это казалось тем самым простым примером, который может привести к сбою.Сервер является приложением ASP.NET, возвращающим ответ типа «Приложение/JSON». Я пытался изменить тип ответа на «Приложение/Javascript» и «Приложение/X-Javascript», но это не оказало никакого влияния.Я очень ценю помощь.
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"])
Решение
вам не очень понравится этот ответ, но я убежден, что он на стороне вашего сервера.
Вот почему:
Я воссоздал ваш сценарий, и когда я запускаю ваш ответчик JSONP, у меня зависает IE6, как вы объяснили.
Однако, когда я меняю ответчик JSONP на свой собственный код (точно такой же результат, как вы дали выше), он работает без каких-либо проблем (во всех браузерах, но особенно в IE6).
Вот пример, над которым я вместе посмеялся:
http://jsbin.com/udako (редактировать http://jsbin.com/udako/edit)
Обратный вызов наступает http://jsbin.com/rs.php?callback=?
Небольшое примечание. Изначально я подозревал длину строки:Я читал, что строки в IE имеют максимальную длину ~ 1 МБ, и это то, что вы нажимали (я не уверен на 100%, верно ли это), но я изменил конкатенацию на нажатие массива - что в любом случае обычно быстрее.
Другие советы
Может быть, это совершенно не связано, но я только что обнаружил, что в IE6, когда код инициируется из обработчика событий onclick, обратный вызов JSONP может никогда не выполниться.
Решением этой проблемы является прикрепление кода через HREF вместо события щелчка.
Вы проверяете json на jslint?Если у вас есть ur и вы включили полную библиотеку jquery, я могу отладить ее для вас или опубликовать json и попытаться воссоздать проблему.Просто по предоставленной информации это довольно сложно сказать.Раньше я видел некоторые странные вещи с фактическими именами ключей в json, которые не работают на ie6.
Вы пробовали mime-тип:приложение/x-javascript?