Drupal行为

时间:2010-10-15 10:33:52

标签: jquery drupal drupal-6

  • 什么是Drupal行为?
  • 它为模块开发人员提供了哪种类型的服务层?
  • 它映射到jQuery.ready的哪种关系?

7 个答案:

答案 0 :(得分:80)

长版本:Drupal.behaviors不仅仅是jQuery.ready的替代品,因为后者只运行一次(当DOM准备好进行操作时):在页面执行期间可以多次触发行为只要将新DOM元素插入到文档中,就可以运行。

此外,模块可以覆盖或扩展现有行为(例如,如果一个模块具有在所有链接上添加反弹效果的行为,则第二个模块可以通过不同的反弹效果替换行为)。

简短版:它更模块化,但文档可以改进。


此外,从Drupal 7开始,使用 drupal_add_js (PHP)或 Drupal.settings.modulename (Javascript)定义的设置将作为第二个参数直接传递(第一个一个是行为的背景。

例如:

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

如果您的某个脚本(或其他脚本)创建了新节点,它仍然可以将行为应用于新节点,而无需知道其他模块是否已安装:

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

Drupal.attachBehaviors(newNodes);

答案 1 :(得分:7)

重复功能

请注意,jQuery中的Drupal.behaviors体系结构重复功能

此外,在撰写本文时,似乎没有针对Drupal.behaviors 的任何文档或案例研究在Drupal本身之外; Drupal中的文档(如上所述)可以从改进中获益。在撰写本文时,似乎主要的详细文档仅限于限制访问。

这意味着您可能会注意到Drupal.behaviors生态系统特有的性能降级,异常和意外结果与标准jQuery 不一致。

原生jQuery功能

与Drupal.behaviors相比,标准jQuery API的内置功能广泛记录,包括内嵌演示和示例。此外,jsfiddle等网站上有许多免费提供的实例。

see also部分中的链接枚举了与处理插入到文档中的新DOM元素相关的jQuery api调用。

另见

答案 2 :(得分:5)

除了上面提到的关键事项的答案,你可以将数据从php传递到javascript,如下所示

使用&#34; Drupal.settings&#34;

将值从PHP传递到Javascript

使用 drupal_add_js()函数

,可以使用Drupal.settings轻松地将PHP中的变量提供给前端的Javascript
<?php
  drupal_add_js(array('myModule' => array('key' => 'value')), 'setting');
?>

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

这将在Javascript中提供:

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

答案 3 :(得分:3)

寻找类似的答案并到达这里,仍然没有线索。最后从这里的一篇文章中找到了更多的解释(和例子):https://benmarshall.me/drupal-behaviors/

我不是原作者,所以我只能引用一些文字:

  

什么是Drupal行为?

     

简而言之,Drupal.behaviors是一种更模块化,更好的方式   实现jQuery.ready。不像jQuery.ready只运行一次   DOM已准备好进行操作,可以运行Drupal.behaviors   在页面执行期间多次。更好的是,他们可以跑   每当新的DOM元素插入到文档中时(即AJAX)   驱动内容)。

     

Drupal.behaviors也可以覆盖甚至扩展现有的   行为。因此,例如,如果模块行为添加了反弹效果   在所有链接上,另一个模块可以用a替换该行为   不同的弹跳效果。

     

Drupal.behaviors的另一个额外奖励(从Drupal 7开始)是   能够使用drupal_add_js(PHP)或Drupal.settings.modulename   (JS)并将设置作为第二个参数传递(第一个参数是   上下文)行为。

答案 4 :(得分:1)

如果您的JavaScript需要在页面加载时以及在AJAX请求之后执行(在文档/ html中添加了一些新元素),则使用Drupal行为。

Drupal.behaviors.yourmodulename = {
  attach: function (context, settings) {
     // Code to be run on page load, and
    // on ajax load added here
  }
};

yourmodulename:这是你的命名空间,应该是唯一的。例如,这通常是您的模块的名称,但它不是强制性的。

context:这实际上非常酷,在页面加载时,上下文将包含整个文档,并且在AJAX请求之后将包含所有新加载的元素。这样,您可以通过AJAX处理加载的内容与其他内容不同。

设置:这包含通过PHP传递给JavaScript的信息,类似于通过Drupal.settings访问它。

答案 5 :(得分:1)

Drupal有一个“行为”系统,可以提供一种模块化的更好的方法来附加JavaScript功能,以便在页面上放置元素。 Drupal Behaviors允许您覆盖或扩展现有行为。 这些Drupal行为是事件触发的程序,它们附加到要更改的页面元素。虽然行为可以附加到特定内容,但也会附加多个行为,并且可以多次点燃以便快速重制。

通过将逻辑附加到Drupal.behaviors的JavaScript。以下是从该页面中获取的示例:

Drupal.behaviors.exampleModule = {
  attach: function (context, settings) {
    $('.example', context).click(function () {
      $(this).next('ul').toggle('show');
    });
  }
}

答案 6 :(得分:0)

步骤 1. 创建信息文件,如我的模块名称为“mymodule.info.yml”。

 name: My Module  
 type: module  
 description: 'for js file.'  
 core: '8.x'  

步骤 2. 创建 .module 以使用钩子将 js 文件附加到模块。

 <?php  
 // use hook for attachment of library to module   
 function mymodule_page_attachments(array &$page) {  
  // using this variable we are creating js file initialization  
   $page['#attached']['library'][] = 'mymodule/mymodule-js';  
   $page['#attached']['drupalSettings']['mymodule'];  
 }  
 ?>  

步骤 3. 为附加的 js 文件创建 mymodule.libraries.yml

 mymodule-js:  
  version: 1.x  
  js:  
   js/mymodule.js: {}  
  dependencies:  
   - core/jquery  
   - core/drupalSettings  

步骤 4. 创建库后,您必须创建 js 文件夹,然后在 js 文件夹中添加 js/mymodule.js 文件,然后您可以编写 Drupal 行为的代码。

 Drupal.behaviors.mymodule = {  
  attach: function (context, settings) {  
   // using this code we are just for learning proposed we just add class on site logo 
   you can write code of js below the comment.  
   jQuery('.site-branding__logo' , context).addClass('fancy-pants');  
  }  
 }  

以上四个步骤,您可以使用 Drupal 行为添加 js,如果您对我的博客文章有疑问,请告诉我这篇文章对您有帮助或无帮助。