2010-01-06 15 views
8

Ich habe zwei divs, eine große und eine kleinere über die andere, jedes div hat seine eigene OnClick-Methode. Das Problem, das ich habe, ist, wenn ich das kleinere div klickte, die OnClick Methode des großen Divs wird auch genannt.Zwei differents OnClick auf zwei divs, eine über der anderen

Wer kann ich das vermeiden?

+0

Ich nehme an, dass die Elemente verschachtelt sind. – SLaks

+0

Können Sie eine Demo veröffentlichen? Sie können http://jsbin.com verwenden. – SLaks

Antwort

6

Der beste Weg, zu erkennen, welches Element geklickt wurde, ist Ziel der Veranstaltung zu analysieren (Ereignis klicken). Ich habe ein kleines Beispiel für diesen Fall vorbereitet. Sie können es im Code unten sehen.

 
function amIclicked(e, element) 
{ 
    e = e || event; 
    var target = e.target || e.srcElement; 
    if(target.id==element.id) 
     return true; 
    else 
     return false; 
} 
function oneClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('One is clicked'); 
    } 
} 
function twoClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('Two is clicked'); 
    } 
} 

Diese Javascript-Methode können, bevor Sie Ihr Skript

Beispiel

 
<style> 
#one 
{ 
    width: 200px; 
    height: 300px; 
    background-color: red; 
} 
#two 
{ 
    width: 50px; 
    height: 70px; 
    background-color: yellow; 
    margin-left: 10; 
    margin-top: 20; 
} 

</style> 



<div id="one" onclick="oneClick(event, this);"> 
    one 
    <div id="two" onclick="twoClick(event, this);"> 
     two 
    </div> 
</div> 

Ich hoffe, das hilft ausführen aufgerufen werden.

+0

Hilft viel, ich werde versuchen, danke! – Santiago

+0

Es funktioniert schließlich Mischen Antworten: event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); Fenster.Event funktioniert nicht bei Firefox, weiß nicht warum – Santiago

+0

'window.event' ist eine nicht-Standard-IE-Eigenschaft. – SLaks

5

Ihr Problem ist, dass das click-Ereignis die Elementbaumstruktur weitergibt. Daher wird jedes Element, das ein Element enthält, auf das geklickt wurde, auch ein click-Ereignis auslösen.

Die einfachste Lösung ist return false Ihr Handler hinzuzufügen.

Wenn Sie jQuery verwenden, Sie e.stopPropagation(); anders nennen können, müssen Sie e.stopPropagation() nennen, wenn es vorhanden ist, und legen Sie event.cancelBubble = true.

Weitere Informationen finden Sie unter here.

+0

Danke, das habe ich mir gedacht aber es geht einfach nicht. – Santiago

+0

Vielen Dank dafür funktioniert es, aber es gibt einen kleinen Tippfehler. Sie haben 'e.StopPropagation();' geschrieben, aber es sollte 'e.stopPropagation();' sein –

+1

@SizzlePants: Thanks; Fest. – SLaks

0

Wenn Sie sich für die Verwendung einer JavaScript-Bibliothek wie www.jquery.com entscheiden, können Sie mithilfe der Optionen für die Vermeidungsvermeidung leicht erreichen, was Sie zu tun versuchen.

+0

Sie müssen nicht jQuery oder etwas anderes verwenden, es ist einfach mit einfachem Javascript. –

3

Mit was Sie zu tun haben ist Ereignis sprudeln. Werfen Sie einen Blick auf diesen Artikel: http://www.quirksmode.org/js/events_order.html.

Grundsätzlich um das Ereignis zu verhindern, auf das übergeordnete Element passiert, können Sie so etwas wie folgt verwenden:

document.getElementById('foo').onClick = function(e) { 

    // Do your stuff 

    // A cross browser compatible way to stop propagation of the event: 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 
+1

Die erste Zeile dieser Funktion könnte auf 'e = e || verkürzt werden window.event; ' – gnarf

+0

Es funktioniert auf Chrome aber Firefox sagte" window.event ist undefined " – Santiago

2

Sie sind in eine gemeinsame Fall von Ereignispropagierung läuft. Check out quirksmode.org, um die vollständigen Details zu erhalten, was genau passiert. Im Grunde, was müssen Sie in den kleineren divs Click-Handler tun, ist dies:

if (!e) var e = window.event; 
e.cancelBubble = true; 
if (e.stopPropagation) e.stopPropagation(); 
Verwandte Themen