2012-08-01 8 views
5

मैं jQuery मोबाइल 1.1.1 के साथ बंडल किए गए फोनगैप का उपयोग करके आईओएस के लिए एक ऐप विकसित कर रहा हूं। मेरे पास मेरे पृष्ठ पर एक div है जो दोनों टैप और टैपहोल्ड घटनाओं के लिए सुन रहा है।टैपहोल्ड के बाद निकाल दिया गया टैप ईवेंट jQuery मोबाइल 1.1.1

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि टैप ईवेंट को मेरी अंगुली उठाने के बाद टैपहोल्ड ईवेंट के बाद निकाल दिया जाता है। मैं इसे कैसे न होने दूँ? एक समाधान here प्रदान किया गया है, लेकिन यह ऐसा करने का एकमात्र तरीका है? किंडा & टैपहोल्ड के लिए दो अलग-अलग आयोजनों के पूरे बिंदु को समाप्त कर देता है यदि आपको दोनों को अलग करने के लिए बूलियन ध्वज का उपयोग करने की आवश्यकता है।

$('#pageOne').live('pageshow', function(event) { 
    $('#divOne').bind('taphold', function (event) { 
     console.log("TAP HOLD!!");  
    }); 

    $('#divOne').bind('tap', function() { 
     console.log("TAPPED!!"); 
    }); 
}); 

बहुत सहायता की सराहना करते हैं:

बाद

मेरी कोड है। धन्यवाद!

उत्तर

2

[की कोशिश की और परीक्षण किया गया] मैं jQuery मोबाइल के कार्यान्वयन की जाँच की। वे 'vmouseup' पर हर बार 'टैपहोल्ड' के बाद 'टैप' ईवेंट को फायर कर रहे हैं।

वर्कअराउंड होगा 'टैप' ईवेंट को आग लगाने के लिए नहीं, अगर 'टैपहोल्ड' को निकाल दिया गया है। एक कस्टम घटना स्रोत बनाएं या संशोधित करने के अनुसार आपको इस प्रकार की जरूरत है:

$.event.special.tap = { 
    tapholdThreshold: 750, 

    setup: function() { 
     var thisObject = this, 
      $this = $(thisObject); 

     $this.bind("vmousedown", function(event) { 

      if (event.which && event.which !== 1) { 
       return false; 
      } 

      var origTarget = event.target, 
       origEvent = event.originalEvent, 
       /****************Modified Here**************************/ 
       tapfired = false, 
       timer; 

      function clearTapTimer() { 
       clearTimeout(timer); 
      } 

      function clearTapHandlers() { 
       clearTapTimer(); 

       $this.unbind("vclick", clickHandler) 
        .unbind("vmouseup", clearTapTimer); 
       $(document).unbind("vmousecancel", clearTapHandlers); 
      } 

      function clickHandler(event) { 
       clearTapHandlers(); 

       // ONLY trigger a 'tap' event if the start target is 
       // the same as the stop target. 
       /****************Modified Here**************************/ 
       //if (origTarget === event.target) { 
       if (origTarget === event.target && !tapfired) { 
        triggerCustomEvent(thisObject, "tap", event); 
       } 
      } 

      $this.bind("vmouseup", clearTapTimer) 
       .bind("vclick", clickHandler); 
      $(document).bind("vmousecancel", clearTapHandlers); 

      timer = setTimeout(function() { 
       tapfired = true;/****************Modified Here**************************/ 
       triggerCustomEvent(thisObject, "taphold", $.Event("taphold", { target: origTarget })); 
      }, $.event.special.tap.tapholdThreshold); 
     }); 
    } 
}; 
+0

मैं इसका उपयोग कैसे करूं? –

+0

@JeremieWeldin ऊपर jquery.mobile.js फ़ाइल में संशोधन को इंगित करता है। –

+0

मुझे वह अंततः मिला। मुझे इस तरह टिप्पणी करने के लिए वापस आना चाहिए था। धन्यवाद! –

0

आप इस समस्या को हल करने के लिए jquery की stopImmediatePropagation() विधि का उपयोग कर सकते हैं। jquery api में स्पष्टीकरण, stopImmediatePropagation() विधि

