确定jQuery切换状态

时间:2012-07-12 09:40:16

标签: jquery toggle

我在按钮上使用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 1case 2中而不必自己操作按钮(例如,添加一个类,在调用函数之前设置自定义属性,并检查功能内部的那些变化。)

有没有办法从元素状态数据中找出我们所处的切换情况(当然jQuery必须在某处设置一个状态才能知道要执行的切换的哪个部分)?

PS:在SO上已经有很多与该主题相关的帖子,但它们是关于hide/show个案例及其建议(检查它是否可见,隐藏......)不适用于此。

1 个答案:

答案 0 :(得分:4)

您已经知道自己处于什么状态(最大化/最小化),因为该特定状态的代码正在执行。因此,您只需将此信息作为参数传递给another_function

$('button').toggle(function() {
  // case 1: maximize
  // ...
  another_function($(this), 'maximize');
  }, function() {
   // case 2: minimize
   // ...
  another_function($(this), 'minimize');
});

更新:Groveling jQuery的内部状态

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}}