jQuery.ready
的哪种关系?答案 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,如果您对我的博客文章有疑问,请告诉我这篇文章对您有帮助或无帮助。