के अनुसार, "निष्पादित किया जा रहा से संचालकों के बाकी रहता है और डोम पेड़ खलबली मचाने वाले से घटना को रोकता है।"

+1

सुझाव के लिए धन्यवाद, लेकिन यह समस्या ठीक नहीं होती। – ares05

+0

यह 'लाइव' हैंडलर के साथ काम नहीं करता है। वही दस्तावेज इसका उल्लेख करता है! –

0

अपने taphold ईवेंट हैंडलर में रखते ... इस सुझाव को मान लिया गया है ओ एक jQuery उद्देश्य यह है कि taphold

jQuery निकाल (है ओ) .one ('टैप क्लिक', फ़ंक्शन() {वापसी झूठी;});

एक विधि के लिए बाध्यकारी केवल एक बार ईवेंट को आग लग जाएगा। झूठी वापसी से उस घटना के निष्पादन को रोक दिया जाएगा यदि यह < ए> टैग था।

3

बस अपने दस्तावेज़ के शीर्ष पर इस सेट करने या भी कहीं भी इससे पहले कि आप को परिभाषित:

$.event.special.tap.emitTapOnTaphold = false; 

तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:

$('#button').on('tap',function(){ 
    console.log('tap!'); 
}).on('taphold',function(){ 
    console.log('taphold!'); 
}); 
0

कड़ी चोट के बाद से, taphold तो मैं चलाता है तो मैं इंतजार जब तक स्पष्ट स्थगित था

$(c).bind("taphold",function(e){ 
     if(e.target.wait){ 
      e.target.wait = false; 
     }else{ 
      alert("fire the taphold"); 
     }//eo if not waiting 
    }); 
    $(c).bind("swipe",function(e){ 
      e.target.wait = true;//taphold will come next if I don't wave it off 
     alert(e.target.text+"("+e.target.attributes.dataId.value+") got swiped"); 
     return false; 
    }); 

भी नल का समर्थन करने के लिए: यह सरल रखने के लिए साथ में सक्षम था घटना टैप करें जो हमेशा भी आग लगती है।

-1

$ = .event.special.tap { tapholdThreshold: 750,

setup: function() { 
    var thisObject = this, 
     $this = $(thisObject); 

    $this.bind("vmousedown", function(event) { 

     if (event.which && event.which !== 1) { 
      return false; 
     } 

     var origTarget = event.target, 
      origEvent = event.originalEvent, 
      /****************Modified Here**************************/ 
      tapfired = false, 
      timer; 

     function clearTapTimer() { 
      clearTimeout(timer); 
     } 

     function clearTapHandlers() { 
      clearTapTimer(); 

      $this.unbind("vclick", clickHandler) 
       .unbind("vmouseup", clearTapTimer); 
      $(document).unbind("vmousecancel", clearTapHandlers); 
     } 

     function clickHandler(event) { 
      clearTapHandlers(); 

      // ONLY trigger a 'tap' event if the start target is 
      // the same as the stop target. 
      /****************Modified Here**************************/ 
      //if (origTarget === event.target) { 
      if (origTarget === event.target && !tapfired) { 
       triggerCustomEvent(thisObject, "tap", event); 
      } 
     } 

     $this.bind("vmouseup", clearTapTimer) 
      .bind("vclick", clickHandler); 
     $(document).bind("vmousecancel", clearTapHandlers); 

     timer = setTimeout(function() { 
      tapfired = true;/****************Modified Here**************************/ 
      triggerCustomEvent(thisObject, "taphold", $.Event("taphold", { target: origTarget })); 
     }, $.event.special.tap.tapholdThreshold); 
    }); 
} 

};

@ आकाश बुद्धिया: आपके समाधान के लिए धन्यवाद। यह बढ़िया है, लगता है कि यह मेरे लिए काम करता है!

0

मुझे अभी भी समस्याएं हैं, jquery-mobile के टैपहोल्ड के साथ, मैंने टैपहोल्ड के बाद बुलाए गए क्लिक की समस्या हल की, तत्व पर टाइमआउट डाला। जेक्यूएम 1.4 emitTapOnTaphold = false के साथ;

उदाहरण:

$(".element").on("taphold", function() { 
        // function her 

         setTimeout (function() { 
             $(this).blur(); 
         400); 
});