【发布时间】: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").....