2013-04-04 77 views
1

我正在使用Jquery Mobile在桌面,iPad和Android手機上構建一個Web應用程序。我希望用戶能夠點擊一個按鈕來增加(或減少)一個值。我的代碼可以在桌面上正常工作,但在iPad和Android上,當用戶快速點擊時,屏幕將縮放而不是增加值。 我一直試圖在這裏實現的解決方案:Safari iPad : prevent zoom on double-tap(特別是由克里斯托弗·托馬斯提供的細化如何防止iOS和Android中的雙重縮放

這裏是我的按鈕和值碼:

<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事件的對象來觸發事件。任何人都可以幫我解決這個問題。

+0

我增加這裏的jsfiddle:[鏈接] HTTP:// jsfiddle.net/GZEM7/11/版本11工作正常(它使用'$('#'但')')版本10不起作用(它使用'$(this)')。 – engeeaitch 2013-04-07 13:01:37

+0

你在這裏沒有解釋你是如何將jquery函數應用到你的元素的,例如,看我的代碼,我說「$(」body).nodoubletapzoom();「這是因爲我想將函數應用到整個文檔,這可以解釋爲什麼你會得到整個文檔,而不是選定的元素? – 2013-04-08 10:37:40

+0

也,我有一個「內容」節點內的身體,我想確保所有的事件不起泡到正文元素,所以我使用jquery.on()將jquery點擊處理程序等附加到內容節點,然後我將雙抽頭處理程序附加到主體,這意味着任何轉義「內容」節點併到達主體的事件,我想忽略,但我用「內容」像<>來捕捉事件,你明白嗎? – 2013-04-08 10:39:47

回答

3

好吧,所以「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); 
     }); 
}); 
+0

您可以將其更改爲「noDoubleTapZoom」而不是「nodoubletapzoom」嗎?這會讓我很開心 – krummens 2017-01-05 22:37:37

+0

,你可以做任何你想做的事,只要複製代碼,然後改變它,只要你喜歡。 – 2017-01-06 10:28:36

+0

是的,我做到了。但在你的答案。只是因爲 – krummens 2017-01-06 18:56:26