2009-08-31 7 views
2

私はjqueryを使用しています。私がやっていることは、Webページ上のいくつかのボタンにトグルメソッドをバインドすることです。このようなものです。javascript関数がすでに実行中か、または別の実行中であることを防ぐ最も良い方法は?

$('.button').toggle(function(){ 
    // first function 
}, function(){ 
    // second function 
}); 

ただし、これらの機能にはアニメーションがあります。したがって、ユーザは、第1または第2の機能が実行されている間にボタンをクリックすることができる。そして、これはHTML要素の順序を混乱させ、ページの最後に移動させる可能性があります。基本的にこれらの機能は最初のクリックで要素を最後まで移動させ、もう1回は最初の要素を元の位置に戻します。

もちろん、ページを移動するとボタンをクリックするのは難しいです。しかしそれは可能です。

答えて

0

自分のトグルを実装するのが嬉しいようです。トグルは実際にはロジックが0個の場合にのみ機能します。

$('.button').click( 
function() { 
    if($(self).is(":animated") { 
    return false; 
    } 
    if($(self).is(".rolledup")) { 
    self.apply(roll_window_down);  
    } else { 
    self.apply(roll_window_up);  
    } 
}); 



function roll_window_up() { 
    $(self).addClass('rolledup'); 

    // first function  
} 

function roll_window_down() { 
    $(self).removeClass('rolledup'); 
    // first function  
} 
+0

これは私がやることだと思います。 – fent

5

フラグを使用できます。アニメーション開始時にフラグisAnimatingをtrueに設定し、終了時にfalseに設定します。以降のアニメーションは、この値がfalseの場合にのみ進めることができます。

:animated selectorがイベントの所有者に該当するかどうかを確認することもできます。あなたの意思決定をその根拠に基づいて行います。

+0

これはトグル()で動作しますか?アニメーション機能が2つあるため、機能1の実行を停止すると、次にユーザーがボタンをクリックすると再び機能2に移動します。 – fent

+0

私が示唆していることは、各関数の先頭に 'if-statement 'を置くことです。'isAnimating'がtrueの場合、関数をそのままにします。 falseの場合は、この関数を続行します。それはあなたが探しているものではありませんか? – Sampson

+0

私はあなたが何を意味するか知っています。私はトグル()機能をそこに維持しながらこれを行うことができるかどうか疑問に思っていました。しかし、私はそれを取り除き、使用する機能を決定するために自分自身を使用しなければならないでしょう。 – fent

3

boolをセミフォアとして使用することはできますが、これは決して安全ではありませんが、javascriptは実際にはロックをサポートしていないため、このアプローチではデッドロックや競合状態になる可能性があります。あなたは2つの機能を配置する必要があり

0

回:)の99.9%を働くあなたは、関数の入り口を制御するためのフラグを保持することが可能な状況に切り替えるために渡す: -

(function() { 
    var toggling = false; 
    $('.button').toggle(function(){ 
    if (!toggling) { 
     toggling = true;   
     // first function 
     toggling = false; 
    } else { 
     // whatever you want to happen if re-entrance attempted 
    } 
    }, function(){ 
    if (!toggling) { 
     toggling = true;   
     // second function 
     toggling = false; 
    } else { 
     // whatever you want to happen if re-entrance attempted 
    } 
    }) 
)(); 

NBこれはシリアライズすべては、.buttonクラスを持つ要素のトグルです。 IOWはすべてのボタンに対して1つのtogglingフラグしかありません。各ボタンに独自のトグルフラグを設定したい場合: -

$('.button').each(function() { 
    var toggling = false; 
    $(this).toggle(function(){ 
    if (!toggling) { 
     toggling = true;   
     // first function 
     toggling = false; 
    } else { 
     // whatever you want to happen if re-entrance attempted 
    } 
    }, function(){ 
    if (!toggling) { 
     toggling = true;   
     // second function 
     toggling = false; 
    } else { 
     // whatever you want to happen if re-entrance attempted 
    } 
    }); 
); 
+0

ありがとうございます。論理は少し間違っていますが。アニメーション中にボタンをクリックして再度クリックすると、2番目のトグル機能が起動しますが、if(!切り替え)のために何も起こりません。次にそれらをクリックすると、ボタンはページの一番下に表示されますが、最初の機能がトリガーされます。ありがとう、私がする必要があるのはif文をtoggle()の前に置くことだけです。 – fent

+0

@Roly:あなたのロジックが何であるかはあなたの質問からは明らかではありませんでしたが、この例は、必要なフラグを保持するための適切なコンテキストを作成する方法を示すために設計されています。私はあなたが必要に応じてあなたの特定のロジックに例を曲げることができたと確信していた。 – AnthonyWJones

0

キューが必要です。あなたはセマフォ変数を1構築することができますが、jQueryのは、すでに1を提供するので、多分あなたはそれを使用したい:

$('.button').toggle(function() { 
    $(document).queue("foo", function() { 
    ... 
    }); 
}, function() { 
    $(document).queue("foo", function() { 
    ... 
    }); 
}); 

jQueryのは、通常のアニメーションをシリアル化するために、「FX」キューを使用しますが、この「foo」を使用することができますあなたが望むもののためのキュー。

キューはどのオブジェクトにも置くことができるので、その中にすべての.buttonオブジェクトを持つコンテナに配置したいかもしれません。あなたはボタン(これ)自体にそれを置くことはできません、またはあなたは今どこにいるかに戻るでしょう。

これを済ませたら、実際にやる必要があるのはアニメーションを中止することだけです。これは、明示的に "fx"キューを空にするか、$('.button').stop();を使用してすべての古いアニメーションを停止することによって実行できます。

関連する問題