Odpowiedzi:
Użyj event.stopPropagation () .
<span onclick="event.stopPropagation(); alert('you clicked inside the header');">something inside the header</span>
Dla IE: window.event.cancelBubble = true
<span onclick="window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>
event
Wydaje się, że jest dostępny również podczas wydarzeń wbudowanych w IOS Safari.
Istnieją dwa sposoby uzyskania obiektu zdarzenia z wnętrza funkcji:
Jeśli potrzebujesz obsługi starszych przeglądarek, które nie postępują zgodnie z zaleceniami W3C, zazwyczaj wewnątrz funkcji możesz użyć czegoś takiego:
function(e) {
var event = e || window.event;
[...];
}
które sprawdzą najpierw jedną, a potem drugą i zapiszą dowolną znalezioną w zmiennej zdarzenia. Jednak w wbudowanym module obsługi zdarzeń nie ma e
obiektu do użycia. W takim przypadku musisz skorzystać z arguments
kolekcji, która jest zawsze dostępna i odnosi się do pełnego zestawu argumentów przekazanych do funkcji:
onclick="var event = arguments[0] || window.event; [...]"
Jednak ogólnie rzecz biorąc, powinieneś unikać wbudowanych procedur obsługi zdarzeń, jeśli potrzebujesz skomplikowanych czynności, takich jak zatrzymanie propagacji. Osobne pisanie programów obsługi zdarzeń i dołączanie ich do elementów jest znacznie lepszym pomysłem w perspektywie średnio- i długoterminowej, zarówno pod względem czytelności, jak i łatwości konserwacji.
onclick="foo(event)"
a następnie w funkcji function foo(event){/* do stuff with event */}
. Działa to zarówno w modelach zdarzeń IE, jak i W3C.
Należy pamiętać, że window.event nie jest obsługiwany w FireFox, a zatem musi być coś w stylu:
e.cancelBubble = true
Lub możesz użyć standardu W3C dla FireFox:
e.stopPropagation();
Jeśli chcesz się podoba, możesz to zrobić:
function myEventHandler(e)
{
if (!e)
e = window.event;
//IE9 & Other Browsers
if (e.stopPropagation) {
e.stopPropagation();
}
//IE8 and Lower
else {
e.cancelBubble = true;
}
}
<div onclick="myEventHandler(event);">
e.cancelBubble
zwraca false w IE! Nie może dojść do e.cancelBubble = true;
instrukcji. Zamiast tego użyj warunku SoftwareARM !!
Użyj tej funkcji, aby sprawdzić, czy istnieje poprawna metoda.
function disabledEventPropagation(event)
{
if (event.stopPropagation){
event.stopPropagation();
}
else if(window.event){
window.event.cancelBubble=true;
}
}
Miałem ten sam problem - pole błędu js w IE - działa tak dobrze we wszystkich przeglądarkach, o ile widzę (event.cancelBubble = true wykonuje pracę w IE)
onClick="if(event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;"
To zadziałało dla mnie
<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>
W przypadku stron internetowych ASP.NET (nie MVC) można użyć Sys.UI.DomEvent
obiektu jako opakowania zdarzenia natywnego.
<div onclick="event.stopPropagation();" ...
lub przekazać zdarzenie jako parametr do funkcji wewnętrznej:
<div onclick="someFunction(event);" ...
oraz w niektórych funkcjach:
function someFunction(event){
event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
// other onclick logic
}
Nie mogę komentować z powodu Karmy, więc piszę to jako całą odpowiedź: Zgodnie z odpowiedzią Garetha (var e = argumenty [0] || window.event; [...]) Użyłem tego onelinera w wierszu po kliknięciu szybki hack:
<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>
Wiem, że jest późno, ale chciałem poinformować, że działa to w jednej linii. Nawiasy klamrowe zwracają zdarzenie, które ma w obu przypadkach funkcję stopPropagation, więc próbowałem zamknąć je w nawiasy klamrowe, jak w przypadku if i .... to działa. :)
Działa to również - w linku HTML użyj onclick ze zwrotem w następujący sposób:
<a href="mypage.html" onclick="return confirmClick();">Delete</a>
A potem funkcja comfirmClick () powinna wyglądać następująco:
function confirmClick() {
if(confirm("Do you really want to delete this task?")) {
return true;
} else {
return false;
}
};
confirm
nie jest istotne. Mam na myśli wartość zwracaną . cytat: W linku HTML użyj onclick z takim zwrotem
Dlaczego nie sprawdzić, który element został kliknięty? Jeśli klikniesz na coś, window.event.target
zostanie przypisany do elementu, który został kliknięty, a kliknięty element można również przekazać jako argument.
Jeśli cel i element nie są sobie równe, rozprzestrzeniło się zdarzenie.
function myfunc(el){
if (window.event.target === el){
// perform action
}
}
<div onclick="myfunc(this)" />
Najlepszym rozwiązaniem byłoby obsłużyć zdarzenie za pomocą funkcji javascript, ale w celu użycia prostego i szybkiego rozwiązania wykorzystującego bezpośrednio element html, a gdy „event” i „window.event” są przestarzałe i nie są powszechnie obsługiwane ( https://developer.mozilla.org/en-US/docs/Web/API/Window/event ), sugeruję następujący „twardy kod”:
<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>