我修改了@ecmanaut 的 javascript 解决方案来做两件事。
- 我使用modernizr,所以它会在html节点上放置一个.touch css类,所以我可以检测触摸屏而不是使用用户代理检测。也许有一种“无现代化”的方法,但我不知道。
- 我将每个“点击”分开,以便它们单独发生,如果您点击一次,它会点击一次,如果您快速点击按钮/触发器,它会计算多次。
- 一些小的代码格式更改,我更喜欢单独定义的每个 var 等,这更像是一个“我”的东西,我想你可以恢复它,不会发生任何不好的事情。
我相信这些修改会使它变得更好,因为您可以将计数器递增 1,2,3,4 而不是 2,4,6,8
这里是修改后的代码:
// jQuery no-double-tap-zoom plugin
// Triple-licensed: Public Domain, MIT and WTFPL license - share and enjoy!
//
// chris.thomas@antimatter-studios.com: I modified this to
// use modernizr and the html.touch detection and also to stop counting two
// clicks at once, but count each click separately.
(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);
将 nodoubletapzoom() 应用到 body 标签,像这样
$("body").nodoubletapzoom();
你的html结构,应该是这样的
<body>
<div class="content">...your content and everything in your page</div>
</body>
然后在您的 javascript 中,像这样绑定您的点击处理程序
$(".content")
.on(".mydomelement","click",function(){...})
.on("button","click",function(){...})
.on("input","keyup blur",function(){...});
// etc etc etc, add ALL your handlers in this way
您可以使用任何 jquery 事件处理程序和任何 dom 节点。现在你不需要做更多的事情,你必须以这种方式附加所有的事件处理程序,我没有尝试过另一种方式,但这种方式绝对可靠,你可以每秒敲击屏幕 10 次并且它不会缩放并记录点击(显然不是每秒 10 次,ipad 没那么快,我的意思是,您无法触发缩放)
我认为这是可行的,因为您将 nozoom 处理程序附加到正文,然后将所有事件处理程序附加到“.content”节点,但委托给有问题的特定节点,因此 jquery 捕获所有处理程序活动前的最后阶段会冒泡到 body 标签。
此解决方案的主要好处是您只需将 nodoubletapzoom() 处理程序分配给主体,您只需执行一次,而不是为每个元素执行一次,因此获得所需的工作、努力和思考要少得多事情做完了。
这还有一个额外的好处,如果你使用 AJAX 添加内容,它们会自动让处理程序准备好并等待,我想如果你不想要,那么这个方法对你不起作用,你必须调整更多。
我已验证此代码可在 ipad 上运行,实际上它很漂亮,@ecmanaut 的主要解决方案做得很好!
** 于 5 月 26 日星期六修改,因为我发现似乎是一个完美的解决方案,而且工作量极少