【问题标题】:How to prevent doubletap zoom in iOS and Android如何防止 iOS 和 Android 中的双击缩放
【发布时间】:2013-03-26 02:51:57
【问题描述】:

我正在使用 Jquery Mobile 构建一个用于桌面、iPad 和 Android 手机的网络应用程序。我希望用户能够点击一个按钮来增加(或减少)一个值。我的代码在桌面上运行良好,但在 iPad 和 Android 上,当用户快速点击时,屏幕会缩放而不是值递增。 我一直在尝试在这里实施解决方案:Safari iPad : prevent zoom on double-tap(尤其是 Christopher Thomas 提供的改进。

这是我的按钮和值代码:

    <div class="content">
        <div id ="status_page" data-role="page">
            <div data-role="content" data-theme="d">
                <div id="val">1</div>
                <div id="but" data-role="button">Click</div>
            </div>
        </div>
    </div>

这是我点击按钮的事件处理程序(顺便说一句 - 我认为克里斯托弗的答案中的参数是错误的):

        $(".content") .on("click",$("#but"),function(){
            var but_val = parseInt($("#val").text());
            $("#val").text(but_val+1);
        });

...这里是 nodoubletap 函数:

(function($) {
$.fn.nodoubletapzoom = function() {
    if($("html.touch").length == 0) return;

    $(this).bind('touchstart', function preventZoom(e){
        var t2 = e.timeStamp;
        var t1 = $(this).data('lastTouch') || t2;
        var dt = t2 - t1;
        var fingers = e.originalEvent.touches.length;
        $(this).data('lastTouch', t2);
        if (!dt || dt > 500 || fingers > 1){
            return; // not double-tap
        }
        e.preventDefault(); // double tap - prevent the zoom
        // also synthesize click events we just swallowed up
        $(this).trigger('click');
    });
};
})(jQuery);

此函数正确捕获双击。但是,最后的触发功能不起作用(事件没有被触发)。如果我用$('#but').trigger('click'); 替换$(this).trigger('click');,那么一切都会正常运行。我希望这适用于许多不同的按钮,因此我需要能够根据调用 touchstart 事件的对象触发事件。谁能帮我解决这个问题。

【问题讨论】:

  • 我在这里添加了一个 jsfiddle:[link]jsfiddle.net/GZEM7/11 版本 11 工作正常(它使用 $('#but'))版本 10 不起作用(它使用 $(this))。
  • 您没有在这里解释如何将 jquery 函数应用于您的元素,例如,请参阅我的代码,其中我说“$("body).nodoubletapzoom();”那是因为我想要将该函数应用于整个文档,这可以解释为什么您获取的是整个文档而不是选择的元素?
  • 另外,我在正文中有一个“内容”节点,我想确保所有事件都不会冒泡到正文元素,所以我将 jquery 点击处理程序等附加到使用 jquery.on() 的内容节点,然后我将双击处理程序附加到正文。这意味着任何逃离“内容”节点并到达正文的事件,我想忽略,但我使用像 > 这样的“内容”来捕捉事件,你明白了吗?
  • 嗨克里斯托弗 - 非常感谢您的帮助。我一定是做错了什么,但我不确定是什么 - 如果你看一下 jsfiddle,我已经将 nodoubletapzoom 函数绑定到正文,并且我在正文中有一个内容节点。如果您能指出我哪里出错了,我将不胜感激。
  • 应该是 "$(this).trigger("click")" 而你把它改成了 $("#but").....

标签: jquery events zooming


【解决方案1】:

好的,所以“engeeaitch”最终的解决方案是在下面的 jsfiddle 中?

http://jsfiddle.net/GZEM7/18/

解决办法是更换

$(this).trigger("click"):

$(e.target).trigger("click");

当然,我删除了你的 IOS 测试,因为这样它就可以在 chrome 和 android 设备上运行:D

这就是最终的解决方案?凉爽的!我打算用新版本更新我的代码,我认为它会更好

最终代码为:

$.fn.nodoubletapzoom = function() {
    $(this).bind('touchstart', function preventZoom(e){
        var t2 = e.timeStamp;
        var t1 = $(this).data('lastTouch') || t2;
        var dt = t2 - t1;
        var fingers = e.originalEvent.touches.length;
        $(this).data('lastTouch', t2);
        if (!dt || dt > 500 || fingers > 1){
            return; // not double-tap
        }
        e.preventDefault(); // double tap - prevent the zoom
        // also synthesize click events we just swallowed up
        $(e.target).trigger('click');
    });
};
})(jQuery);

$(document).on('pageinit',"#status_page", function(){
        $("body").nodoubletapzoom();
        $(".content").on("click", "#but", function() {
            var curr_val = parseInt($("#val").text());
            $("#val").text(curr_val + 1);
        });
});

【讨论】:

  • 你能把它改成noDoubleTapZoom而不是nodoubletapzoom吗?那会让我开心
  • 好吧,你可以做任何你想做的事,只需复制代码并随意更改即可。
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 2014-09-20
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多