jQuery.Callbacks是jquery在1.7版本之后加入的,是从1.6版中的_Deferred对象中抽离的,主要用来进行函数队列的add、remove、fire、lock等操作,并提供once、memory、unique、stopOnFalse四个option进行一些特殊的控制,这是jquery的官方文档:http://api.jquery.com/jQuery.Callbacks/

  这个函数常见的应用场景是事件触发机制,也就是设计模式中的观察者(发布、订阅机制),目前Callbacks对象用于queue、ajax、Deferred对象中,这篇文章主要是一些简单的demo:

  1、不传入任何参数,调用add的时候将函数add到内部的list中,调用fire的时候顺序触发list中的回调函数

  1. function fn1(val){
  2. console.log('fn1 says:' + val);
  3. }
  4. function fn2(val){
  5. console.log('fn2 says ' + val);
  6. }
  7. var cbs = $.Callbacks();
  8. cbs.add(fn1);
  9. //fn1 says:foo
  10. cbs.fire('foo');
  11. cbs.add(fn2);
  12. //fn1 says:bar
  13. //fn2 says bar
  14. cbs.fire('bar');

  2、构造函数传入once,回调函数列表只被fire一次

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. var cbs = $.Callbacks('once');
  5. cbs.add(fn1);
  6. //fn1 says foo
  7. cbs.fire('foo');
  8. cbs.fire('foo');

  3、构造函数传入memory,这个选项刚开始接触时有点费解,下面拿个具体例子说明一下

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. function fn2(val){
  5. console.log('fn2 says ' + val);
  6. }
  7. var cbs = $.Callbacks('memory');
  8. cbs.add(fn1);
    //第一次fire会缓存传入的参数
    //fn1 says foo
  9. cbs.fire('foo');
    //fire过一次之后,以后的add都会自动调用fire,传入的参数是上次fire传入的'foo'
    //fn2 says foo
  10. cbs.add(fn2);
    //此次fire的参数新传入的'bar'
    //fn1 says bar
    //fn2 says bar
  11. cbs.fire('bar');

  4、构造函数传入unique,保证在add过程中没有重复的函数

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. var cbs = $.Callbacks('unique');
  5. cbs.add(fn1);
  6. cbs.add(fn1);
  7. //虽然添加了两次,但因为有unique这个选项,所以只会有一次输出
  8. //fn1 says foo
  9. cbs.fire('foo');

  5、构造函数传入stopOnFalse,当顺序调用函数列表的时候,如果某一个函数的返回值为false,则break

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. function fn2(val){
  5. console.log('fn2 says ' + val);
  6. return false;
  7. }
  8. function fn3(val){
  9. console.log('fn3 says ' + val);
  10. }
  11. var cbs = $.Callbacks('stopOnFalse');
  12. cbs.add(fn1);
  13. cbs.add(fn2);
  14. cbs.add(fn3);
  15. //虽然add了三个函数,但是因为fn2的返回值是false,所以不会执行fn3这个函数
  16. //fn1 says foo
  17. //fn2 says foo
  18. cbs.fire('foo');

  上面是一些单选项的demo,下面来看几个复合选项的例子

  6、once、memory的组合,这个也是jquery中Deferred对象初始化大部分Callbacks对象的参数(为什么Deferred会用这对组合呢?因为这个对象只能resolve或者reject一次,改变为成功或者失败的状态之后不能再次改变,所以不能再次显示调用fire,而只能通过add的方式继续)

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. function fn2(val){
  5. console.log('fn2 says ' + val);
  6. }
  7. var cbs = $.Callbacks('once memory');
  8. cbs.add(fn1);
  9. //fn1 says foo
  10. cbs.fire('foo');
  11. //因为memory的缘故,此次add自动fire,并且因为once和memory的共同原因,每次执行完之后函数队列都自动清空,所以这次只执行fn2,不执行fn1
  12. //fn2 says foo
  13. cbs.add(fn2)
  14. //因为once的缘故,显示调用fire也不会执行,如果还想fire,则只能add
  15. cbs.fire('bar');

  7、memory stopOnFalse的组合

  1. function fn1(val){
  2. console.log('fn1 says ' + val);
  3. }
  4. function fn2(val){
  5. console.log('fn2 says ' + val);
  6. return false;
  7. }
  8. function fn3(val){
  9. console.log('fn3 says ' + val);
  10. }
  11. var cbs = $.Callbacks('stopOnFalse memory');
  12. cbs.add(fn1);
  13. cbs.add(fn2);
  14. cbs.add(fn3);
  15. //因为stopOnFalse的缘故,这里执行fn2后的返回值是false,所以不会执行fn3
  16. //fn1 says foo
  17. //fn2 says foo
  18. cbs.fire('foo');
  19. cbs.add(fn2);
  20. cbs.add(fn3);
  21. //这里其实内部的函数队列是[fn1, fn2, fn3, fn2, fn3],但因为执行第一个fn2的返回值是false,所以[fn1, fn2, fn3, fn2, fn3]中标红的函数不会执行
  22. //fn1 says bar
  23. //fn2 says bar
  24. cbs.fire('bar');

  这篇文章主要是几个option的应用,下次会先对源代码进行解读,然后针对源代码设计几个更高级的应用,敬请期待

