24 votos

Extraño Chrome prototipo/conflicto jQuery

Tenemos una aplicación con código heredado que se basa en el prototipo, pero hemos encontrado que es demasiado "pesado" para la mayoría de los lugares que desea utilizar y que han encontrado jQuery para ser un mejor ajuste de cómo trabajamos. Por lo tanto, estamos migrando a jQuery para la nueva funcionalidad.

En el mientras tanto, tenemos varias páginas que necesita para cargar las bibliotecas:

<script language="javascript" type="text/javascript"
        src="prototype-1.5.1.2.js"></script> 
<script language="javascript" type="text/javascript"  
        src="jquery-1.3.2.js"></script> 
<script language="javascript" type="text/javascript">
    $j = jQuery.noConflict();
</script>

(nota: versión anterior de prototipo, hemos encontrado problemas en la actualización que no queremos arreglar cuando estamos sacarlo de circulación de todos modos)

Esto funciona en IE6, IE7, IE8-como-7 y FX3, pero la carga en Chrome y todos los de jQuery falla.

Carga del desarrollador javascript consola muestra los siguientes errores:

Uncaught Error: NOT_SUPPORTED_ERR: DOM Exception 9 http://.../prototype-1.5.1.2.js (line 1272)
Uncaught TypeError: Object #<an Object> has no method 'ready' http://.../lib.js (line 161)
Uncaught TypeError: Object #<an Object> has no method 'slideUp' http://.../page.aspx (line 173)
... and so on - all the failures are missing jQuery methods

Por lo que este se ve como un conflicto en el prototipo que hace que la creación del objeto jQuery a fallar.

El prototipo específico problema parece ser el Prototipo.BrowserFeatures.XPath de ser verdad cuando no debería ser, como XPath documento.evaluar no es compatible.

Ok, así que ahora a cargar la página con la consola de javascript open - funciona todo! WTF? Cerrar la consola, recargar y falla de nuevo.

El error sólo se produce cuando la carga de la página se produce sin la consola de javascript open - ¿por que tendría que hacer alguna diferencia? Que se parece mucho a un error en Chrome.

Cualquier persona capaz de explicar lo que está mal? ¿Por qué debe un error en el prototipo causa de jQuery init a fallar? ¿Por qué la carga de la página con la consola abierta que funcione?

Alguien sabe una buena solución? (aparte de la actualización a prototype-1.6.0.3.js que corrige este problema, pero se rompe una carga de código heredado en otros lugares)

44voto

Jake McGraw Puntos 16515

Desde Core/jQuery.noConflict:

NOTA: Esta función debe ser llamada después de incluir el archivo javascript jQuery, pero ANTES incluso de cualquier otro conflicto de la biblioteca, y también antes de que cualquier otro conflicto de biblioteca se utiliza, en caso de que jQuery se incluye la última. noConflict puede ser llamado en la final de la jQuery.js archivo para deshabilitar globalmente el $() de jQuery alias. jQuery.noConflict devuelve una referencia a jQuery, así que puede ser usado para reemplazar el $() alias del objeto jQuery.

Tal vez pruebe a cambiar a:

<script language="javascript" type="text/javascript"
  src="jquery-1.3.2.js"></script> 
<script language="javascript" type="text/javascript">
    $j = jQuery.noConflict();
</script>
<script language="javascript" type="text/javascript"
  src="prototype-1.5.1.2.js"></script>

10voto

hblanks Puntos 101

He encontrado la raíz de este problema:

  1. Prototipo de las cargas, y porque WebKit carece document.getElementsByClass(), Prototipo (insidously) crea.

  2. jQuery inicialización comienza, y en la parte superior, establece window.$ a jQuery.

  3. Durante JQuery inicialización, el Chisporroteo del motor (añadido en 1.3.2?) inicializa. Como parte de su introspección, comprueba y, a continuación, comprueba la funcionalidad de document.getElementsByClass(). Como resultado, las llamadas del Prototipo impelementation de getElementsByClass(), que depende de la window.$ ser el Prototipo de la $, no jQuery.

En última instancia, esto tendrá que ser corregido en jQuery (ver entradas http://bugs.jquery.com/ticket/4365 y 5027). Mi revisión rápida fue para quitar la asignación de window.$ en la parte superior de jQuery de inicialización.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X