1

この関数を DOM イベントへのコールバックとして渡す必要があります

var fooo = function() {
  $(this).append("foo");
  fooo = function() {
     $(this).append("bar");
  };
};

$("#hover").hover(fooo);​

この例では、「foo」を追加してから「bar」を追加する必要がありますが、機能しません。私は何を間違っていますか?

JSFiddle

4

3 に答える 3

2

これも機能しません:

var fooo = function() {
    $(this).append("foo");
};

$("#hover").hover(fooo);

fooo = function() {
    $(this).append("bar");
};

変数を変更したが、hoverイベントに渡されたコールバックを変更しなかったためです。

新しい関数をコールバックとして割り当てる必要があります。

var fooo = function() {
    $(this).append("foo");
};

$("#hover").hover(fooo);

fooo = function() {
    $(this).append("bar");
};
$("#hover").unbind('hover').hover(fooo);​
于 2012-04-29T14:16:14.870 に答える
2

のコールバックとして割り当てられている関数ではなくfooo、 に割り当てられている関数を変更しています。.hover

明確にするために、関数をイベントのハンドラーとして渡す場合 (の場合のように) $().hover(fooo)、変数を渡すのではfoooなく、それが指す関数を渡します。fooo別のものに再割り当てしても、元の関数はイベント ハンドラーとしてバインドされたままです。

あなたがやろうとしていることを私がやりたいのなら、私は少し違うパラダイムを使うでしょう. 何かのようなもの

var fooo = (function() {
    var altBehavior = false;
    return function() {
        $(this).append(altBehavior ? "bar" : "foo");
        altBehavior = true;
    }
})();

$("#hover").hover(fooo);​

実際のバインドされた関数は決して変更されませんが、それが存在するコンテキストは変更されます。

于 2012-04-29T14:17:02.037 に答える
0

foooハンドラー自体を変更せずに、関数を hover イベントに割り当ててから変数を変更しています。バインドを解除してから、別の関数をバインドする必要があります。 hoverは 2 つのイベントの省略形なので、それぞれのバインドを解除します。

var fooo1 = function() {
  $(this).append("foo").unbind("mouseenter", fooo1).unbind("mouseleave", fooo1).hover(fooo2);
};

var fooo2 = function() {
  $(this).append("bar");
}

$("#hover").hover(fooo1);​
于 2012-04-29T14:22:56.007 に答える