- // not working
- $('div').css('color','red').delay(200).css('color','blue');
- // use setTimeout
- $('div').css('color','red');
- setTimeout(function(){
- $('div').css('color','blue');
- }, 200);
稍微研究了一下,發現 jQuery 本身有製作 queue 的功能,這個用來存放 delay 後要執行動作的紀錄器,最後只要對 jQuery Object 作一個代理器的包裝,就可以達到想要的目的了。
- var queueName = 'delayAll';
- /*定義 jQuery Delay 代理類別*/
- function jQueryDelay(jqObject, duration){
- /*將缺少的成員屬性補上*/
- for(var member in jqObject){
- if(!$.isFunction(jqObject[member]) || !this[member]){
- this[member] = jqObject[member];
- }
- }
- /*新增 delay 時間並啟動 queue*/
- jqObject
- .delay(duration, queueName)
- .dequeue(queueName);
- /*紀錄 jQuery 物件*/
- this._jqObject = jqObject;
- };
- /*為所有的 jQuery 方法製作 proxy*/
- for(var member in $.fn){
- if(!$.isFunction($.fn[member])){ continue; }
- jQueryDelay.prototype[member] = function(){
- var jqObject = this._jqObject;
- var args = Array.prototype.slice.call(arguments);
- var mothed = arguments.callee.methodName;
- /*將需要執行動作加入 queue*/
- jqObject.queue(queueName, function(next) {
- jqObject[mothed].apply(jqObject, args);
- next();
- });
- return this;
- };
- /*紀錄方法名稱,在 proxy 時會需要參考到*/
- jQueryDelay.prototype[member].methodName = member;
- }
- /*允許多次串接的可能*/
- jQueryDelay.prototype.delayAll = function(duration){
- this._jqObject.delay(duration, queueName);
- return this;
- };
- /*用 jQueryDelay 將原本的 jQuery Object 包裝起來*/
- $.fn.delayAll = function(duration){
- return new jQueryDelay(this ,duration);
- };
使用範例:
- $('div').css('color','#f00')
- .delayAll(2000).css('color','#0f0')
- .delayAll(2000).css('color','#00f');
檔案下載:jquery.delayAll.js
0 回應:
張貼留言