2011-02-14 6 views
3

をダブルクリック私はクリックやdoubleclicksを区別するための次のコードを持っている:は、単一の間で区別し

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 
    var clicks; 
    $(element).observe('click', function (event) { 
     ++clicks; 
     if (clicks === 1) { 
      var timeoutCallback = function (event) { 
       if (clicks === 1) { 
        singleClickHandler.call(this, event); 
       } else { 
        doubleClickHandler.call(this, event); 
       } 
       clicks = 0; 
      }; 
      timeoutCallback.bind(this).delay(timeout/1000); 
     } 
    }.bind(this)); 
} 

問題:遅延コールバックが呼び出されたときにイベントはもう住んでいません。 Firefoxでは動作しますがIE8では動作しません。クリックハンドラに渡されるイベントオブジェクトは、イベント自体が既に渡されているため「死んでいる」。

誰でもこの問題を解決する方法をアドバイスしていますか?

+1

私はまったくこれをやりません。ブラウザタイマーの信頼性は低いので、ユーザーを夢中にさせるでしょう。ウェブは一般的にはダブルクリックをしません。 – Pointy

+0

なぜonclickとondblclickを使用しないのですか?それをサポートしていないオブジェクトですか? http://msdn.microsoft.com/en-us/library/ms536921%28v=vs.85%29.aspx https://developer.mozilla.org/en/DOM/element.ondblclick – mplungjan

+3

@mplungianでもいくつかの種類のタイマーコードを追加する必要があります。どうして?すべての "dblclick"も最初に "クリック"イベントを発生させるからです。したがって、 "クリック"イベントハンドラは、 "dblclick"も発生するのを待つ必要があります。それは混乱です。 – Pointy

答えて

1

私はOpenLayersプロジェクトの似たようなものを知っています。このファイルの210行目をご覧ください:OpenLayers.Handler.Click sourcecode

私はプロトタイプフレームワークでこれを使用する方法がわからないが、私はそれが正しい方法であなたを得ることができると思います:)

もう一つ:それはよりよい代わりのmouseUpイベントを使用していないだろうクリック?

3

クリックイベントだけでなく、doubleclickイベントも監視しないでください。プロトタイプのdblclickイベントIDがあります

var clicks;  
observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 

$(element).observe('click', function (event) { 
    ++clicks; 
    if (clicks === 1) { 
     var timeoutCallback = function (event) { 
      if (clicks === 1) { 
       singleClickHandler.call(this, event); 
      } else { 
       doubleClickHandler.call(this, event); 
      } 
      clicks = 0; 
     }; 
     timeoutCallback.bind(this, event).delay(timeout/1000); 
    } 
}.bind(this)); 

}

+0

これはまったく信頼できないとは言えません。 [Here](http://www.quirksmode.org/js/events_mouse.html#dblclick)は、たとえばQuirksModeの簡単な段落です。 – Pointy

+0

@Pointy:引用が必要 – kikito

+0

@Pointyそうではありません。 'dblclick'はプロトタイプで頻繁に使用され、すべてのブラウザで動作します。一貫性のない行動の具体例を教えてください。全くコメントしないでください – TurBas

0

:ここ

$(element).observe('click',singleClickHandler); 
$(element).observe('dblclick',doubleClickHandler); 

は、すべての議論の後に変更されたバージョンです。なぜあなたはそれを使用しないのですか?

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler) { 

    $(element).observe('click', function (event) { 
    singleClickHandler.call(this, event); 
    } 

    $(element).observe('dblclick', function (event) { 
    doubleClickHandler.call(this, event); 
    } 
} 
+1

doubleclickの最初のクリックでsingleClickHandlerがトリガーされるため – tyrondis

+0

その場合は、別のボタンまたはリンクを追加してください。クリックやダブルクリックで違うことをしているのであれば、問題を尋ねているだけです。 – kikito

関連する問題