2011-07-26 9 views
1

ユーザーがクリックして要素を保持したときに特定のアクションが発生するWebアプリケーションにいくつかの機能が必要です。それはAndroidの長いプレスのように考えてください。JavaScriptはsetTimeoutを使用して要素をクリックして保持する

私はdiv要素を持っている:

<div id="myDiv" 
    onmousedown="press()" 
    onmouseup="cancel()" 
    onmouseout="cancel()" 
    onmousemove="cancel()">Long Click Me</div> 

と私のjavascript:

var down = false; 

function press() 
{ 
    down = true; 
    setTimeout(function() { action(); }, 1500); 
} 

function cancel() 
{ 
    down = false; // this doesn't happen when user moves off div while holding mouse down! 
} 

function action() 
{ 
    if (!down) 
    return; // if the flag is FALSE then do nothing. 

    alert("Success!"); 
    down = false; 
} 

これは限り私はすべてがプレスされ、要素の上に保持するように動作します。私は、キャンセル()を呼び出すためにonmouseoutonmousemoveイベントを持っています。私は、アクションを開始する前に、ユーザーが気を付けてマウスを要素から離してしまうようにしたいからです。

残念ながら、私のコードはこれをしないようです。 実際、使用が一瞬クリックされた場合、マウスをdivから離してを解放してからの1.5秒後に、action()は期待どおりに取り崩されません。

編集:あなたの入力皆のおかげで、それは私が特別少しだけだが判明したと私は私れるonmouseoutで、私のHTMLでの大文字を忘れてしまったことがわかりませんでした。上記のサンプルコードは、期待どおりに動作するはずです。

+0

これはすべてのブラウザで起こっているのでしょうか?他の人にテストさせるために[jsfiddle](http://jsfiddle.net/)を作ってみませんか?また、boolを使用せず、単に 'var'を使用すると、JavaScriptは動的に型付けされます。 –

+0

私はこのコードをvarに入れました。この例を書いたときに私は誤ってboolを書きました。 – Ozzah

+1

みんな、答えを止める。私は間違った質問をしました、残念です。問題はそのアクション()が始まっていない - 私はテストがある:if(!down)return;それは問題ではありません。問題は、ユーザーがマウスボタンを押したままdivからマウスを離した場合、cancel()が呼び出されていないことです。これは私の問題を説明するための単なるおもちゃの例です。私は実際には*必要がある*あなたが1.5秒前にdivから離れるときに呼び出されるcancel()を持っている必要があります。そうでなければ短いクリックは後で動作しません。 – Ozzah

答えて

0

もちろん、action()はまだ呼び出されています。あなたは実際にsetTimeout()機能をキャンセルしませんでした。あなたの本当のコードでおそらくスコープの問題があり、同じバージョンのdone変数をテストしていないと思われます。

downフラグを使用するよりも良い方法は、戻り値をsetTimeout()から追跡し、実際にはcancel()機能でタイマをキャンセルすることです。その後、あなたがしたくないときは、action()は決して発射しません。私はそれが技術的にはより正確な動作だと思うので、タイマーを放つチャンスをキャンセルするためにマウスを離してください。 JavaScriptで

bool down = false; 

また、のようなものはありません。私はこのコードをお勧めします

var down = false; 

: - それ以外の場合は、まだ火の意志 - あなたはそれを開始したよう

var downTimer = null; 

function down() 
{ 
    cancel(); 
    downTimer = setTimeout(function() { action(); }, 1500); 
} 

function cancel() 
{ 
    if (downTimer) 
    { 
    clearTimeout(downTimer); 
    downTimer = null; 
    } 
} 

function action() 
{ 
    downTimer = null; 
    alert("Success!"); 
} 
+0

1)主な質問に対する私のコメントを参照してください:私は、例のQを書くときに、私はvarを持っていたときにタイプミスをしました。 2)アクションの最初の2行()が 'down'フラグを調べることを確認しましたか?私は質問をよりうまく表現するべきだったと思う:「なぜアクション()がまだ「なぜ呼び出されているのか」を「なぜ、アクション()が期待どおりに救済できないのか? – Ozzah

+0

実際のコードでは、あなたが思っている 'down'変数の同じコピーをテストしないように、' down'変数のスコープの問題を疑うでしょう。あなたのサンプルは、ここに書かれているように(あなたがタイプミスを訂正すると)、私はそれがうまくいくように見えます。しかし、私はまだフラグを設定するのではなく、タイマーをキャンセルする方が良いと思っています。マウスを離したときの動作がやや正しいと思います。 – jfriend00

+0

問題が見つかりました。私は私のdivの私のonmouseoutのタイプミスを持っていた。私は大文字を忘れてしまった。なぜZendはjavascriptでオートコンプリートしていないのですか? – Ozzah

0

あなたはまた、あなたのキャンセル機能でタイムアウトをクリアする必要があることがなければならないであろうダウン機能。キャンセル()関数内でタイムアウトをキャンセルする

..だから

bool down = false; 
//your timeout var 
var t; 

function down() 
{ 
    down = true; 
    t = setTimeout(function() { action(); }, 1500); 
} 

function cancel() 
{ 
    down = false; 
clearTimeout(t); 
} 

function action() 
{ 
    if (!down) 
    return; 

    alert("Success!"); 
    down = false; 
} 
0

は、

var mytimer = null; 

function ondown(){mytimer = setTimeOut('action()', 1500;)} 

function cancel(){clearTimeout(mytimer);} 
function action(){mytimer=null; alert('success!');} 

を使用また、あなたがその関数として変数エンドとして最初downを使用していることに注意してください。.. downは関数を参照するので、if(!down)を呼び出すと常にfalseが返されます。

0

あなたのコードにはいくつか問題があります。

まず

bool down = false; 

はJavaScriptを有効ではありません。

var down = false; 

downという2つの変数があります。ブール値と関数です。 downをtrueまたはfalseに設定するステートメントの1つを実行するまで、関数は変数を上書きします。

他の人は言ったように:一度設定すると、タイムアウトをキャンセルしない限り、遅延機能は1.5秒後に実行され続けます。しかし、何かをする前にマウスボタンが押されているかどうかをチェックするので、もう一度やり直してください。

だから私はブール変数の名前をisMouseDownまたは何かに変更してもう一度やり直すといいでしょう。

関連する問題