5

jQueryMobile1.1.1にバンドルされているPhonegapを使用してiOS用のアプリを開発しています。タップイベントとタップホールドイベントの両方をリッスンしているdivがページにあります。

私が直面している問題は、指を離すと、タップホールドイベントの後にタップイベントが発生することです。これを防ぐにはどうすればよいですか?ここで解決策が提供されていますが、これがこれを行う唯一の方法ですか?ブールフラグを使用して2つを区別する必要がある場合は、tapとtapholdに2つの異なるイベントがあるという全体的なポイントを無効にします。

以下は私のコードです:

$('#pageOne').live('pageshow', function(event) {
    $('#divOne').bind('taphold', function (event) {
       console.log("TAP HOLD!!");    
    });

    $('#divOne').bind('tap', function () {
      console.log("TAPPED!!");
    });
});

助けていただければ幸いです。ありがとう!

4

7 に答える 7

3

偶数を定義する前に、これをドキュメントの上部または任意の場所に設定するだけです。

$.event.special.tap.emitTapOnTaphold = false;

次に、次のように使用できます。

$('#button').on('tap',function(){
    console.log('tap!');
}).on('taphold',function(){
    console.log('taphold!');
});
于 2014-02-18T08:54:18.813 に答える
2

[試してテスト済み]jQueryMobile の実装を確認しました。彼らは、「vmouseup」で毎回「taphold」の後に「tap」イベントを発生させています。

回避策は、「taphold」が発生した場合に「tap」イベントを発生させないことです。次のように、必要に応じてカスタムイベントを作成するか、ソースを変更します。

$.event.special.tap = {
    tapholdThreshold: 750,

    setup: function() {
        var thisObject = this,
            $this = $( thisObject );

        $this.bind( "vmousedown", function( event ) {

            if ( event.which && event.which !== 1 ) {
                return false;
            }

            var origTarget = event.target,
                origEvent = event.originalEvent,
                /****************Modified Here**************************/
                tapfired = false,
                timer;

            function clearTapTimer() {
                clearTimeout( timer );
            }

            function clearTapHandlers() {
                clearTapTimer();

                $this.unbind( "vclick", clickHandler )
                    .unbind( "vmouseup", clearTapTimer );
                $( document ).unbind( "vmousecancel", clearTapHandlers );
            }

            function clickHandler( event ) {
                clearTapHandlers();

                // ONLY trigger a 'tap' event if the start target is
                // the same as the stop target.
                /****************Modified Here**************************/
                //if ( origTarget === event.target) {
                 if ( origTarget === event.target && !tapfired) {
                     triggerCustomEvent( thisObject, "tap", event );
                 }
            }

            $this.bind( "vmouseup", clearTapTimer )
                .bind( "vclick", clickHandler );
            $( document ).bind( "vmousecancel", clearTapHandlers );

            timer = setTimeout( function() {
                tapfired = true;/****************Modified Here**************************/
                triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
            }, $.event.special.tap.tapholdThreshold );
        });
    }
};
于 2012-08-13T20:18:23.037 に答える
0

この問題を解決するには、jqueryのstopImmediatePropagation()メソッドを使用できます。jquery apiの説明によると、stopImmediatePropagation()メソッド

「残りのハンドラーが実行されないようにし、イベントがDOMツリーをバブリングするのを防ぎます。」

于 2012-08-01T13:13:34.793 に答える
0

これをtapholdイベントハンドラーに入れてください...この提案は、oがtapholdを起動したjQueryオブジェクトであることを前提としています

jQuery(o).one('tap click'、function(){return false;});

1つのメソッドにバインドすると、イベントが1回だけ発生します。falseを返すと、<a>タグの場合、そのイベントの実行が停止します。

于 2013-06-14T04:22:36.420 に答える
0

スワイプしてタップホールドをトリガーするので、次のようにしてシンプルに保つことができました。

    $(c).bind("taphold",function(e){
        if(e.target.wait){
            e.target.wait = false;
        }else{
            alert("fire the taphold");
        }//eo if not waiting
    });
    $(c).bind("swipe",function(e){
            e.target.wait = true;//taphold will come next if I don't wave it off
        alert(e.target.text+"("+e.target.attributes.dataId.value+") got swiped");
        return false;
    });

タップもサポートするために、タップイベントが常に発生するまで待機を延期します。

于 2014-06-14T21:46:45.443 に答える
0

私はまだ問題を抱えています。jquery-mobileのタップホールドで、タップホールドの後に呼び出されるクリックの問題を解決し、要素にタイムアウトを設定しました。JQM 1.4、emitTapOnTaphold = false;

例:

$(".element").on("taphold", function () {
        // function her

         setTimeout (function () {
             $(this).blur();
         400);
});
于 2018-01-12T17:14:14.787 に答える
-1

$ .event.special.tap = {tapholdThreshold:750、

setup: function() {
    var thisObject = this,
        $this = $( thisObject );

    $this.bind( "vmousedown", function( event ) {

        if ( event.which && event.which !== 1 ) {
            return false;
        }

        var origTarget = event.target,
            origEvent = event.originalEvent,
            /****************Modified Here**************************/
            tapfired = false,
            timer;

        function clearTapTimer() {
            clearTimeout( timer );
        }

        function clearTapHandlers() {
            clearTapTimer();

            $this.unbind( "vclick", clickHandler )
                .unbind( "vmouseup", clearTapTimer );
            $( document ).unbind( "vmousecancel", clearTapHandlers );
        }

        function clickHandler( event ) {
            clearTapHandlers();

            // ONLY trigger a 'tap' event if the start target is
            // the same as the stop target.
            /****************Modified Here**************************/
            //if ( origTarget === event.target) {
             if ( origTarget === event.target && !tapfired) {
                 triggerCustomEvent( thisObject, "tap", event );
             }
        }

        $this.bind( "vmouseup", clearTapTimer )
            .bind( "vclick", clickHandler );
        $( document ).bind( "vmousecancel", clearTapHandlers );

        timer = setTimeout( function() {
            tapfired = true;/****************Modified Here**************************/
            triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
        }, $.event.special.tap.tapholdThreshold );
    });
}

};

@Akash Budhia:ソリューションをありがとう。それは素晴らしいです、それは私のために働くように聞こえます!

于 2015-02-09T01:31:09.933 に答える