2012-01-30 7 views
9

मोबाइल डिवाइस (आईपैड, गैलेक्सी टैब) पर एक वेबसाइट देखने पर हमेशा एक अंतराल होता है जब मैं किसी तत्व पर क्लिक करता हूं (नियमित लिंक या जावास्क्रिप्ट/jquery का उपयोग करके क्लिक करने योग्य कुछ भी)।मोबाइल टच डिवाइस पर क्लिक अंतराल को हटाने का कोई तरीका है?

ऑनलाइन पढ़ने के दौरान, मुझे पता चला कि ब्राउजर टचस्टार्ट का उपयोग कर टचस्टेंड घटनाओं के बाद उपयोग कर रहा है, और बाद में यह नियमित क्लिक ईवेंट ट्रिगर करता है। क्या कोई और उत्तरदायी टैप करने का कोई तरीका है और देरी हुई क्लिक ईवेंट को हटा दें? शायद जावास्क्रिप्ट का उपयोग करके, या कुछ और?

उत्तर

2

यदि आप एक वेब पेज लिख रहे हैं तो आप टचस्टार्ट और टचचेंड के लिए श्रोता पंजीकृत कर सकते हैं और किसी भी देरी के बिना सीधे टच एंड पर ऑनक्लिक कोड ट्रिगर कर सकते हैं।

आप संपर्क में घटना को संभालने के तत्व

