
jQuery.Callbacks()方法
jQuery 雜項方法
實例
向 $.Callbacks 的列表添加回調函數(shù)
$(function () {
function fn1( value ) {
alert( value );
}
function fn2( value ) {
fn1("fn2 says: " + value);
return false;
}
var callbacks = $.Callbacks();
callbacks.add( fn1 );
callbacks.fire( "foo!" );
callbacks.add( fn2 );
callbacks.fire( "bar!" );
})
嘗試一下 ?
定義和用法
$.Callbacks() 指一個多用途的回調函數(shù)列表對象,提供了一種強大的方法來管理回調函數(shù)列對。
提示: $.Callbacks 是在 jQuery 內部使用,如為 .ajax,$.Deferred 等組件提供基礎功能的函數(shù)。它也可以用在類似功能的一些組件中,如自己開發(fā)的插件。
語法
參數(shù) | 描述 |
flags | 可選。 String類型 一個用空格標記分隔的可選列表,用來改變回調列表中的行為 |

更多實例
下面是使用 .remove() 從回調列表中刪除一個特定的回調的例子
實例
$(function () {
function fn1( value ) {
alert( value );
}
function fn2( value ) {
fn1("fn2 says: " + value);
return false;
}
var callbacks = $.Callbacks();
callbacks.add( fn1 );
callbacks.fire( "foo!" );
callbacks.add( fn2 );
callbacks.fire( "bar!" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
})
嘗試一下 ?
支持的 Flags 參數(shù)
這個 flags 參數(shù)是 $.Callbacks() 的一個可選參數(shù), 結構為一個用空格標記分隔的標志可選列表,用來改變回調列表中的行為 (比如. $.Callbacks( 'unique stopOnFalse' ))。
以下是可用的 flags:
參數(shù) | 描述 |
once | 確保這個回調列表只執(zhí)行一次 |
memory | 緩存上一次fire時的參數(shù)值,當add()添加回調函數(shù)時,直接用上一次的參數(shù)值立刻調用新加入的回調函數(shù) |
unique | 確保一次只能添加一個回調,不會重復添加 |
stopOnFalse | 某個回調函數(shù)返回false之后中斷后面的回調函數(shù) |
下面是 $.Callbacks( "once" ) 的一個例子
實例
$(function () {
function fn1( value ) {
alert( value );
}
function fn2( value ) {
fn1("fn2 says: " + value);
return false;
}
var callbacks = $.Callbacks( "once" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
})
嘗試一下 ?下面是 $.Callbacks( "memory" ) 的一個例子
實例
$(function () {
function fn1( value ) {
alert( value );
}
function fn2( value ) {
fn1("fn2 says: " + value);
return false;
}
var callbacks = $.Callbacks( "memory" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
})
嘗試一下 ?下面是 $.Callbacks( "unique" ) 的一個例子
實例
$(function () {
function fn1( value ) {
alert( value );
}
function fn2( value ) {
fn1("fn2 says: " + value);
return false;
}
var callbacks = $.Callbacks( "unique" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn1 );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" ); })
嘗試一下 ?下面是 $.Callbacks( "stopOnFalse" ) 的一個例子
實例
$(function () {
function fn1( value ) {
alert( value );
return false;
}
function fn2( value ) {
fn1( "fn2 says: " + value );
return false;
}
var callbacks = $.Callbacks( "stopOnFalse" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
})
嘗試一下 ?$.Callbacks() 支持一個列表設置多個flags(標識)而不僅僅是一個,有一個累積效應,類似"&&"。
下面是 $.Callbacks( 'unique memory' ) 的一個例子
實例
$(function () {
function fn1( value ) {
alert( value );
return false;
}
function fn2( value ) {
fn1( "fn2 says: " + value );
return false;
}
var callbacks = $.Callbacks( "unique memory" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn1 );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.add( fn2 );
callbacks.fire( "baz" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
})
嘗試一下 ?$.Callbacks 方法也可以被分離, 例如:
實例
$(function () {
function fn1( value ) {
alert( value );
}
var callbacks = $.Callbacks(),
add = callbacks.add,
remove = callbacks.remove,
fire = callbacks.fire;
add( fn1 );
fire( "hello world" );
remove( fn1 );
})
嘗試一下 ?
$.Callbacks, $.Deferred 和 Pub/Sub
pub / sub(觀察者模式)背后的一般思路是促進應用程序的松散耦合和高效通信。觀察家也被稱為訂閱者,它指向觀察對象。觀察者(Publisher)事件發(fā)生時通知用戶。
作為 $.Callbacks() 的創(chuàng)建組件的一個演示,只使用回調函數(shù)列表,就可以實現(xiàn) Pub/Sub 系統(tǒng)。將 $.Callbacks 作為一個文章隊列,可以向下面這樣,實現(xiàn)文章的發(fā)布和訂閱:
實例
$(function () {
function fn1( value ) {
alert( value );
return false;
}
function fn2( value ) {
fn1( "fn2 says: " + value );
return false;
}
var topics = {};
jQuery.Topic = function( id ) {
var callbacks,
method,
topic = id && topics[ id ];
if ( !topic ) {
callbacks = jQuery.Callbacks();
topic = {
publish: callbacks.fire,
subscribe: callbacks.add,
unsubscribe: callbacks.remove
};
if ( id ) {
topics[ id ] = topic;
}
}
return topic;
};
$.Topic( "mailArrived" ).subscribe( fn1 );
$.Topic( "mailArrived" ).subscribe( fn2 );
$.Topic( "mailSent" ).subscribe( fn1 );
$.Topic( "mailArrived" ).publish( "hello world!" );
$.Topic( "mailSent" ).publish( "woo! mail!" ); })
嘗試一下 ?進一步改進使用 $.Deferreds,可以保證當特定的任務被完成(或被解決)時,發(fā)布者只能向訂閱者發(fā)布通知。參見下面的示例代碼:
實例
$(function () {
function fn1( value ) {
alert( value );
return false;
}
function fn2( value ) {
fn1( "fn2 says: " + value );
return false;
}
var topics = {};
jQuery.Topic = function( id ) {
var callbacks,
method,
topic = id && topics[ id ];
if ( !topic ) {
callbacks = jQuery.Callbacks();
topic = {
publish: callbacks.fire,
subscribe: callbacks.add,
unsubscribe: callbacks.remove
};
if ( id ) {
topics[ id ] = topic;
}
}
return topic;
};
$.Topic( "mailArrived" ).subscribe( fn1 );
var dfd = $.Deferred();
var topic = $.Topic( "mailArrived" );
dfd.done( topic.publish );
dfd.resolve( "已經(jīng)被發(fā)布!" );
})
嘗試一下 ?
jQuery 雜項方法
更多建議: