2010-02-28 15 views
20

Tengo el siguiente código y está funcionando (como de costumbre) en todo menos en IE. Me está dando una llamada inesperada al método o acceso a la propiedad en Jquery y no tengo ni idea de cómo depurarlo. He estado usando la barra de herramientas del desarrollador de IE, que es inútil para este error y simplemente me da una línea no 12 (dentro del script jquery).Error de Javascript IE: llamada inesperada al método o acceso a la propiedad

Cualquier ayuda es muy apreciada v:

<script type="text/javascript"> 
$(document).ready(function() { 

    $.history.init(pageload); 

    $('a[href=' + window.location.hash + ']').addClass('selected'); 

    $('a[rel=ajax]').click(function() { 

     var hash = this.href; 
     hash = hash.replace(/^.*#/, ''); 
     $.history.load(hash); 

     $('a[rel=ajax]').removeClass('selected'); 
     $(this).addClass('selected'); 
     $('.loading').show(); 

     getPage(); 

     return false; 
    }); 
}); 

function pageload(hash) { 
    if (hash) getPage(); 
} 

function getPage() { 

    hash = document.location.hash; 
    hash = hash.replace(/^.*#/, ''); 
    var data = 'page=' + encodeURIComponent(hash); 
    $.ajax({ 
     url: "index.php", 
     type: "POST", 
     data: data, 
     cache: false, 
     success: function (html) { 
      $('.loading').hide(); 
      $('tbody').html(html); 

     } 
    }); 
} 
</script> 

Aquí es el complemento de la historia: http://plugins.jquery.com/project/history

Y aquí es la demostración que he estado siguiendo: http://plugins.jquery.com/project/history

Aún cambiando window.location volver a document.location no parece hacer la diferencia

Im perdido o n este. Cuando cambio la etiqueta, la invocación sí la publica, por lo que funciona, pero es decir, el diseño está roto y los siguientes enlaces en los que hago clic no se publican. Realmente !! extraño, funciona bien en FF, Opera, etc

Respuesta

8

Estoy un poco sorprendido de IE se queja de ello, pero es una buena cosa que hace: Te estás perdiendo una declaración en getPage para hash (por ejemplo, puso var delante del primer uso).

En los otros es de suponer la creación de una implícita mundial (una propiedad del objeto window llamada hash), que por supuesto es un (tm) Bad Thing, pero como yo lo entiendo es correcta de acuerdo a la especificación (las secciones pertinentes siendo 8.7 ["Referencia Tipo"] y 10.1.4 ["Cadena de alcance y resolución de identificador"]).

Todavía estoy sorprendido de que IE se está quejando de eso. Debe tener que ver con el alcance en el que jQuery llama a su manejador de clics.

+0

he reducido a la etiqueta tbody. ¿Alguna idea de por qué esto está causando un problema? ¿IE no reconoce esta etiqueta? PS Thx tenías razón sobre las cosas que mencionas también –

+1

@Ke: IE reconoce la etiqueta 'tbody', sí. Me acabo de dar cuenta de que estabas haciendo '$ ('tbody'). Html (html)' - ¿tu * realmente * quieres escribir este contenido para cada 'tbody' en la página? ¿Y cuál es el HTML que le estás escribiendo? Es probable que una serie de elementos 'tr' ... IE no le guste demasiado con las filas de la tabla mediante' innerHTML', pero supongo que jQuery lo está manejando (Prototype lo hace y no creo que jQuery sea más retroactivo en esa área, pero no sé jQuery bien). –

0

No puedo encontrar un método de la historia en el jQuery API así que supongo que es ya sea:

  • Un complemento de terceros.
  • Una llamada indirecta al buen viejo objeto window.history.
  • Un objeto personalizado que ha creado.

Mi conjetura es que el IE (bien conocido por contaminar el alcance global haciendo todo lo global) piensa que cualquier referencia a la historia significa en realidad window.history Y cada vez es confuso. Si se trata de un objeto personalizado, intente cambiarle el nombre a myHistory o cualquier otra cosa.

+0

hice todo esto y este plugin de historial parece algo roto. también tiene problemas con más de 50 caracteres en url, creo que tendré que encontrar otra forma, aplausos de todos modos :) –

0

Creo que el Sr. Crowder está trabajando en algo. Por lo que puedo decir de la fuente de jQuery, si el fragmento de HTML devuelto no contiene ninguna etiqueta <script>, y no tiene algunas otras características no muy probables, entonces jQuery probablemente intente meterlo en su <tbody> elemento mediante el uso de la propiedad "innerHTML". IE no le gusta eso.

Lo que debe hacer es envolver todo <table> en un dummy <div> y luego reconstruir todo desde su fragmento de HTML.

4

Será el:

$('tbody').html(html); 

IE lanza un error cuando se intenta poner ciertas cosas en el interior de algunos nodos. Por ejemplo

$('<input>').append('</p>') 

Para solucionar este problema, agregue la html a un elemento diferente. Por ejemplo, usted podría intentar:

$('table').html('<tbody>' + html + '</tbody>'); 
6

Si recibe este error al utilizar elementos de HTML5 en Internet Explorer, asegúrese de que está utilizando html5shim para contar IE que estos son elementos reales.

+0

[Modernizr] (http://modernizr.com) también se puede utilizar, ya que contiene [html5shim] (http : //code.google.com/p/html5shiv/). – zacharydl

0

Tuve este problema en una aplicación web que utilizaba elementos HTML5. Cuando incluí el script Modernizr en las páginas, el problema fue resuelto.

0

Tuve el mismo problema. Originalmente había una lista de selección que se estaba añadiendo a ella. En el camino, la selección se cambió a un campo de entrada. Intentar agregar una etiqueta de opción a un campo de entrada parece hacer que IE no esté satisfecho.

0

Tuve el mismo problema en este momento. Me parece que sucede para elementos no visibles. Verifique si su elemento está visible en el momento de llamar al .html().

0

¿Está configurando los campos de entrada?

Tuve el mismo problema, recorriendo una serie de valores, pero había cambiado un cuadro de texto a una entrada. Chrome simplemente lo ignora, pero IE 8 explota.

$("#someID").html("someValue") = boom! en IE 8 si alguna ID es una entrada

Ya tuve la llamada val, pero necesitaba eliminar la html.

$("#someID").val("someValue") = buena

Cuestiones relacionadas