इनलाइन ऑनक्लिक विशेषता के साथ घटना प्रसार को कैसे रोकें?


313

निम्नलिखित को धयान मे रखते हुए:

<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header');">something inside the header</span>
</div>

मैं इसे कैसे बना सकता हूं ताकि जब उपयोगकर्ता स्पेंड पर क्लिक करे, तो यह div's' ईवेंट पर क्लिक न करे ।

जवाबों:


272

Event.stopPropagation () का उपयोग करें ।

<span onclick="event.stopPropagation(); alert('you clicked inside the header');">something inside the header</span>

IE के लिए: window.event.cancelBubble = true

<span onclick="window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>

11
फायरफॉक्स में इवेंट ऑब्जेक्ट जैसी कोई चीज नहीं है।
रॉबर्ट सी। बर्थ

6
ईवेंट ऑब्जेक्ट कॉलबैक का एक पैरामीटर है। वास्तव में, IE में ईवेंट ऑब्जेक्ट के रूप में ऐसी कोई चीज नहीं है क्योंकि यह ऑब्जेक्ट विंडो के माध्यम से सुलभ है। फ़ंक्शन के पैरामीटर होने के बजाय :-):
विंसेंट रॉबर्ट

66
यह सिर्फ गलत है - इनलाइन ऑनक्लिक हैंडलर घटना को तर्क के रूप में पारित नहीं करते हैं। सही समाधान गैरेथ है, नीचे।
बेनुबर्ड

2
फ़ायरफ़ॉक्स में, आप इनलाइन स्क्रिप्ट में एक चर घटना तक पहुंच सकते हैं, लेकिन window.event उपलब्ध नहीं है। <div onclick = "alert (event);"> </ div>
मॉर्गन चेंग

1
eventIOS सफारी में इनलाइन घटनाओं के रूप में अच्छी तरह से उपलब्ध होने लगता है।
युवल ए।

210

फ़ंक्शन के अंदर से इवेंट ऑब्जेक्ट को प्राप्त करने के दो तरीके हैं:

  1. W3C-अनुरूप ब्राउज़र (Chrome, Firefox, Safari, IE9 +) में पहला तर्क
  2. इंटरनेट एक्सप्लोरर में window.event ऑब्जेक्ट (<= 8)

यदि आपको विरासत ब्राउज़रों का समर्थन करने की आवश्यकता है जो W3C सिफारिशों का पालन नहीं करते हैं, तो आमतौर पर किसी फ़ंक्शन के अंदर आप निम्नलिखित जैसे कुछ का उपयोग करेंगे:

function(e) {
  var event = e || window.event;
  [...];
}

जो पहले एक की जांच करेगा, और फिर दूसरे और स्टोर को जो भी घटना चर के अंदर पाया गया था। हालांकि एक इनलाइन घटना हैंडलर में eउपयोग करने के लिए कोई वस्तु नहीं है । उस स्थिति में आपको उस argumentsसंग्रह का लाभ उठाना होगा जो हमेशा उपलब्ध होता है और एक समारोह में दिए गए तर्कों के पूर्ण सेट को संदर्भित करता है:

onclick="var event = arguments[0] || window.event; [...]"

हालांकि, आम तौर पर बोलना आपको इनलाइन इवेंट हैंडलर से बचना चाहिए, अगर आपको प्रचार को रोकने जैसी किसी भी चीज़ की ज़रूरत है। अपने ईवेंट हैंडलर्स को अलग से लिखना और उन्हें तत्वों के साथ जोड़ना मध्यम और दीर्घकालिक दोनों में पठनीयता और स्थिरता के लिए बेहतर विचार है।


11
इनलाइन श्रोता से, आप ईवेंट ऑब्जेक्ट को पास कर सकते हैं जैसे: onclick="foo(event)"तब फ़ंक्शन में function foo(event){/* do stuff with event */}। यह IE और W3C ईवेंट मॉडल दोनों में काम करता है।
23

