0

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:已经有很多与该主题相关的帖子,但它们是关于hide/show案例和他们的建议(检查它是否可见,隐藏......)不适用于这里。

4

1 回答 1

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 用于决定执行哪个函数,并在每次点击时递增。

当前用于存储此数据的键是 string "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);
于 2012-07-12T09:44:37.060 回答