Satır içi onclick özniteliğiyle olay yayılımı nasıl durdurulur?


313

Aşağıdakileri göz önünde bulundur:

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

Kullanıcı açıklığı tıkladığında, div'tıklama olayını tetiklemeyecek şekilde nasıl yapabilirim ?

Yanıtlar:


272

Event.stopPropagation () öğesini kullanın .

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

IE için: window.event.cancelBubble = true

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

11
FireFox'ta olay nesnesi diye bir şey yoktur.
Robert C. Barth

6
Olay nesnesi geri aramanın bir parametresidir. Aslında, IE'de olay nesnesi diye bir şey yoktur, çünkü bu nesneye işlevin parametresi olmak yerine window.event aracılığıyla erişilebilir :-)
Vincent Robert

66
Bu sadece yanlıştır - satır içi onclick işleyicileri olayın bağımsız değişken olarak iletilmesini sağlamaz. Doğru çözüm aşağıda Gareths.
Benubird

2
Firefox'ta satır içi komut dosyasında değişken bir olaya erişebilirsiniz, ancak window.event kullanılamaz. <div onclick = "alert (event);"> </div>
Morgan Cheng

1
eventIOS Safari'deki satır içi etkinliklerde de mevcut gibi görünüyor.
Yuval A.

210

Olay nesnesini bir işlevin içinden almanın iki yolu vardır:

  1. W3C uyumlu bir tarayıcıda ilk argüman (Chrome, Firefox, Safari, IE9 +)
  2. Internet Explorer'da window.event nesnesi (<= 8)

W3C önerilerine uymayan eski tarayıcıları desteklemeniz gerekiyorsa, genellikle bir işlev içinde aşağıdakine benzer bir şey kullanırsınız:

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

hangisi önce diğerini, diğerini ve olay değişkeni içinde hangisini depoladığını kontrol eder. Ancak bir satır içi olay işleyicisindee kullanılacak nesne yoktur. Bu durumda arguments, her zaman kullanılabilir olan ve bir işleve iletilen tüm bağımsız değişkenler kümesine gönderme yapan koleksiyondan yararlanmanız gerekir :

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

Ancak, genel olarak konuşmak gerekirse, yayılımı durdurmak gibi karmaşık bir şeye ihtiyacınız varsa, satır içi olay işleyicilerinden kaçınmalısınız. Etkinlik işleyicilerinizi ayrı ayrı yazmak ve öğelere bağlamak, hem okunabilirlik hem de sürdürülebilirlik için orta ve uzun vadede çok daha iyi bir fikirdir.


11
Satır içi bir dinleyiciden, olay nesnesini: gibi onclick="foo(event)", sonra işlevde iletebilirsiniz function foo(event){/* do stuff with event */}. Bu hem IE hem de W3C olay modellerinde çalışır.
RobG

5
Bu "daha az veya sekize eşit" biraz ... belirsiz.
TechNyquist

8
bu aslında soruya cevap vermiyor.
jcomeau_ictx

1
farklı bir soruya düzgün cevap. : - /
Arel

80

Window.event uygulamasının FireFox'ta desteklenmediğini ve bu nedenle aşağıdaki satırlarda bir şey olması gerektiğini unutmayın:

e.cancelBubble = true

Veya FireFox için W3C standardını kullanabilirsiniz:

e.stopPropagation();

Süslü olmak istiyorsanız, bunu yapabilirsiniz:

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

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

12
Ve çalışmasını sağlamak için, böyle şöyle adlandırılması gerekir:<div onclick="myEventHandler(event);">
DarkDust

1
"Event || window.event" olabilir.
Sivri

1
(e.cancelBubble) bana doğru görünmüyorsa, zaten doğruysa doğru olarak ayarlarsınız
Guillaume86

e.cancelBubbleIE'de false döndürür! e.cancelBubble = true;Talimatlara ulaşamıyor . Bunun yerine SoftwareARM'nin durumunu kullanın !!
Mauretto

45

Bu işlevi kullanın, doğru yöntemin varlığını test edecektir.

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

20

Ben aynı sorunu vardı - IE hata kutusu - bu görebildiğim kadarıyla tüm tarayıcılarda iyi çalışıyor (event.cancelBubble = true IE iş yapar)

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

1
@MSC tam olarak ne ihtiyacım teşekkürler!
DannyC

1
Satır içi komut dosyası. Bu soruya cevap
Cesar

10

Bu benim için çalıştı

<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>

Bu tam kod pasajının sizin için çalıştığından emin misiniz? Dış div'in onclick işleyicisinde bir dize alıntı sorunu var gibi görünüyor ...?!
Nicole

7

ASP.NET web sayfaları için (MVC değil), Sys.UI.DomEventnesneyi yerel olayın sarmalayıcısı olarak kullanabilirsiniz .

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

veya olayı iç fonksiyona parametre olarak iletir:

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

ve someFunction'da:

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


2

Karma nedeniyle yorum yapamam, bu yüzden bütün cevap olarak yazıyorum: Gareth'in cevabına göre (var e = arguments [0] || window.event; [...]) Bu oneliner'ı onclick üzerinde bir satır için kullandım hızlı kesmek:

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

Geç olduğunu biliyorum ama bunun bir satırda çalıştığını size bildirmek istedim. Parantez, her iki durumda da stopPropagation işlevine sahip bir olay döndürür, bu yüzden onları bir if gibi parantez içine almaya çalıştım ve .... çalışır. :)


1

Bu da işe yarıyor - Bağlantı HTML'de onclick'i şu şekilde döndürerek kullanın:

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

Ve sonra comfirmClick () işlevi şöyle olmalıdır:

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

2
Sorunun anlamı bu değildi.
jzonthemtn

@jbird Sorunun anlamı tam olarak buydu. Bir olayı dom ağacından köpürmekten iptal etmenin farklı (eski) bir yoludur (dom api düzey 1 spesifikasyonlarındadır).
gion_13

@ gion_13 Ancak tıklamanın işlemi kullanıcının onaylaması gereken bir şey değil. Soruda, ebeveynin onclick'inin () değil sadece çocuğun onclick'inin () ateşlenmesini istiyoruz. Bunlar arasında bir kullanıcı istemi koymak yardımcı olmaz. Umarım bu farkı görebilirsiniz.
jzonthemtn

1
confirmAlakalı değildir. Dönüş değerinden bahsediyorum . alıntı: Link HTML kullanımı onclick böyle dönüş ile
gion_13

bağlantıyı yanlış döndüren iptal, benim krom yayılımını iptal
etmez

1

Neden sadece hangi öğenin tıklandığını kontrol etmiyorsunuz? Bir şeyi tıklatırsanız window.event.target, tıklanan öğeye atanır ve tıklanan öğe bağımsız değişken olarak da geçirilebilir.

Hedef ve öğe eşit değilse, bu yayılan bir olaydı.

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

Teşekkürler dostum, buradaki en temiz çözüm gibi görünüyor. Yan notta, bunun yalnızca tıklanan öğe gerçek en üstteki öğe olduğunda eşleştiğini dikkate almanız gerekir.
Simon Mattes

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

En iyi çözüm, bir javascript işlevi aracılığıyla olayla başa çıkmaktır, ancak doğrudan html öğesini kullanarak basit ve hızlı bir çözüm kullanmak için ve "olay" ve "window.event" kullanımdan kaldırılmış ve evrensel olarak desteklenmez ( https://developer.mozilla.org/en-US/docs/Web/API/Window/event ), aşağıdaki "sabit kodu" öneririm:

<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.