javascript 绑定切换
jQuery有关事件绑定的函数太丰富了,今天由于某需求,需要一种每次点击触发不同的回调函数的效果,因此瞄一瞄jQuery的API,发现toggle正是我要的,于是也给我框架添一个。但jQuery的实现太复杂了,闭包套嵌过多,我换另一种思路轻松实现了它。
下面是jQuery的实现:
//===============代理函数=============== proxy: function ( fn, proxy, thisObject ) { if ( arguments.length === 2 ) { if ( typeof proxy === "string" ) { thisObject = fn; fn = thisObject[ proxy ]; proxy = undefined; } else if ( proxy && !jQuery.isFunction( proxy ) ) { thisObject = proxy; proxy = undefined; } } if ( !proxy && fn ) { proxy = function () { return fn.apply( thisObject || this , arguments ); }; } // Set the guid of unique handler to the same of original handler, so it can be removed if ( fn ) { proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; } // So proxy can be declared as an argument return proxy; }, //===============绑定切换函数=============== toggle: function ( fn ) { // Save reference to arguments for access in closure var args = arguments, i = 1; // link all the functions, so any of them can unbind this click handler while ( i < args.length ) { jQuery.proxy( fn, args[ i++ ] ); } return this .click( jQuery.proxy( fn, function ( event ) { // Figure out which function to execute var lastToggle = ( jQuery.data( this , "lastToggle" + fn.guid ) || 0 ) % i; jQuery.data( this , "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this , arguments ) || false ; })); }, |
这是我的实现:
toggle: function ( /*fn1,fn2,fn3*/ ){ var callback = function (event){ var self = arguments.callee; try { self[ "fn" +self._toggle].call( this ,event) } catch (e){ self._toggle =0 ; self[ "fn" +self._toggle].call( this ,event) } self._toggle ++ } for ( var i=0;i<arguments.length;i++){ callback[ "fn" +i] = arguments[i]; } return this .click(callback) } |
由于我不可能把我的事件模块放出来,它与jQuery的事件模块一样精致与复杂,换言之,一样易碎,强行分割就动弹不了。不过结合我早期放出的addEvent函数,还是能做出来的,虽然事件队列与事件对象还没有现整化。
var addEvent = function (el, type, fn) { if (el.addEventListener) { el.addEventListener(type, fn, false ); //DOM2.0 } else if (el.attachEvent) { el.attachEvent( 'on' + type, function (){ fn.call(el,window.event) }); } } var toggle = function (el /*,fn1,fn2,fn3*/ ){ var callback = function (event){ var self = arguments.callee; try { self[ "fn" +self._toggle].call( this ,event) } catch (e){ self._toggle =0 ; self[ "fn" +self._toggle].call( this ,event) } self._toggle ++ } var fns = [].slice.call(arguments,1); for ( var i=0;i<fns.length;i++){ callback[ "fn" +i] = fns[i]; } addEvent(el, "click" ,callback); } //=========经群里高人指点,继续简化与优化===== var toggle2 = function (el) { var fns = [].slice.call(arguments, 1), backup = fns.concat(); addEvent(el, 'click' , function (e){ if (!fns.length) { fns = backup.concat()} fns[0].call( this ,e); fns.shift(); }); }; |
用法与例子:
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构