Почему этот простой кусочек jQuery getJSON не работает в IE8?
У меня очень стандартный запрос AJAX:
$.getJSON('/products/findmatching/38647.json', {}, function(JsonData){
var tableHtml = '';
var x;
for (x in JsonData.matchingProds) {
var matchingProd = JsonData.matchingProds[x];
var buyMessage;
if ( x == 0 ) {
buyMessage = 'Buy Cheapest';
}
else {
buyMessage = 'Buy from this shop';
}
tableHtml = tableHtml + '<tr><td><img height="40" src="' + matchingProd.img_url + '" alt="' + matchingProd.name + '" /></td> \
<td><a href="' + matchingProd._page_url + '">' + matchingProd.name + '</a></td> \
<td><a href="' + matchingProd._merchant._url + '">' + matchingProd._merchant.title + '</td> \
<td align="right">£' + matchingProd.price + '</td> \
<td><a href="' + matchingProd.referral_url + '">' + buyMessage + '</a></td></tr>';
}
$('#matchingproducts tbody').html(tableHtml);
$('#loading').delay(1000).fadeOut();
});
Он отлично работает во всех браузерах, кроме IE. Я больше ничего не делаю в IE, так как у меня Mac, но у меня IE8 на виртуальной машине с XP. Использование встроенных средств отладки не очень помогло (они не очень хороши). Единственное, что я могу понять, это то, что в какой-то момент я получаю и ошибку "Ожидаемый идентификатор".
Может ли это быть в данных JSON, которые возвращаются? Как я могу проверить эти данные с точки зрения IE?
5 ответов
Хорошо, я понял это. Кто-то предложил попробовать не минимизированную версию jQuery. Я сделал это и прошел через отладчик IE8s Javascript. В определенный момент возникла следующая ошибка:
Could not complete the operation due to error c00ce56e.
Небольшой Googling обнаружил, что это было объявление charset, которое я установил для своих данных JSON. В PHP это было сделано с помощью:
header ( 'Content-Type: text/javascript; charset=utf8' );
Оказывается, что IE очень точен в отношении ссылки на набор символов ( http://forums.asp.net/t/1345268.aspx), поэтому я изменил его на:
header ( 'Content-Type: text/javascript; charset=UTF-8' );
И эй-престо, это работает как шарм. Спасибо за вашу помощь, ребята, вы снова указали мне правильное направление!
отредактируйте снова - все еще отлаживая - это изменение для использования другой функции должно иметь последний аргумент myAjaxResponderFunc
без кавычек...
Вы должны использовать проверку браузера и версии для IE8+, затем использовать XDomainRequest(), если msie8+.
Это вернет строку JSON, необходимо использовать jQuery.parseJSON() для создания объекта JSON…
Не используйте getJSON!
Вот мой пример:
if ($.browser.msie && parseInt($.browser.version, 10) >= 8 && window.XDomainRequest) {
// Use Microsoft XDR
var xdr = new XDomainRequest();
xdr.open("get", reqURL);
xdr.onload = function() {
var json = xdr.responseText;
json = $.parseJSON(json);
$.each(json.results, function(i, val) {
console.log(val.formatted_address);
var locString = val.formatted_address;
$.each(val.address_components, function(x, comp) {
if($.inArray("postal_code", comp.types) > -1) {
//alert("___" + comp.types);
zipmap[locString] = comp.short_name;
}
});
suggestions.push(val.formatted_address);
});
//alert(json.results);
}
xdr.send();
add(suggestions);
}else {
$.getJSON(reqURL, function(data) {
var isZIP = new Boolean;
console.log(data.results);
$.each(data.results, function(i, val) {
console.log(val.formatted_address);
var locString = val.formatted_address;
$.each(val.address_components, function(x, comp) {
if($.inArray("postal_code", comp.types) > -1) {
console.log("___" + comp.types);
zipmap[locString] = comp.short_name;
}
});
suggestions.push(val.formatted_address);
});
add(suggestions);
});
}
requrl - это URL, по которому вы делаете запрос.
Готово!
Я просто люблю IE!
Хм... кажется, что ваш скрипт работает нормально в IE. Единственная вещь, которая, кажется, ломается - это ваш метод jQuery fadeOut. Я смог найти что-то об этом здесь:
jQuery IE Fadein и Fadeout Opacity
В основном, у IE есть проблемы с изменением свойств CSS, когда они ранее не были объявлены.
Изменить: Возможно, это не работает нормально в IE... Я, возможно, не понял точный процесс загрузки страницы.