tercera rebrote qué que pueblos pacífica pacifica los llamada guerra generacion fria derecho consistió coexistencia articulo javascript jquery wordpress prototypejs

javascript - rebrote - en qué consistió la llamada coexistencia pacífica



prototipo y jQuery coexistencia pacífica? (4)

Sé muy poco sobre JavaScript, pero a pesar de esto estoy tratando de improvisar algo en mi blog de WordPress. No está funcionando, y no sé cómo resolverlo, y bueno, para eso está StackOverflow, ¿verdad?

En primer lugar, el mensaje de error es:

Error: element.dispatchEvent is not a function Source File: http://.../wp-includes/js/prototype.js?ver=1.6 Line: 3936

Sucede en la carga de la página. El controlador de carga de mi página está registrado así:

Event.observe(window, ''load'', show_dates_as_local_time);

El error desaparece si desactivo algunos otros complementos, y esto (más Google) me llevó a concluir que era un conflicto entre el prototipo y jQuery (que es utilizado por algunos de los otros complementos).

En segundo lugar estoy siguiendo la práctica recomendada de wordpress de usar wp_enqeue_script para agregar una dependencia de mi JavaScript a la biblioteca de Prototype, de la siguiente manera:

add_action( ''wp_print_scripts'', ''depo_theme_add_javascript'' ); function depo_theme_add_javascript() { wp_enqueue_script(''friendly_dates'', ''javascript/friendly_dates.js'', array(''prototype'')); }

Ahora también soy consciente de que existen algunos conflictos potenciales entre jQuery y Prototype que se resuelven utilizando el método jQuery noConflicts . He intentado llamar eso desde varios lugares, pero no es bueno. No creo que este sea el problema porque a) la función noConflict relaciona únicamente con la variable $ , que no parece ser el problema aquí, yb) esperaría que wordpress lo solucionara porque puede hacerlo. ..

Por último, utilizando el depurador Venkman, he determinado que el element referencia en el mensaje de error es de hecho un HTMLDocument pero también carece de un dispatchEvent . ¿No estoy seguro de cómo podría suceder esto, dado que es un método DOM estándar?


Creo que deberías buscar bien porque todos los complementos jQuery tienen una versión prototipo y todos los complementos prototipo tienen una versión jQuery. Si realmente no encuentras lo que buscas y no puedes usar solo una biblioteca, echa un vistazo aquí

jQuery.noConflict();

Pero, de nuevo, creo que no tiene sentido cargar más de 15-20kb para cada biblioteca :)


Hay un truco desagradable que muchas bibliotecas hacen y que me gusta, y parece que el prototipo es uno de estos.

Mootools hace esto, si estoy en lo cierto, y se trata de sobrecargar muchos de los prototipos de las clases básicas, mono parcheándolos.

Y del mismo modo, de forma similar encontré un comportamiento extraño cuando mootools y jQuery estaban presentes, generalmente jQuery se estaba muriendo porque llamaba a algún método de objeto que había sido sobrecargado / moiled por Mootools.

Además, misteriosamente, al sacar los mootools de la lista de uso de scripts, todo funcionaba mucho más rápido, y concluí que se debía a una menor contaminación de los objetos.

Ahora podría estar equivocado, pero de mi experiencia llegué a la conclusión de que esas bibliotecas simplemente no les gusta coexistir entre sí, y viendo cómo el código mootools me parecía degradar la velocidad a la que se hacían las cosas normales, absorbí y porté todos los códigos basados ​​en mootools a jQuery (un trato que consume mucho tiempo, se lo aseguro), y el resultado fue un código rápido y sin errores extraños inexplicables.

Te recomiendo que consideres la migración como al menos Una de tus opciones.

Una cosa más, al escribir:

Tiendo a usar esta sintaxis con todo mi código manejado por jQuery, para un poco de encapsulación segura en caso de que alguien rompa ''$'' de alguna manera.

Código de tiempo de ejecución Espera a que esté listo el documento antes de la ejecución:

jQuery(function($){ code_with_$_here; });

Complementos de jQuery

(function($){ code_with_$_here; })(jQuery);

El uso de estos hará que sea más fácil para las personas que usan cualquier jQuery escribir para poder usarlo sin un problema de conflicto.

Esto básicamente los dejará para asegurarse de que su código no está haciendo nada realmente mágico.



Gracias a todos por las sugerencias. Al final, creo que la explicación de Kent fue la más cercana, que básicamente ascendió a "El prototipo está roto". (Lo siento si te estoy resumiendo incorrectamente :)

En cuanto a la opción jQuery.noConflict , ya mencioné esto en la pregunta. Hace una diferencia cuando ejecutas este método, y tengo muy poco control sobre eso. Como dije, intenté ejecutarlo en un par de lugares diferentes (específicamente el encabezado de página y también desde mi archivo de script), sin ningún efecto. Entonces, por más que nos gustaría, "usar noConflict " no es una respuesta a esta pregunta, al menos no sin información adicional.

Además, jQuery.noConflict parece ser sobre la variable $ , y el código alrededor del punto de error no se ocupa de esa variable en absoluto. Por supuesto, podrían relacionarse indirectamente, no lo he rastreado.

Así que básicamente terminé reescribiendo el script usando jQuery en lugar de Prototype, que en realidad tenía sus propios problemas. De todos modos, he publicado toda la historia de guerra en mi blog , en caso de que estés interesado.