jQuery.Callbacks之demo的更多相关文章

  1. jQuery.Callbacks之源码解读

    在上一篇jQuery.Callbacks之demo主要说了Callbacks对象初始化常见的选项,这一篇主要分析下Callbacks对象的源代码,对给出两个较为繁琐的demo // String to ...

  2. jQuery: Callbacks

    jQuery 中提供了一个Callback的工具类Callbacks,它提供了一个Callback Chain.使用它可以在一个chain上来执行相关操作.它也是jQuery中的ajax, Defer ...

  3. jQuery回调、递延对象总结(上篇)—— jQuery.Callbacks

    前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...

  4. jQuery.Callbacks 源码解读二

    一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...

  5. jQuery源代码学习之四——jQuery.callbacks

    自己实现的callbacks模块相较于jquery源代码中的callbacks模块有所简化,表面上看没有考虑firing这个参数,没有对之进行任何处理,即没有考虑在函数执行过程中,再次调用add,re ...

  6. jQuery回调、递延对象总结(一)jQuery.Callbacks详解

    前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...

  7. 代码:jquery自定义插件 demo

    jquery自定义插件 demo 2016-1-13 只是一个简易的示例 <script type="text/javascript" src="http://cd ...

  8. jQuery.callbacks 注释

    (function( jQuery ) { // String to Object flags format cache var flagsCache = {}; // Convert String- ...

  9. 实时更新数据的jQuery图表插件DEMO演示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. C#: using JsonReader avoid Deserialize Json to dynamic

    namespace Test { using Microshaoft; using Test.Models; using Newtonsoft.Json; using System; using Sy ...

  2. 在CHROME里安装 VIMIUM 插件, 方便操作

    VIMIUM 插件使用方法 VIMIUM 命令列表 网页导航 j, :向下滚动网页 k, :向上滚动网页 h : 向左滚动 l : 向右滚动 gg : 滚动到网页头部 G : 滚动到网页底部 :向上翻 ...

  3. 关于在django框架里取已登录用户名字的问题

    在 views里取值是这样的 request.user.username而在模板页面取值是这样的:{{request.user}} 判断是否通过验证是这样的 {% if request.user.is ...

  4. java调用sqlldr oracle 安装的bin目录

    package com.jyc.sqlldr; import java.io.BufferedReader;import java.io.InputStream;import java.io.Inpu ...

  5. 安卓智能POS终端手持机PDA应用仓库出入库,移库,盘点,销售开单系统

    随着移动互联网的兴起,目前仓储管理所面临的的问题可以迎刃而解,WMS仓库系统解决方案通过智能终端扫描条码技术应用解决了工作量大导致工作效率不高,以及数据实时传输等问题,该方案主要提供仓库出入库,移库, ...

  6. 让mysql不能为空的字段为空时也能插入

    第一步: 在mysql安装目录中找到my.ini将: #sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTIT ...

  7. 一些关于HTML与CSS的总结与实际应用

    //学习前端也快一年了,觉得有必要好好总结一下这一年来学过的知识.一些是前辈们的精华,文章最后会讲地址一一放出,若原作者有任何介意,请及时联系我删除. 关于DOCTYPE 1.DOCTYPE的作用是什 ...

  8. ACM: ICPC/CCPC Sudoku DFS - 数独

    Sudoku Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Submis ...

  9. MySQL多表查询

    第一种: select a.a1,a.a2,a.a3,b.b2,c.c2,d.d2 from a,b,c,d where a.a1=b.b1 and b.b1=c.c1 and c.c1=d.d1 第 ...

  10. 2-Sat问题

    二分+2-Sat 判断是否可行 输出字典序最小的解 输出字典序可行解 其实这些都是小问题,最重要的是建图,请看论文. 特殊的建边方式,如果a b是一对,a必须选,那么就是b->a建边. HDU ...