2014-09-26 11 views
5

Proszę zobaczyć - http://www.bootply.com/dR7fxjP1bkIgnoruj ​​Parent zdarzenie onClick gdy element podrzędny kliknięciu

Klikając dowolny z div.rows (nazwijmy to rodzica), zdarzenie onClick jest aktywna, w celach demonstracyjnych powiadomienie wyskakuje.

W rzędzie akordeon zwija się, gdy kliknięte jest "info" (pomarańczowy przycisk) (pozwala zadzwonić do tego dziecka), ale problem polega na tym, że rodzice ostrzegają o wyzwalaczach.

Potrzebuję przycisku informacyjnego, aby nie uruchamiać alertu, tylko wtedy, gdy kliknięto nigdzie indziej, pojawi się alert.

Próbowałem różnych sposobów, takich jak przy użyciu (e) stopPropagation .on .off połączeń itp ... Nie jestem najlepszym facetem jquery, więc potrzebujesz trochę pomocy, aby to działało - i także pomóż mi się nauczyć czegoś !

<div class="row ticket-selector" onclick="alert('Hello World!');"> 
    <a data-toggle="collapse" data-parent="#ticket-panel" href="#collapseOne" class="tickets-more"><span class="halflings info-sign orange"></span></a> 
</div> 

Powyższe jist - ale patrz na lepsze zrozumienie - http://www.bootply.com/dR7fxjP1bk

+0

Jest to jeden z powodów, dla których 'onclick =" "' jest przestarzały sposób obsługi zdarzeń ... – Regent

+0

Czy ktoś ma działający przykład tego? –

+0

Zobacz [zaktualizowany kod] (http://www.bootply.com/d4Ab9DUkkh). – Regent

Odpowiedz

3

Chodzi o to, aby usunąć onclick="" obsługi oszczędność swoją wartość w innej dziedzinie, a następnie wykonać (ocena) wartości w zwyczaju click obsługi zdarzeń:

Example code.

$(document).ready(function() 
{ 
    var elements = $(".ticket-selector"); 
    elements.each(function() 
    { 
     var handler = $(this).attr('onclick'); 
     $(this).data('click', handler); 
    }); 
    elements.attr('onclick', ''); 
    elements.click(function(e) 
    { 
     if (!$(e.target).hasClass("info-sign")) 
     { 
      eval($(this).data('click')); 
     } 
    }); 
}); 
0

wziąć klasę informacji z div. Owiń je obiema kolejnymi czystymi elementami div.

0

W pomarańczowym przycisku obsługi kliknij dodać return false; na końcu - zapobiegnie to zdeformowaniu wydarzenia z rodzicem. Podobnie jak to:

jQuery('.tickets-more').click(function(){ 
    // your stuff here 
    return false; 
}); 
+0

'return false' uniemożliwi otwarcie bloku informacji: [przykład] (http://www.bootply.com/R309bFqkyh). – Regent

0

Jeśli nie używasz klas css, możesz sprawdzić klikane atrybuty/klasy elementów. Podobnie jak:

$('.parent-element').on('click',function(e){ 
if ($(this).attr('data-toggle')){//has attribute data-toggle 
e.preventDefault(); 
return false; 
} 
}); 

To będzie zależało od twojego drzewa DOM nieco więcej. Można znaleźć warunek, który będzie wyłączyć dowolne zdarzenie

+0

Nie ma potrzeby w 'e.preventDefault();' jeśli używasz 'return false', ponieważ zawiera on zarówno' .preventDefault() 'i' .stopPropagation() '. '$ (this) .attr ('data-toggle')' może zostać uproszczone do '$ (this) .data ('toggle')'. I jeszcze raz: 'return false' uniemożliwi otwarcie bloków informacyjnych. – Regent

1

sprawdzić demo roboczego HERE

myślę, że należy użyć Event.stopPropagation() jQuery API i można go używać jako

$(document).ready(function(){ 
    $('.tickets-more').click(function(event){ 
     // your stuff here 
     alert("Alert On Click"); 
     event.stopPropagation(); 
    }); 
}); 

event.stopPropagation() zatrzymaj bulgotanie zdarzeń, przed którymi stoisz. Dla dalszej dokumentacji odnoszą FROM HERE

Nadzieja to pomaga ...

+1

'event.stopPropagation()' uniemożliwi otwieranie bloków informacyjnych: [przykład] (http://www.bootply.com/wy4cYkMtYd). – Regent

0

użyć CSS:

pointer-events: none; 

uczyni odpowiednie elementy całkowicie przezroczysty dla zdarzeń myszy.

+0

Tak, ale mógłby chcieć kliknąć te elementy potomne. Musi więc po prostu zatrzymaćPropagację, ponieważ w końcu trzeba włączyć te wskaźniki dla wszystkich dzieci wymagających interakcji. – keepitreal

Powiązane problemy