करने के लिए ब्राउज़र के लिए कदम (कुछ अंतराल के साथ) भेजेंगे एक क्लिक करें घटना गूगल से इस विवरण पर एक नजर डालें "फास्ट बटन" बनाने के लिए डॉन `t: http://code.google.com/intl/de-DE/mobile/articles/fast_buttons.html

+0

यदि आप कुछ कोड पोस्ट कर सकते हैं तो आप इसकी सराहना करेंगे। वेबसाइटों का निर्माण करते समय मैं आमतौर पर jQuery का उपयोग करता हूं और मुझे पता है कि मैं क्लिक ईवेंट ट्रिगर करने के लिए .trigger() का उपयोग कर सकता हूं। लेकिन मुझे नहीं पता कि मैं इसे प्रत्येक बार "मैन्युअल रूप से" क्लिक करके "क्लिक" पर कॉल कर सकता हूं, इसे मैन्युअल रूप से जोड़ने के बिना मैन्युअल रूप से इसे कैसे क्लिक कर सकता हूं ... – Gabriel

+1

मैंने उचित लिंक –

5

मैट की लाइब्रेरी से अनुकूलित (https://stackoverflow.com/a/9370637/1491212) खुद को Google कोड से अनुकूलित किया गया, मैंने एक jQuery प्लगइन लिखा।

इस तरह

उपयोग: $('mySelector').fastClick(handler);

(function($){ 
    var clickbuster = { 
     preventGhostClick: function(x, y) { 
      clickbuster.coordinates.push(x, y); 
      window.setTimeout(clickbuster.pop, 2500); 
     }, 
     pop: function() { 
      clickbuster.coordinates.splice(0, 2); 
     }, 
     onClick: function(event) { 
      for (var i = 0; i < clickbuster.coordinates.length; i += 2) { 
      var x = clickbuster.coordinates[i]; 
      var y = clickbuster.coordinates[i + 1]; 
      if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) { 
       event.stopPropagation(); 
       event.preventDefault(); 
      } 
      } 
     } 
    }; 


    var methods = { 
     init: function(handler){ 
      return this.each(function() { 
       var $this = $(this), 
        data = $this.data('fastClick'); 
       if(!data){ 
        this.addEventListener('touchstart', methods.handleEvent, false); 
        this.addEventListener('click', methods.handleEvent, false); 
        $this.data('fastClick', { 
         target: $this, 
         handler: handler 
        }); 
       } 
      }); 
     }, 
     handleEvent:function(event) { 
      switch (event.type) { 
      case 'touchstart': $(this).fastClick('onTouchStart',event); break; 
      case 'touchmove': $(this).fastClick('onTouchMove',event); break; 
      case 'touchend': $(this).fastClick('onClick',event); break; 
      case 'click': $(this).fastClick('onClick',event); break; 
      } 
     }, 
     onTouchStart: function(event) { 
      event.stopPropagation(); 
      this[0].addEventListener('touchend', methods.handleEvent, false); 
      var _this = this; 
      document.body.addEventListener('touchmove', function(event){ 
      methods.handleEvent.apply(_this,[event]); 
      }, false); 

      $(this).data('fastClick').startX = event.touches[0].clientX; 
      $(this).data('fastClick').startY = event.touches[0].clientY; 
     }, 
     onTouchMove: function(event) { 
      if (Math.abs(event.touches[0].clientX - this.data('fastClick').startX) > 10 || 
       Math.abs(event.touches[0].clientY - this.data('fastClick').startY) > 10) { 
       this.fastClick('reset'); 
      } 
     }, 
     onClick: function(event) { 
      event.stopPropagation(); 
      $(this).fastClick('reset'); 
      $(this).data('fastClick').handler.call(this,event); 

      if (event.type == 'touchend') { 
      clickbuster.preventGhostClick($(this).data('fastClick').startX, $(this).data('fastClick').startY); 
      } 
     }, 
     reset: function() { 
      this[0].removeEventListener('touchend', methods.handleEvent, false); 
      document.body.removeEventListener('touchmove', methods.handleEvent, false); 
     } 
    } 
    $.fn.fastClick = function(method) { 
     if (methods[method]) { 
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof method === 'object' || typeof method === 'function' || !method) { 
      return methods.init.apply(this, arguments); 
     } else { 
      $.error('Method ' + method + ' does not exist on jQuery.hScroll'); 
     } 

    } 

    clickbuster.coordinates = []; 
    document.addEventListener('click', clickbuster.onClick, true); 

})(jQuery); 
+0

के साथ उत्तर अपडेट किया है, लेकिन यह ' मैं यह जानने के लिए कैसे काम करता हूं कि $ - (यह) आपके द्वारा क्लिक की जाने वाली चीज़ को वापस नहीं लौटाता है, सामान्य रूप से किसी ईवेंट को बाध्य करने के विपरीत। '$ ('a')। fastClick (function() {चेतावनी ($ (यह) .attr ('href'))}); उदाहरण के लिए - मैं इसे काम करने के लिए कैसे प्राप्त कर सकता हूं? –

+0

मैं भी इस समस्या में भाग गया। बस मेरा जवाब संपादित किया। ऑनक्लिक हैंडलर को दाएं दायरे में बुलाया जाना चाहिए: हैंडलर.call (यह, घटना); संपादित करें –

+1

संपादित करें, यह अब और आवश्यक है? मैंने कुछ लेखों को सुझाव दिया कि जिंजरब्रेड से आगे बढ़ते हैं कि यदि आपने व्यूपोर्ट मेटा टैग पर ज़ूमिंग अक्षम कर दी है, तो स्पर्शों में अंतराल नहीं था ... इसके बारे में कुछ भी पता है? –

0

मैं पहचान का उपयोग करता है, तो आधुनिक तरह डिवाइस समर्थन टच। मैं touchClick नामक एक var को 'click' या 'touchend' आधार पर आधार पर भरता हूं यदि यह टच डिवाइस है या नहीं। Jquery में मैं बस कॉल करता हूं:

$('element').on(touchClick, function(e){ //do something }); 

इसमें बहुत छोटा पदचिह्न है।

+0

यदि ब्राउज़र टचस्क्रीन सक्षम लैपटॉप से ​​उपयोग किया जाता है तो यह दृष्टिकोण खतरनाक है। माउस क्लिक काम नहीं करेगा ... – franzlorenzon

संबंधित मुद्दे