JQuery Mobile - 改变taphold灵敏度

时间:2012-02-15 12:19:45

标签: jquery mobile

我在Android上开发的JQuery移动应用程序存在问题。

通常,当我只想滚动一个项目列表时,即使在我触摸的项目上,也会触发taphold。

这对我的用户来说非常令人沮丧。

我该怎么办?

我可以更改taphold事件的灵敏度吗?

很遗憾,我在Google上找不到任何内容。

谢谢,

2 个答案:

答案 0 :(得分:7)

在jQuery-mobile 1.1。*中,他们添加了更方便的方法来配置触摸事件:http://jquerymobile.com/demos/1.1.1/docs/api/events.html

对于taphold,您可以通过为$.event.special.tap.tapholdThreshold指定值来更改点击触发事件之前应持续的时间。

此值应在导入JQM之前在mobileinit事件中设置,但在导入jQuery之后。例如,我做了以下操作以避免滑动和taphold事件之间的任何重叠:

<script type="text/javascript" src="/Scripts/jquery.min.js"></script>
<!-- JQM default options must be set after jQuery and before jQuery-mobile -->
<script type="text/javascript">
    $(document).bind("mobileinit", function () {
        $.event.special.tap.tapholdThreshold = 1000,
        $.event.special.swipe.durationThreshold = 999;
    });
</script>
<script type="text/javascript" src="/Scripts/jquery.mobile-1.1.0.js"></script>

答案 1 :(得分:1)

参见来源:http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.js

查找点击事件(从第1049行开始):

$.event.special.tap = {

第1090至1092行:

timer = setTimeout(function() {
    triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) );
}, 750 );

更改taphold事件触发器的延迟。

750ms = 0.75s

1000是.....

1000 is equal to 1 second

发表评论

使用新的计时器设置重新定义特殊点击事件:从750链接到1000

这段代码可以在你的脚本包含在jQuery mobile(<script src='jquery.mobile.js'></script>然后<script>$.event.special.tap = {...}</script>)之后加入

$.event.special.tap = {
    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,
                timer;

            function clearTapTimer() {
                clearTimeout( timer );
            }

            function clearTapHandlers() {
                clearTapTimer();

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

            function clickHandler(event) {
                clearTapHandlers();

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

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

            timer = setTimeout(function() {
                    triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) );
            }, 1000 ); // Changed from 750 to 1000
        });
    }
};