自己实现的jQuery回调完成的功能代码

使用完全相同的回调,但美元。它只实现了添加、删除、火、空,有带参数的构造函数。美元。回调也禁用,禁用,用,解雇,用,和方法。

代码如下:

复制代码代码如下所示:
(string.prototype.trim =功能)
{
返回this.replace( / ^ + | + $ /克,);
};

jQuery的回调对象 / /模拟
函数的MyCallbacks(选项)
{
VaR OPS = {一次:虚假,虚假,虚假记忆:独特,stoponfalse:假};

如果(typeof选项。饰)('String' = = =!=
{
无功opsarray = options.split( / / +);
对于(var i = 0;i < options.length;i++)
{
如果(opsarray {我} =天)
ops.once =真;
如果(opsarray {我} =记忆)
ops.memory =真;
如果(opsarray {我} =特殊的)
ops.unique =真;
如果(opsarray {我} = 'stoponfalse)
ops.stoponfalse =真;
}
}

var;
无功lastargs = null;
无功firedtimes = 0;

功能hasname(名称)
{
var = false;

如果(类型名称= 'String'
名称!= = null
name.trim('')= =!
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果(名字为name)
{
h=真;
打破;
}
}
}

返回H;
}

函数
this.add =功能(Fn)
{
如果(typeof FN = 'function)
{
如果(唯一的)
{
检查它是否已经添加了
如果(fn.name!= =hasname(FN。名称))
{
返回此;
}
}

Ar.push(FN);

如果(内存)
{
添加后立即调用它。
fn.call(这lastargs);
}
}

返回此;
};

函数
this.remove =功能(Fn)
{
如果(typeof(FN)= 'function
fn.name!=
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果({ = },名称= FN,name)
{
Ar.splice(I,1);
}
}
}

返回此;
};

所有函数 /删除
this.empty =功能()
{
ar.length = 0;
返回此;
};

检查它是否包含一个特定的函数
this.has =功能(Fn)
{
var = false;

如果(typeof(FN)= 'function
fn.name!=
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果({ = },名称= FN,name)
{
f=真;
打破;
}
}
}

返回F;
};

调用函数包括一个 / /
this.fire =函数(参数)
{
如果(ops.once firedtimes > 0)
{
返回此;
}

如果(ar.length > 0)
{
VAR r;

对于(var i = 0;i < ar.length;i++)
{
R = AR {我},(这叫,args);

如果(ops.stoponfalse R = false)
{
打破;
}
}
}

firedtimes + +;

如果(内存)
{
lastargs =参数;
}

返回此;
};
};


测试功能如下:(注意,FN1 FN2是匿名函数,FN2返回FALSE,和FN3是著名的功能)

