2013-07-17 4 views
13

मैं (नहीं कर सकते उसकी js/HTML संशोधित ग्राहक पेज,) एक अतिरिक्त क्लिक हैंडलर बनाना चाहते है और यह मेरी स्क्रिप्ट में इस तरह काम करना चाहिए:stopPropagation और startPropagation

1) event.stopPropagation (थामने ग्राहक क्लिक प्रचार)
2) मेरी समारोह (मेरी समारोह, जब सब कुछ किया जाता है आगे क्या करना)
3) event.startPropagation (मानक ग्राहक कार्रवाई जारी रखने के लिए)

अभी, पहले और दूसरे काम करते हैं। तीसरा समस्या है।
मुझे पता है event.startPropagation मौजूद नहीं है, लेकिन मुझे ऐसा कुछ चाहिए। कोई संकेत?

उत्तर

4

पहले स्थान पर प्रचार को रोकें मत।

परीक्षण my function करता है जो आप करना चाहते हैं, और फिर यह तय करें कि आप प्रचार को रोकने के लिए जा रहे हैं या नहीं।

+1

जब मैं लंगर के लिए क्लिक करें, मेरे समारोह (DB करने के लिए मिलता है) नहीं निष्पादित करने का समय। मुझे लगता है कि इसे रोकने के लिए जरूरी है –

+0

पर प्रजनन को रोकने के लिए आपको संभावित उपयोगकर्ता अनुभव को नुकसान पहुंचाना चाहिए: उपयोगकर्ता कुछ पर क्लिक करता है और डेटाबेस कॉल पूरा होने तक कुछ भी नहीं होता है। सबसे बुरा मामला, यह उत्तरदायी दिखने का लंबा समय हो सकता है। – ehdv

+0

यह एक बुरा जवाब है क्योंकि प्रचार को रोकना अक्सर आवश्यक होता है जब आपके पास एक ही तत्व पर कई घटनाएं बुलबुले होती हैं। यह विधि पूरी तरह से मौजूद है। – kjdion84

0

क्लिक हैंडलर जोड़ें और हटाएं यदि आप क्रमशः क्लिक ईवेंट को सक्षम/अक्षम करना चाहते हैं। क्योंकि event.stopPropagation() घटनाओं को डोम पेड़ को फैलाने से रोक देगा।

अद्यतन:

आप jQuery का उपयोग कर रहे हैं, तो .trigger() समारोह का उपयोग करें।

http://api.jquery.com/trigger/

9

आप माता-पिता नोड, f.ex (jQuery) पर फिर से ट्रिगर कर सकते हैं एक ही घटना वस्तु। आपको बुलबुले में एक ही घटना गुण कब्जा करने के लिए (f.ex e.pageX) में पहली घटना वस्तु कॉपी और ट्रिगर में इसे पारित करने की आवश्यकता होगी:

var copy = $.extend(true, {}, e); 
setTimeout(function() { 
    $(copy.target.parentNode).trigger(copy); 
},500); 
e.stopPropagation(); 

डेमो: http://jsfiddle.net/GKkth/

संपादित

अपनी टिप्पणी के आधार पर, मुझे लगता है कि आप की तरह कुछ के लिए देख रहे हैं:

$.fn.bindFirst = function(type, handler) { 
    return this.each(function() { 
     var elm = this; 
     var evs = $._data(this).events; 
     if (type in evs) { 
      var handlers = evs[type].map(function(ev) { 
       return ev.handler; 
      }); 
      $(elm).unbind(type).on(type, function(e) { 
       handler.call(elm, e, function() { 
        handlers.forEach(function(fn) { 
         fn.call(elm); 
        }); 
       }); 
      }); 
     } 
    }); 
}; 

यह प्रोटोटाइप आपको "प्रीमियम हैंडलर" को बांधने की अनुमति देता है जिसमें next फ़ंक्शन होता है जो सभी पिछले हैंडलर को उसी तत्व पर निष्पादित करेगा जब आप चाहें। है जैसे कि यह प्रयोग करें:

$('button').click(function() { 
    console.log('first'); 
}).click(function() { 
    console.log('second'); 
}).bindFirst('click', function(e, next) { 
    console.log('do something first'); 
    setTimeout(next, 1000); // holds the other handlers for 1sec 
}); 

डेमो: http://jsfiddle.net/BGuU3/1/

+0

ठीक है, मैंने इसे बिना किसी अच्छे परिणाम के कई तरीकों से करने की कोशिश की। शायद मैं कुछ गलत करता हूँ। उदाहरण के लिए: // क्लाइंट साइड, अपने स्वयं के क्लिक हैंडलर $ ('p')।क्लिक करें (फ़ंक्शन (ई) { दस्तावेज़। स्थान = 'http://www.onet.pl'; }); । // मेरी स्क्रिप्ट $ ('पी') पर क्लिक करें (समारोह (ई) { e.stopPropagation(); e.preventDefault(); $ .Get ( ...., ... ।, फ़ंक्शन() { // यदि ठीक है, तो स्टार्टप्रॉपैगेशन } ) }) जैसे कुछ करें; –

+2

@ PiotrWójcik लगता है जैसे आप 'स्टॉपइमीडिएटप्रॉपेशन()' की तलाश में हैं क्योंकि हैंडलर एक ही तत्व से जुड़ा हुआ है: http://api.jquery.com/event.stopImmediatePropagation/। बस याद रखें कि इससे पहले हैंडलर को निष्पादित होने से रोक दिया नहीं जाएगा। या हो सकता है कि आपको केवल उन हैंडलर को ढूंढने की ज़रूरत है जो पहले से ही बाध्य हैं, उन्हें बचाएं और बाद में अपने ट्रिगर में निष्पादित करें। – David

+2

@ PiotrWójcik मैंने अपने उत्तर को एक संभावित समाधान के साथ संपादित किया, क्या आपको इसकी आवश्यकता है? – David

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