2007-05-12 jquery 在Drupal 的使用(二) -jquery recursive

續jquery

先說明一下callback
用fadeIn() 說明一下

fadeIn(speed, callback)

fadeIn() 有兩個參數
第一個speed
用作指定淡入的速度, 可以為字符串"slow" "normal" "fast"
也可以為數字, 指定毫秒(千分一秒)

第二個callback
參數可以是一個函數名, 也可以定義一個新函數(inline 的方式)
而這個函數會在fadeIn() 完成,
也即是效果完結的時候被呼叫.
例如

$("#joe").fadeIn( "normal" , "joe_example" )

function joe_example(){
    alert( "Element with id " + $(this).attr("id") + " fade in finished." );
}

這樣fadeIn 元成的時候便會呼叫 joe_example()
函數內可以用 $(this) 來指定"自己"
來獲得這個元素的相關資料
如果配合next(), sibling(), parent() 也可以得到附近的元素
再作其他處理

至於inline的方式, 語法為:

$("#joe").fadeIn( "normal" , function(){
  $(this).next().fadeIn();
});

例子中, id 是joe 的元素先淡入
淡入完成之後,
joe 元素的下一個元素淡入
完成一次兩個為一組的連還淡入效果
注意, 這個例子只會淡入joe 元素和joe 元素的下一個元素
共兩個元素
並不會連鎖的淡入第三個元素

如果要發生無限的連鎖,
像這站的menu 的效果
便要使用遍歷(recursive) 結構了
首先介紹一下遍歷結構,
簡單的遍歷一般是指一個函數會自己呼叫自己
一直到符合某一個條件才停下
所以一個完整的遍歷結構一定有兩個條件
一個是呼叫自己的呼叫
另一個是一個停止呼叫的條件
用一個簡單的例子說明

function recursive(count){
  //完結條件
  if ( count>5 ){
    return;
  }
  alert( count++ );
  //呼叫自己
  recursive( count );
}

上面展示了一個遍歷函數
但這個函數不會開始, 直到代碼第一次呼叫 recursive(0)
一但被第一次呼叫(initialize)
便不會停, 直到count>5

同樣的原理可以放到menu 的連鎖反應之中
javascript 的代碼都分為兩個部份
一個遍歷的函數,
一次呼叫(initialize)

//initialize
$(document).ready(function(){
  $("ul.primary-links").children().eq(0).fadeIn("slow",function(){nextFadeIn(this)});
});
//遍歷函數
function nextFadeIn(obj){
  $(obj).next().fadeIn("slow",function(){nextFadeIn(this)});
}

下一次介紹drupal 加入javascript 的方法和總結一下jquery 的用法, 思考方向等

Google