2010-10-15 13 views
53
  • ¿Qué son los comportamientos de Drupal en absoluto?
  • ¿Qué tipo de capa de servicio ofrece a los desarrolladores de módulos?
  • ¿Qué tipo de relación se asigna a jQuery.ready?
+1

@JoshiConsultancy En términos generales, una respuesta eficaz en StackOverflow consiste en una respuesta directa ** ** incluyendo enlaces a las citas y referencias. La mayoría de las personas que ven esta página ** llegaron aquí buscando ** para comenzar. – dreftymac

Respuesta

75

Versión larga: Drupal.behaviors no es simplemente un reemplazo para jQuery.ready ya que este último sólo se ejecuta una vez (cuando DOM está listo para la manipulación): comportamientos pueden ser disparados varias veces durante la ejecución de la página y pueden ser ejecutar cada vez que se insertan nuevos elementos DOM en el documento.

Además, los módulos podrían anular o extender un comportamiento existente (por ejemplo, si un módulo tiene un comportamiento de agregar un efecto de rebote en todos los enlaces, un segundo módulo podría reemplazar el comportamiento por un efecto de rebote diferente).

Versión corta: es más modular, aunque la documentación podría mejorarse.


También, a partir de Drupal 7, la configuración definen utilizando drupal_add_js (PHP) o en Drupal.settings.modulename (Javascript) son pasados ​​directamente como segundo parámetro (siendo el primero el contexto) a el comportamiento.

Por ejemplo:

Drupal.behaviors.changeLinks = function(context, settings){ 
    if (!settings) settings = Drupal.settings.changeLinks; 
    $("a", context).hover(function() { 
     $(this).css('color', settings.color); 
    }); 
}; 

Y si uno de su script (u otra) crea nuevos nodos, todavía podría tener los comportamientos aplicados a los nuevos nodos sin tener que saber lo que se iinstalled otros módulos:

var newNodes = $('<a href="#">Hello</a> <a href="#">World</a>').appendTo('#someDiv'); 

Drupal.attachBehaviors(newNodes); 
+0

Solo para tener en cuenta que necesita ajustar cualquier uso de $() dentro (función ($) {// código aquí}) (jQuery); (Con las versiones actuales de Drupal 7) Documentación oficial aquí: https://www.drupal.org/node/756722#using-jquery –

+0

¿De qué sirve pasar el contexto aquí? – AlxVallejo

+0

El contexto es el fragmento del DOM que se ha modificado. Inicialmente, es todo el documento. Pero para todas las llamadas posteriores, solo será la nueva parte añadida o modificada. Por ejemplo, si usa la biblioteca de Lightbox para abrir algo nuevo en Lightbox, entonces tendrá un contexto que coincidirá solo con las cosas recién agregadas. De esta forma, cualquier búsqueda/coincidencia de jQuery se realizará en un conjunto limitado de elementos HTML en lugar de todo el documento. Además, esto evita el reprocesamiento de los elementos ya procesados. Se recomienda usar $ (". A-thing", context) para la eficacia cuando corresponda. – asiby

8

duplicado funcionalidad

Tenga en cuenta que los Drupal.behaviors arquitectura duplica la funcionalidad ya en jQuery.

También, a partir de este escrito, no parece haber ninguna documentación o estudios de casos para Drupal.behaviors exterior de Drupal en sí; y la documentación dentro de Drupal (como se indicó anteriormente) podría beneficiarse considerablemente de las mejoras. Al momento de escribir esto, parece que la documentación detallada primaria tiene acceso restringido solo por tarifa.

Esto significa que puede notar que la degradación del rendimiento, las anomalías y los resultados inesperados no son consistentes con jQuery estándar que son endémicos del ecosistema Drupal.behaviors.

funcionalidad nativa jQuery

En contraste con Drupal.behaviors, la funcionalidad integrada de la API estándar jQuery es ampliamente documentada incluyendo demostraciones y ejemplos en línea. Además, hay numerosos ejemplos en vivo libremente disponibles en sitios como jsfiddle.

Los enlaces en la sección de ver también enumeran las llamadas jQuery api relevantes para manejar nuevos elementos DOM insertados en el documento.

Ver también

+0

"no parece haber ninguna documentación" Lo siento pero eso es simplemente incorrecto. Simplemente busque "jquery Drupal.behaviors" y obtendrá 85k + resultados. Aquí hay algunos en mi primera página: https://drupal.org/node/756722 http://blog.amazeelabs.com/de/comment/510193 http://drewish.com/2011/05/11/drupal -javascripting/ Sin duda hay margen de mejora aquí, pero tal como está, su respuesta es más FUD que útil. –

+2

// no parece haber ninguna documentación o estudios de caso para Drupal.behaviors *** fuera de Drupal *** *** (énfasis no en el original) Por favor, siéntase libre de agregar cualquier aclaración o corrección legítima, pero la afirmación que hiciste aquí no es precisa. Lo más importante es que omitió las palabras "fuera de Drupal". Si hay otros marcos o proyectos que han adoptado comportamientos de Drupal, siéntase libre de agregar enlaces aquí y mejorar la calidad de la respuesta. Tal como está ahora, la adición no refuta nada en la respuesta original. – dreftymac

+0

Los comportamientos son específicos de Drupal y es por eso que no hay documentos ni casos de uso fuera de Drupal. Los comportamientos amplían la funcionalidad de jQuery, no la están duplicando. Enviar contexto y configuración no es algo que jQuery haga. Y también proporcionan integración con el marco AJAX de Drupal. Decir que duplican jQuery demuestra muy poca comprensión de la API JavaScript de Drupal. – Luxian

2

Buscando una respuesta similar y llegaron aquí, todavía sin pistas. Finalmente encontró un poco más de explicación (y ejemplos) de un artículo aquí: https://benmarshall.me/drupal-behaviors/

yo no soy el autor original, por lo que sólo puedo citar algunos textos:

¿Cuáles son Drupal comportamientos?

En resumen, Drupal.behaviors es una forma más modular y mejor de implementar jQuery.ready. A diferencia de jQuery.ready que solo se ejecuta una vez cuando el DOM está listo para la manipulación, Drupal.behaviors se puede ejecutar varias veces durante la ejecución de la página. Aún mejor, se pueden ejecutar siempre que se inserten nuevos elementos DOM en el documento (es decir, AJAX contenido impulsado).

Drupal.behaviors también puede anular o incluso extender un comportamiento existente . Por ejemplo, si un comportamiento de módulo agrega un efecto de rebote en todos los enlaces, otro módulo podría reemplazar ese comportamiento con un efecto de rebote diferente de .

Otra ventaja añadida de Drupal.behaviors (a partir de Drupal 7), es la capacidad utilizar los drupal_add_js (PHP) o Drupal.settings.modulename (JS) y pasar ajustes como un segundo parámetro (el primer ser el contexto ) al comportamiento.

4

Junto con las respuestas antes mencionadas sobre las cosas más importantes es que puede pasar datos desde PHP a javascript es el siguiente

valores que pasan de PHP tener JavaScript con "Drupal.settings"

You puede hacer fácilmente las variables de PHP a disposición de Javascript en el extremo frontal con Drupal.settings utilizando drupal_add_js() función

<?php 
    drupal_add_js(array('myModule' => array('key' => 'value')), 'setting'); 
?> 

o

<?php 
$element['#attached']['js'][] = array(
    'type' => 'setting', 
    'data' => array('myModule' => array('key' => 'value')), 
); 
?> 

Este estará disponible en Javascript como:

if (Drupal.settings.myModule.key === 'value') { 
    alert('Got it!'); 
    } 
Cuestiones relacionadas