5
वह "कम या आठ के बराबर" कुछ हद तक ... अस्पष्ट है।
TechNyquist

8
यह वास्तव में सवाल का जवाब नहीं देता है।
jcomeau_ictx

1
एक अलग सवाल का साफ जवाब। : - /
अरेल

80

ध्यान रखें कि Window.event FireFox में समर्थित नहीं है, और इसलिए इसकी तर्ज पर कुछ होना चाहिए:

e.cancelBubble = true

या, आप फायरफोक्स के लिए W3C मानक का उपयोग कर सकते हैं:

e.stopPropagation();

यदि आप फैंसी प्राप्त करना चाहते हैं, तो आप यह कर सकते हैं:

function myEventHandler(e)
{
    if (!e)
      e = window.event;

    //IE9 & Other Browsers
    if (e.stopPropagation) {
      e.stopPropagation();
    }
    //IE8 and Lower
    else {
      e.cancelBubble = true;
    }
}

12
और इसे काम करने के लिए, किसी को इस तरह से कॉल करने की आवश्यकता है:<div onclick="myEventHandler(event);">
DarkDust

1
यह "घटना || window.event" हो सकता है।
पॉइन्टी

1
अगर (e.cancelBubble) मेरे लिए सही नहीं लगता है, तो आप इसे सच कर दें अगर यह पहले से ही सच है
Guillaume86

e.cancelBubbleIE में झूठे रिटर्न! यह e.cancelBubble = true;निर्देश तक नहीं पहुँच सकता । इसके बजाय SoftwareARM की स्थिति का उपयोग करें !!
माउरेटो

45

इस फ़ंक्शन का उपयोग करें, यह सही विधि के अस्तित्व के लिए परीक्षण करेगा।

function disabledEventPropagation(event)
{
   if (event.stopPropagation){
       event.stopPropagation();
   }
   else if(window.event){
      window.event.cancelBubble=true;
   }
}

20

मेरे पास एक ही मुद्दा था - IE में त्रुटि बॉक्स js - यह सभी ब्राउज़रों में ठीक काम करता है जहां तक ​​मैं देख सकता हूं (Event.cancelBubble = true IE में काम करता है)

onClick="if(event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;"

1
धन्यवाद @MSC वास्तव में मुझे क्या चाहिए!
DannyC

1
इनलाइन स्क्रिप्ट। यह प्रश्न का उत्तर देता है
सीज़र

10

इसने मेरे लिए काम किया

<script>
function cancelBubble(e) {
 var evt = e ? e:window.event;
 if (evt.stopPropagation)    evt.stopPropagation();
 if (evt.cancelBubble!=null) evt.cancelBubble = true;
}
</script>

<div onclick="alert('Click!')">
  <div onclick="cancelBubble(event)">Something inside the other div</div>
</div>

क्या आप वाकई सटीक कोड स्निपेट आपके लिए काम कर रहे हैं? क्योंकि ऐसा लगता है कि वहाँ बाहरी div के onclick हैंडलर में एक स्ट्रिंग उद्धरण मुद्दा है ...?!
निकोल

7

ASP.NET वेब पेज (MVC नहीं) के लिए, आप Sys.UI.DomEventऑब्जेक्ट को मूल ईवेंट के आवरण के रूप में उपयोग कर सकते हैं ।

<div onclick="event.stopPropagation();" ...

या, आंतरिक फ़ंक्शन के पैरामीटर के रूप में ईवेंट पास करें:

<div onclick="someFunction(event);" ...

और कुछ में:

function someFunction(event){
    event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
    // other onclick logic
}


2

मैं कर्म के कारण टिप्पणी नहीं कर सकता इसलिए मैं इसे पूरे उत्तर के रूप में लिखता हूं: गैरेथ के उत्तर के अनुसार (var ई = तर्क [0]: window.event; [...]) मैंने इस oneliner इनलाइन onclick के लिए onclick पर उपयोग किया था? तेजी से हैक:

