Почему этот простой кусочек jQuery getJSON не работает в IE8? - PullRequest
5 голосов
/ 19 августа 2010

У меня очень стандартный запрос 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">&pound;' + 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 ]

16 голосов
/ 19 августа 2010

Хорошо, я понял это.Кто-то предложил попробовать не минимизированную версию jQuery.Я сделал это и прошел через отладчик IE8s Javascript.В какой-то момент возникла следующая ошибка:

Could not complete the operation due to error c00ce56e.

Небольшой поисковик обнаружил, что это было объявление charset, которое я установил для своих данных JSON.В PHP это было сделано с помощью:

header ( 'Content-Type: text/javascript; charset=utf8' );

Оказывается, что IE очень точен в отношении ссылки на набор символов (http://forums.asp.net/t/1345268.aspx#2732852), поэтому я изменил его на:

header ( 'Content-Type: text/javascript; charset=UTF-8' );

И эй-престо, это работает как шарм.Спасибо за вашу помощь, ребята, вы снова указали мне правильное направление!

2 голосов
/ 24 ноября 2011
$.ajaxSetup({ cache: false }); 
2 голосов
/ 19 августа 2010

отредактируйте снова - все еще отлаживаете - это изменение для использования другой функции должно иметь последний аргумент myAjaxResponderFunc без кавычек ...

1 голос
/ 31 мая 2013

Вы должны использовать проверку браузера и версии для 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, по которому вы делаете запрос.

Готово!

Кредит для: http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

Я просто люблю IE!

0 голосов
/ 19 августа 2010

Хм ... похоже, что ваш скрипт работает нормально в IE.Единственная вещь, которая, кажется, ломается - это ваш метод jQuery fadeOut.Мне удалось найти кое-что об этом здесь:

jquery IE Fadein и Fadeout Opacity

По сути, IE имеет проблемы с изменением свойств CSS, когда они ранее не былиобъявлено.

Редактировать: Возможно, он не работает нормально в IE ... Возможно, я не понял точный процесс загрузки страницы.

...