# [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的影響以及程式重複執行的問題。