<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>

मुझे पता है कि देर हो चुकी है लेकिन मैं आपको बताना चाहता हूं कि यह एक पंक्ति में काम करता है। ब्रेसिज़ एक ऐसी घटना लौटाता है जिसमें दोनों मामलों में स्टॉपप्रॉपैगनेशन-फंक्शन जुड़ा हुआ है, इसलिए मैंने उन्हें ब्रेसिज़ में एन्कैप करने की कोशिश की जैसे कि एक और .... यह काम करता है। :)


1

यह भी काम करता है - लिंक में HTML इस तरह से रिटर्न के साथ ऑनक्लिक का उपयोग करता है:

<a href="mypage.html" onclick="return confirmClick();">Delete</a>

और फिर comfirmClick () फ़ंक्शन की तरह होना चाहिए:

function confirmClick() {
    if(confirm("Do you really want to delete this task?")) {
        return true;
    } else {
        return false;
    }
};

2
यह वह नहीं है जिसका सवाल था।
jzonthemtn

@jbird यह वही है जो सवाल का मतलब है। यह एक अलग (पुराना) तरीका है, जिसमें किसी घटना को डोम ट्री को बुदबुदाने से रद्द किया जा सकता है (यह डॉम एपी लेवल 1 स्पेक्स में है)।
gion_13

@ gion_13 लेकिन क्लिक की क्रिया कुछ ऐसी नहीं है जिसके लिए उपयोगकर्ता को पुष्टि करनी पड़े। प्रश्न में, हम केवल बच्चे की ऑन्कलिक () आग चाहते हैं न कि माता-पिता की ऑन्कलिक ()। उन के बीच में एक उपयोगकर्ता शीघ्र डाल मददगार नहीं है। मुझे उम्मीद है कि आप इस अंतर को देख सकते हैं।
jzonthemtn

1
confirmप्रासंगिक नहीं है। मैं रिटर्न वैल्यू की बात कर रहा हूं । उद्धरण: लिंक में HTML इस तरह से रिटर्न के साथ
gion_13

लिंक के बाद झूठे कैंसिल लौटाने पर, यह मेरे क्रोम पर प्रचार को रद्द नहीं करता है
commonpike

1

सिर्फ यह क्यों नहीं जांचा गया कि किस तत्व पर क्लिक किया गया? यदि आप किसी चीज़ पर क्लिक करते हैं, window.event.targetतो उस तत्व को असाइन किया जाता है जिसे क्लिक किया गया था, और क्लिक किए गए तत्व को एक तर्क के रूप में भी पारित किया जा सकता है।

यदि लक्ष्य और तत्व समान नहीं हैं, तो यह एक ऐसी घटना थी जो प्रचारित हुई।

function myfunc(el){
  if (window.event.target === el){
      // perform action
  }
}
<div onclick="myfunc(this)" />

धन्यवाद दोस्त, यह यहाँ सबसे साफ समाधान लगता है। एक साइड-नोट पर आपको हालांकि विचार करना होगा, कि यह केवल तभी मेल खाता है जब क्लिक किया गया तत्व सबसे ऊपरी तत्व है।
साइमन मैट्स

0
<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header'); event.stopPropagation()">
    something inside the header
  </span>
</div>

0

सबसे अच्छा समाधान एक जावास्क्रिप्ट फ़ंक्शन के माध्यम से घटना से निपटने के लिए होगा, लेकिन सीधे HTML तत्व का उपयोग करके एक सरल और त्वरित समाधान का उपयोग करने के लिए, और एक बार कि "घटना" और "window.event" पदावनत न हों और सार्वभौमिक रूप से समर्थित न हों। https://developer.mozilla.org/en-US/docs/Web/API/Window/event ), मैं निम्नलिखित "हार्ड कोड" का सुझाव देता हूं:

<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.