我在按钮上使用toggle()
方法,以便他们可以有do something
/ revert changes
行为。例如:
$('button').toggle(function() {
// case 1: maximize
// ...
another_function($(this));
}, function() {
// case 2: minimize
// ...
another_function($(this));
});
在toggle
两种情况下,最后调用相同的函数(another_function()
)。我希望从该函数中找出我们是否在case 1
或case 2
中而不必自己操作按钮(例如,添加一个类,在调用函数之前设置自定义属性,并检查功能内部的那些变化。)
有没有办法从元素状态数据中找出我们所处的切换情况(当然jQuery必须在某处设置一个状态才能知道要执行的切换的哪个部分)?
PS:在SO上已经有很多与该主题相关的帖子,但它们是关于hide/show
个案例及其建议(检查它是否可见,隐藏......)不适用于此。
答案 0 :(得分:4)
您已经知道自己处于什么状态(最大化/最小化),因为该特定状态的代码正在执行。因此,您只需将此信息作为参数传递给another_function
:
$('button').toggle(function() {
// case 1: maximize
// ...
another_function($(this), 'maximize');
}, function() {
// case 2: minimize
// ...
another_function($(this), 'minimize');
});
jQuery当前(1.7.2)使用私有后门进入.data()
机制来存储其切换状态。这个后门在jQuery源代码中明确标记为多个私有,并且不言而喻,随后的任何部分如有更改,恕不另行通知。因此我强烈建议不要沿着这条路走下去。。
那就是说,这是发生了什么:
jQuery使用通过$._data()
访问的私有数据空间来存储切换的当前点击次数。此单击计数模2用于决定执行哪个函数,并在每次单击时递增。
用于存储此数据的密钥当前是字符串"lastToggle" + guid
,其中guid
是通常由jQuery自动生成的值(使用全局递增计数器)。 guid
的值在切换处理函数中设置,您可以在设置切换后检索它,如下所示:
var f1 = function() {
// case 1: maximize
// ...
another_function($(this), 'maximize');
}, f2 = function() {
// case 2: minimize
// ...
another_function($(this), 'minimize');
};
$('button').toggle(f1, f2);
// guid is now available on both handlers:
console.log(f1.guid, f2.guid);
您还可以在调用guid
之前在第一个处理程序上设置toggle
来修复var f1 = function() {
// case 1: maximize
// ...
another_function($(this), 'maximize');
}, f2 = function() {
// case 2: minimize
// ...
another_function($(this), 'minimize');
};
f1.guid = "foo";
$('button').toggle(f1, f2);
// guid is now fixed to "foo" and available on both handlers:
console.log(f1.guid, f2.guid);
的值:
$._data($('button'), "lastToggle" + guid);
给定此句柄,您可以使用
检索到目前为止的点击次数(从而预测下次将调用哪个处理程序){{1}}