# [D8教學]Drupal8超新手入門開發系列-Drupal.behaviors
## 前言
傳統的網頁開發同常會將jQuery寫在`$(document).ready()
`的function內,確保頁面全部載入後才開始執行JS。
但在Drupal開發上,部分頁面若使用到AJAX,依照傳統方式載入jQuery將會失效,為此本次將介紹Drupal開發上防止AJAX影響jQuery的寫法-Drupal.behaviors。
## Drupal.behaviors
[Drupal Javascript API 介紹](https://www.drupal.org/docs/8/api/javascript-api/javascript-api-overview)中有詳細介紹,一般jQuery的標準寫法如下:
```
$(document).ready(function () {
// Do some fancy stuff.
});
```
倘若我們在使用到AJAX的頁面使用上述寫法,將導致jQuery失效,因此Drupal提供了一種解決辦法,寫法如下:
```lang=Javascript
Drupal.behaviors.myBehavior = {
attach: function (context, settings) {
// Using once() to apply the myCustomBehaviour effect when you want to run just one function.
$('input.myCustomBehavior', context).once('myCustomBehavior').addClass('processed');
// Using once() with more complexity.
$('input.myCustom', context).once('mySecondBehavior').each(function () {
if ($(this).visible()) {
$(this).css('background', 'green');
}
else {
$(this).css('background', 'yellow').show();
}
});
}
};
```
需要先定義自己的`Drupal.behaviors.myBehavior`,`myBehavior`為自定義變數,將自己的程式碼放在`attach:function()`內即可。
這樣就能解決AJAX導致jQuery失效的問題。
## Drupal.behaviors once()
解決了AJAX導致jQuery失效的問題後會發現,在這種寫法下JS會重複執行許多次導致功能異常,為此若該程式只需執行一次,需使用once(),範例如下:
```lang=Javascript
Drupal.behaviors.myBehavior = {
attach: function (context, settings) {
// Using once() to apply the myCustomBehaviour effect when you want to run just one function.
let myNumber = $('.views-view-field-block-1').find('.phone-wrapper');
$(myNumber, context).once('myBehavior').addClass('processed');
});
}
};
```
若發現自己的程式重複執行就要記得加上once()。
## 結語
Drupal的開發團隊真的是設想周到,提供如此方便的function使用,希望這篇文章能給初入Drupal開發的工程師們一點幫助,切記在Drupal開發JS要考慮到AJAX的影響以及程式重複執行的問題。