复制代码代码如下所示:
VaR FN1 =功能(V)
{
console.log('fn1(V | | ' + '));
};

VaR FN2 =功能(V)
{
console.log('fn2(V | | ' + '));
返回false;
};

功能FN3(V)
{
console.log('fn3(V | | ' + '));
};


1。试验加火

VaR CB =新MyCallbacks();

Cb.add(FN1)

Cb.add(FN2)

Cb.add(FN3)

Cb.fire ('hello')

输出:

FN1你好
FN2你好
FN3你好

2。测试删除
VaR CB =新MyCallbacks();

Cb.add(FN1)

Cb.add(FN2)

Cb.add(FN3)

Cb.remove(FN1)
Cb.fire(你好)
Cb.remove(FN3)
Cb.fire(你好)
输出:

FN1你好
FN2你好
FN3你好
----------------------------
FN1你好
FN2你好

2。测试
VaR CB =新MyCallbacks();

Cb.add(FN1)

Cb.add(FN2)

Cb.add(FN3)

Cb.has(FN1)

Cb.has(FN3)

输出:





真正的

三.用参数测试构造函数:一次

VaR CB =新mycallbacks(天的)

Cb.add(FN1)

Cb.fire(你好)

Cb.fire(你好)

Cb.add(FN2)

Cb.fire(你好)

输出:

你好

-------------------

C

这个

4。用参数对构造函数进行测试:内存

VaR CB =新mycallbacks(记忆的)

Cb.add(FN1)

Cb.fire(你好) / /输出:FN1你好

Cb.add(FN2) / /输出:FN2你好

Cb.fire(你好)

输出:

FN1你好

FN2你好

5。测试参数的构造函数:stoponfalse

VaR CB =新mycallbacks('stoponfalse)

Cb.add(FN1)

Cb.add(FN2)

Cb.add(FN3)

Cb.fire(你好)

输出:

FN1你好
FN2你好
6。用参数测试构造函数:唯一的

VaR CB =新mycallbacks(特殊的)



B.add(FN3)

B.add(FN3)

Cb.fire(你好)

输出:

FN3你好



7、测试组合参数的构造函数:四设置参数可以任意组合,只测试所有组合,否则,写16个测试用例t_t。

VaR CB =新mycallbacks(如果记忆独特的stoponfalse)

Cb.add(FN1) / /输出:FN1

Cb.add(FN2) / /输出:FN2

Cb.add(FN3) / /输出:3

Cb.fire(你好)

输出:

FN1你好
FN2你好
Cb.fire(你好) / /输出:无输出



以下是正式的API文档:

描述:一个多用途的回调列表对象,提供了管理回调列表的有力途径。美元。回调(功能)是内部用来提供在jQuery的基本功能(美元。阿贾克斯)和美元。递延(组件。)它可以作为类似的基础定义新的功能组件。

构造函数:jQuery的回调(标志)。

旗帜
类型:字符串
一个可选的空间分隔标志列表,可以更改回调列表
可能的旗帜:
一次:确保回调列表只能被触发一次(如a)。
内存:跟踪以前的值,并调用任何回调、调用,它也称为x 。
唯一:确保回调只能添加一次(所以有)。
stoponfalse:中断调用回调函数返回false时。
默认情况下,回调列表将表现为事件回调列表。

具体方法是:用以上(增加)和(火)的(方法),添加支持添加新的回调回调列表,而火(法)执行功能的增加和提供了一种方式来传递参数是由该表中的回调处理。

使用回调实现的发布订阅模式的酒吧/子:(官方文件)

复制代码代码如下所示:
var主题{ };

主题函数(id)
{
VaR回调,
方法,
主题= ID主题};

如果(!话题)
{
= jQuery()回调回调;
主题= { {
发布:callbacks.fire,
订阅:callbacks.add,
callbacks.remove退订:
};
如果(id)
{
主题{主题};
}
}
回归主题;
};


使用

复制代码代码如下所示:
美元。话题('mailarrived)。订阅(功能(E))
{
console.log(你有新的电子邮件!;
console.log(邮件标题:+ e.title);
console.log(邮件内容:+内容);
}
);

美元。话题('mailarrived)。出版({标题:'mail标题,内容:'mail内容});



要实现其余的全部功能:callbacks.disable,callbacks.disabled,callbacks.fired,callbacks.firewith,callbacks.lock,callbacks.locked,然后重构代码结构,将在匿名函数实现,那么实例是通过工厂window.callbacks回来,所以每次使用必须是新的。

具体代码如下:的兴趣和时间的比较可以用jQuery版本的回调相比。

复制代码代码如下所示:
函数(窗口,未定义)
{
jQuery的回调对象 / /模拟
函数回调(选项)
{
VaR OPS = {一次:虚假,虚假,虚假记忆:独特,stoponfalse:假},
AR={ },
lastargs = null,
firedtimes = 0,
_disabled = false,
_locked = false;

如果(typeof选项。饰)('String' = = =!=
{
无功opsarray = options.split( / / +);
对于(var i = 0;i < options.length;i++)
{
如果(opsarray {我} =天)
ops.once =真;
如果(opsarray {我} =记忆)
ops.memory =真;
如果(opsarray {我} =特殊的)
ops.unique =真;
如果(opsarray {我} = 'stoponfalse)
ops.stoponfalse =真;
}
}

功能hasname(名称)
{
var = false;

如果(类型名称= 'String'
名称!= = null
name.trim('')= =!
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果(名字为name)
{
h=真;
打破;
}
}
}

返回H;
}

函数
this.add =功能(Fn)
{
如果(typeof FN = 'function)
{
如果(唯一的)
{
检查它是否已经添加了
如果(fn.name!= =hasname(FN。名称))
{
返回此;
}
}

Ar.push(FN);

如果(内存)
{
添加后立即调用它。
fn.call(这lastargs);
}
}

返回此;
};

函数
this.remove =功能(Fn)
{
如果(typeof(FN)= 'function
fn.name!=
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果({ = },名称= FN,name)
{
Ar.splice(I,1);
}
}
}

返回此;
};

所有函数 /删除
this.empty =功能()
{
ar.length = 0;
返回此;
};

检查它是否包含一个特定的函数
this.has =功能(Fn)
{
var = false;

如果(typeof(FN)= 'function
fn.name!=
ar.length > 0)
{
对于(var i = 0;i < ar.length;i++)
{
如果({ = },名称= FN,name)
{
f=真;
打破;
}
}
}

返回F;
};

this.disable =功能()
{
_disabled =真;
返回此;
};

this.disabled =功能()
{
返回_disabled;
};

this.fired =功能()
{
返回firedtimes > 0;
};

功能_fire(上下文,args)
{
如果(_disabled ops.once firedtimes | | | | > 0 _locked)
{
返回;
}

如果(ar.length > 0)
{
VAR r;

对于(var i = 0;i < ar.length;i++)
{
R = AR {我}呼叫(上下文,args);

如果(ops.stoponfalse R = false)
{
打破;
}
}
}

firedtimes + +;

如果(内存)
{
lastargs =参数;
}

};

this.firewith =功能(上下文,args)
{
背景背景这| |;
_fire(上下文,args);
返回此;
};

this.fire =函数(参数)
{
(这_fire,args);
返回此;
};

this.lock =功能()
{
_locked =真;
返回此;
};

一个=功能()
{
返回_locked;
};

};

作为工厂/方法暴露在全局环境中
window.callbacks =功能(选项)
{
返回新的回调(选项);
};

}(窗口);