0

私はボタンのメソッドを使用して、ボタンが/動作toggle()できるようにしています。例えば:do somethingrevert 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ケースに関するものであり、それらの提案(表示されているか、非表示になっているかどうかを確認してください...)はここには当てはまりません。

4

1 に答える 1

4

特定の状態のコードが実行されているため、現在の状態 (最大化/最小化) は既にわかっています。another_functionしたがって、この情報を引数として単純に渡すことができます。

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

更新: jQuery の内部状態を掘り下げる

jQuery は現在 (1.7.2) メカニズムへのプライベート バックドアを使用して.data()、トグルの状態を保存します。このバックドアは、jQuery ソース内で明示的に非公開とマークされており、言うまでもなく、以下の内容は予告なしに変更される可能性があります。したがって、この道をたどらないことを強くお勧めします

そうは言っても、ここで何が起こっているのですか:

$._data()jQuery は、トグルの現在のクリック数を格納するためにアクセスされるプライベート データ スペースを使用します。このクリック カウント モジュロ 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 に答える