微型 jQuery 插件
如果你想要你自己的可链接的clickToggle jQuery 方法,你可以这样做:
jQuery.fn.clickToggle = function(a, b) {
return this.on("click", function(ev) { [b, a][this.$_io ^= 1].call(this, ev) })
};
// TEST:
$('button').clickToggle(function(ev) {
$(this).text("B");
}, function(ev) {
$(this).text("A");
});
<button>A</button>
<button>A</button>
<button>A</button>
<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
简单功能切换器
现场演示
function a(){ console.log('a'); }
function b(){ console.log('b'); }
$("selector").click(function() {
return (this.tog = !this.tog) ? a() : b();
});
如果您希望它更短(为什么会这样,对吧?!)您可以使用Bitwise XOR *Docs运算符,例如:
DEMO
return (this.tog^=1) ? a() : b();
就这样。
诀窍是为this
Object设置一个boolean
属性tog
,并使用否定( tog = !tog
)切换它
并将所需的函数调用放入条件运算符中 ?:
在 OP 的示例中(即使有多个元素)可能如下所示:
function a(el){ $(el).animate({width: 260}, 1500); }
function b(el){ $(el).animate({width: 30}, 1500); }
$("selector").click(function() {
var el = this;
return (el.t = !el.t) ? a(el) : b(el);
});
另外:您还可以存储-toggle,例如:
DEMO:
$("selector").click(function() {
$(this).animate({width: (this.tog ^= 1) ? 260 : 30 });
});
但这并不是 OP 对他的确切要求 looking for a way to have two separate operations / functions
注意:这不会存储当前的 Toggle 状态,而只是反转我们在 Array 中的函数位置(它有它的用途......)
您只需将a,b函数存储在一个数组中,onclick您只需颠倒数组顺序并执行该array[1]
函数:
现场演示
function a(){ console.log("a"); }
function b(){ console.log("b"); }
var ab = [a,b];
$("selector").click(function(){
ab.reverse()[1](); // Reverse and Execute! // >> "a","b","a","b"...
});
一些混搭!
jQuery 演示
JavaScript 演示
创建一个toggleAB()
包含两个函数的好函数,将它们放入 Array,然后在数组的末尾,您只需0 // 1
根据tog
从this
引用传递给函数的属性分别执行函数 [ ] :
function toggleAB(){
var el = this; // `this` is the "button" Element Obj reference`
return [
function() { console.log("b"); },
function() { console.log("a"); }
][el.tog^=1]();
}
$("selector").click( toggleAB );