2009-07-01 1 views

答えて

76

これは良い質問ですが、実際には簡単にはできないと思います。 (Some discussion on this

あなたがこの機能を持っていることが重要超大型のであれば、あなたはそうのようにそれをハック可能性:

function singleClick(e) { 
    // do something, "this" will be the DOM element 
} 

function doubleClick(e) { 
    // do something, "this" will be the DOM element 
} 

$(selector).click(function(e) { 
    var that = this; 
    setTimeout(function() { 
     var dblclick = parseInt($(that).data('double'), 10); 
     if (dblclick > 0) { 
      $(that).data('double', dblclick-1); 
     } else { 
      singleClick.call(that, e); 
     } 
    }, 300); 
}).dblclick(function(e) { 
    $(this).data('double', 2); 
    doubleClick.call(this, e); 
}); 

そして、ここではexample of it at workです。

コメントに指摘されているように、上記のプラグインがありますが、私は上記のことをやっていますが、あなたのためにパッケージ化していますので、醜いものを見る必要はありません。FixClick

+0

これはうまくいくようですが、0.5秒間の通常のクリックを検出しないという別の問題があります。私はもちろん、時間を短縮することができますが...ああ。私はこれを自分自身で理解します。とにかくありがとう。 –

+0

ええ、私は250と思っているか、それほど少なくても、おそらくダブルクリックまで期待するのは妥当でしょう。私はこれについていくつかの深刻なグーグルをやってきたし、明らかにこれはあなたが得る最高です。あなたが気分が良くなるならば、醜いものを隠すためにプラグインを作ることができます。 :) –

+0

興味深い、まだこれを試していなかったし、実際にそれを行うためにハックした方法のように見えます。しかし、イベントの観点から見ると、クリックイベントが2回呼び出されることは意味があります。 – jitter

7

他の回答に概説されているテクニックは、debouncingとして知られています。

+0

クールなものと素敵な記事。 +1 –

31

Raymond Chenは、Windowsの文脈で話しているが、ブラウザベースのUI設計に関連していると語っているが、implications of single-versus-double clickingのいくつかについて議論している。

基本的に、ダブルクリックで行われる操作は、1回のクリック後に行うべき論理的な操作です。たとえば、デスクトップのUIでは、ワンクリックで項目が選択され、ダブルクリックすると開きます(ファイルを開く、アプリケーションを起動するなど)。ユーザーはファイルを選択して開く必要があるため、ダブルクリック操作の前にシングルクリック操作を行っても問題ありません。

ダブルクリックアクションがシングルクリックアクションと完全に無関係なUIコンポーネントがある場合、システムが実際にダブルクリックした後にシングルクリックアクションが発生しないようにする必要があるあなたのデザインを再考するべきです。ユーザーは演技に慣れていないので、扱いにくく直観的であることがわかります。

このようにしたい場合は、デバウンス手法を使用する必要があります(この場合、すべてのシングルクリックアクションが遅延されます)。そうでない場合、ダブルクリックハンドラは、シングルクリックハンドラ

また、一部のユーザーは非常に長いダブルクリック時間を設定することに注意してください。例えば、関節炎の手を持つ人は、自分のシステム環境設定で2回以上のクリック時間を持つかもしれないので、あなたが選んだ任意の時間に基づいたデバウンス技術は、あなたのUIコンポーネントにはアクセスできない単一のクリック動作を取ることは、ダブルクリック動作を排除する。私が知る限り、「ワンクリックで直前に起こったことを元に戻す」テクニックは、このための実行可能な回避策です。

+1

これは良い点です! –

+0

ユーザーが自分のダブルクリック時間を設定できるという良い点...シングルクリックアクションを実行する前に完全な秒間待機したくないので、タイムアウトでダブルクリックを待つことは実用的でない – Hrqls

+0

時にはダブルクリックアクションは、ワンクリック後の論理的なフォローアップであり、以前はシングルクリックアクションを実行しても問題ありませんが、私の場合は、データトラフィック)を防止したい(正確には傷つけませんが) – Hrqls

1

jQuery Sparkleは、シングルクリックのカスタムイベントを実装することで、このためのきれいでエレガントなソリューションを提供します。これにより、あなたがそう、ちょうど他のイベントと同じように使用することができます:

$('#el').singleclick(function(){}); 
// or event 
$('#el').bind('singleclick', function(){}); 

をまたクリックのシリーズの最後と最初のクリックのカスタムイベントを提供します。また、lastclickカスタムイベントは実際にクリック数を戻します!だからあなたはこれをすることができました!

$('#el').lastclick(function(event,clicks){ 
    if (clicks === 3) alert('Tripple Click!'); 
}); 

カスタムイベントhereを定義するためのソースコードがあります。

これはAGPLライセンスの下で公開されているので、自由に心配する必要はありません。:-)それはまた、日常的に積極的に開発されているので、決して短いサポートにはなりません。

しかし、最も重要なのは、プラグインと拡張機能をはるかに簡単に開発できるようにするためのDRY Plugin/Effect Frameworkです。この目標を達成するのに役立つことを願っています!

0

フォームを送信するボタンの場合(元のポスターの場合は必ずしもそうではありませんが、他の人がGoogle経由でここに来る場合もあります)、より簡単なオプションは、クリックイベントハンドラでクリックされます:

$(selector).click(function(e) { 
    $(this).prop('disable', true); 
} 
関連する問題