2012-05-03 3 views
10

काम नहीं करता है जब मैं एक लिंक पर event.preventDefault() का उपयोग करता हूं, हालांकि जब मैं इसे बटन पर उपयोग करता हूं तो नहीं!
DEMO
मेरी कोड:preventDefault()

<a id="link" href="http://www.google.com">link</a> 
<button id="button" onclick="alert('an alert')">button</button>​ 

$('#link').click(function(event){ 
    event.preventDefault(); 
}); 
$('#button').click(function(event){ 
    event.preventDefault(); 
}); 

लिंक कार्रवाई रोक दी गई है, लेकिन जब मैं बटन पर क्लिक करें, फिर भी onClick कार्रवाई
किसी भी मदद निष्पादित करता? मुझे क्या करना चाहते हैं बटन एचटीएमएल बदले बिना बटन onClick कार्रवाई को रोकने के लिए (मैं जानता हूँ कि

$('#button').removeAttr('onclick');

+0

इनलाइन HTML विशेषताओं का उपयोग करके ईवेंट न जोड़ें। उचित घटना पंजीकरण का प्रयोग करें। –

+0

मैं कुछ भी नहीं जोड़ रहा हूं, HTML को फ्रेमवर्क, Magento द्वारा जेनरेट किया गया है यदि आप जानना चाहते हैं .. – skafandri

+1

आप removeAttr ('onClick') का उपयोग क्यों नहीं करना चाहते हैं? –

उत्तर

21

कैसे करना है आप event.stopImmediatePropagation(); चाहते हैं, तो एक तत्व पर एक से अधिक ईवेंट हैंडलर्स हैं और आप चाहते हैं दूसरों को निष्पादित करने के लिए रोकें। preventDefault() केवल stopImmediatePropagation() डीओएम पेड़ और और को बुलबुला करने से ईवेंट को रोकता है, उसी क्रिया पर किसी भी अन्य ईवेंट हैंडलर को निष्पादित होने से रोकता है, जबकि डिफ़ॉल्ट कार्रवाई को अवरोधित करता है (जैसे किसी फॉर्म को सबमिट करना या किसी अन्य URL पर नेविगेट करना)।

,

हालांकि

के बाद से यह अभी भी काम नहीं करता है इसका मतलब है कि onclick="" हैंडलर से पहले निष्पादित करता है:

यहाँ विभिन्न तरीकों समझा कुछ उपयोगी लिंक कर रहे हैं संलग्न घटना हैंडलर। जब आपका कोड onclick कोड चलाता है तब से आप कुछ भी नहीं कर सकते हैं। - जाहिरा तौर पर इनलाइन घटनाओं को ट्रिगर से पहले ही घटना डोम उतरते शुरू होता है

$('#button').removeAttr('onclick'); 

भी useCapture=true साथ सादे जावास्क्रिप्ट (addEventListener()) के माध्यम से एक घटना श्रोता जोड़ने में मदद नहीं करता:

सबसे आसान समाधान पूरी तरह से है कि हैंडलर को हटा रहा है पेड़।

तुम सिर्फ हैंडलर दूर करने के लिए है क्योंकि आप इसकी आवश्यकता नहीं है चाहते हैं, बस इसे एक ठीक से जुड़ी घटना में बदलने का:

var onclickFunc = new Function($('#button').attr('onclick')); 
$('#button').click(function(event){ 
    if(confirm('prevent onclick event?')) { 
     event.stopImmediatePropagation(); 
    } 
}).click(onclickFunc).removeAttr('onclick'); 
+0

काम नहीं करता है! http://jsfiddle.net/46sbB/1/ – skafandri

+0

क्या 6 लोग इस जवाब को उखाड़ फेंक सकते हैं मुझे बताओ कि यह क्यों काम नहीं करता ???? – skafandri

+0

मैंने अपना उत्तर – ThiefMaster

2

आप इस कोशिश कर सकते हैं:

$('#button').show(function() { 
    var clickEvent = new Function($(this).attr('click')); // store it for future use 
    this.onclick = undefined; 
}); 

DEMO

4

आपको stopImmediatePropagationpreventDefault की आवश्यकता नहीं है। preventDefault डिफ़ॉल्ट ब्राउज़र व्यवहार को रोकता है, विधि बबलिंग नहीं।

http://api.jquery.com/event.stopImmediatePropagation/

http://api.jquery.com/event.preventDefault/

+0

काम नहीं करता है! http://jsfiddle.net/46sbB/ 1/ – skafandri

2

preventDefault समारोह खोज किए जाने पर ईवेंट हैंडलर्स बंद नहीं करता, बल्कि डिफ़ॉल्ट कार्रवाई जगह ले जा रहा बंद हो जाता है। लिंक के लिए, यह नेविगेशन को रोकता है, बटन के लिए, यह फॉर्म को सबमिट होने से रोकता है, आदि

आप जो देख रहे हैं वह stopImmediatePropagation है।

+0

काम नहीं करता है! Http://jsfiddle.net/46sbB/1/ – skafandri

+0

आह ... आप वास्तव में उसी तत्व पर पंजीकृत अन्य ईवेंट हैंडलर पर कोई नियंत्रण नहीं रखते हैं। आप क्या कर सकते हैं घटना को रोकना बुलबुला। क्षमा करें कि मैंने आपके प्रश्न को गलत समझा। –