2010-08-18 8 views
5

Tengo una petición muy estándar AJAX:¿Por qué no es este simple bit de jQuery getJSON trabajando en IE8?

$.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(); 
}); 

Funciona bien en todos los navegadores excepto IE. Ya no hago mucho en IE ya que tengo una Mac, pero tengo IE8 en una máquina virtual XP. Usar sus herramientas de depuración incorporadas realmente no ha ayudado (no son muy buenas). Lo único que puedo entender es que en algún momento recibo un error de "identificador esperado".

¿Podría ser esto en los datos JSON que se devuelven? ¿Cómo puedo examinar esa información desde el punto de vista de IE?

+0

¿Puede proporcionar una muestra en el sitio que podamos leer detenidamente? ¿Lo has probado en Chrome? Si es así, ¿qué errores aparecen (si los hay) después de que se ejecuta el script cuando abre el inspector de elementos? ¿Cómo se ve el JSON sin formato? – treeface

+0

Parece que tiene una coma al final en su JSON, eche un vistazo y vea si ese es el caso. –

+0

@treeface agregó un enlace para que eche un vistazo a – simonhamp

Respuesta

16

Ok lo descubrí. Alguien sugirió probar una versión no minificada de jQuery. Hice esto y pasé por el depurador Javascript de IE8s. En un momento determinado, el siguiente error ocurrió:

Could not complete the operation due to error c00ce56e. 

Un poco googlear encontró que era la declaración de conjunto de caracteres que he establecido para mis datos JSON. En PHP, esto se hizo con:

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

Resulta que IE es muy particular acerca de la referencia charset (http://forums.asp.net/t/1345268.aspx#2732852), así que lo cambió a:

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

Y hey-presto, se Funciona de maravilla. Gracias por su ayuda chicos, ¡me apuntaron en la dirección correcta otra vez!

+2

guau, nunca lo hubiera adivinado :-) – Pointy

+1

Mother-effin-MS ... gracias señor, esto probablemente me ahorró horas. –

+2

Pensándolo bien, esto está de acuerdo con el estándar IANA (http://en.wikipedia.org/wiki/UTF-8#Official_name_and_variants), IE realmente lo entiende aquí. La pregunta es si deberían ser liberales. sobre la aceptación de otras variantes es un debate diferente;) –

2

editar nuevamente — todavía depuración - que el cambio de utilizar la otra función tiene que tener el último argumento sea myAjaxResponderFunc sin comillas ...

+0

Acabo de intentar poner mi nueva cadena HTML en una sola línea ... no me alegra – simonhamp

0

Hm ... parece que el script está funcionando muy bien en ES DECIR. Lo único que parece estar rompiendo es su método jQuery fadeOut. Yo era capaz de encontrar algo de eso aquí:

jquery IE Fadein and Fadeout Opacity

Básicamente, IE tiene problemas con la alteración de las propiedades CSS cuando no han sido previamente declarado.

Editar: Tal vez no funciona bien en IE ... Puede que no haya entendido el proceso exacto de carga de la página.

+0

Lo siento , definitivamente es la función getJSON la que falla porque no está actualizando el HTML. Incluso acabo de poner una alerta simple en la devolución de llamada y no consigo nada. Definitivamente getJSON no funciona. Pero tendré esto en cuenta, gracias – simonhamp

+0

¿Por qué está utilizando alertas y no el depurador IE8? – Pointy

+0

@Pointy ¿cómo uso el depurador IE8? – simonhamp

2
$.ajaxSetup({ cache: false }); 
1

Tienes que usar el buscador de verbos y la versión para IE8 +, luego usar el XDomainRequest() si msie8 +.

Esto devolverá una cadena JSON, debe utilizar jQuery.parseJSON() para crear el objeto JSON ...

No utilice getJSON!

Aquí está mi ejemplo:

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 es la URL que se esté haciendo una petición a.

¡Hecho!

crédito a: http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

Me encanta IE!

+1

El uso de un 'XDomainRequest()' es la forma correcta de hacerlo en las primeras versiones de IE. ¡Mucha suerte a todos los que terminan aquí! – DrewT

Cuestiones relacionadas