2010-01-06 4 views
8

J'ai deux divs, un grand et un plus petit sur l'autre, chaque div a sa propre méthode OnClick. Le problème que j'ai est quand j'ai cliqué sur le div plus petit, la méthode OnClick de la grande div est appelée aussi.Deux différents OnClick sur deux divs, l'un sur l'autre

Qui puis-je éviter?

+0

Je suppose que les éléments sont imbriqués. – SLaks

+0

Pouvez-vous poster une démo? Vous pouvez utiliser http://jsbin.com. – SLaks

Répondre

6

La meilleure façon de détecter quel élément a été cliqué est d'analyser la cible de l'événement (cliquez sur l'événement). J'ai préparé un petit exemple pour ce cas. Vous pouvez le voir dans le code ci-dessous.

 
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'); 
    } 
} 

Cette méthode javascript peut être appelé avant d'exécuter votre script

Exemple

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

J'espère que cela aide.

+0

Aide beaucoup, je vais essayer, merci! – Santiago

+0

Cela fonctionne enfin en mélangeant les réponses: event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); fenêtre.l'événement ne fonctionne pas sur Firefox, ne sais pas pourquoi – Santiago

+0

'window.event' est une propriété IE non standard. – SLaks

5

Votre problème est que l'événement click se propagera dans l'arborescence des éléments. Par conséquent, chaque élément contenant un élément sur lequel vous avez cliqué déclenche également un événement click.

La solution la plus simple consiste à ajouter return false à votre gestionnaire.

Si vous utilisez jQuery, vous pouvez appeler e.stopPropagation(); sinon, vous aurez besoin d'appeler e.stopPropagation() si elle existe, et définissez event.cancelBubble = true.

Pour plus d'informations, voir here.

+0

Merci, c'est ce que je pensais mais c'est simple ne fonctionne pas. – Santiago

+0

Merci pour cela cela fonctionne, mais il y a une faute de frappe mineur. Vous avez écrit 'e.StopPropagation();' mais cela devrait être 'e.stopPropagation();' –

+1

@SizzlePants: Merci; fixé. – SLaks

0

Si vous décidez d'utiliser une bibliothèque javascript telle que www.jquery.com, vous pouvez facilement accomplir ce que vous essayez de faire en utilisant les options de prévention de propagation.

+0

Vous n'avez pas besoin d'utiliser jQuery ou quoi que ce soit d'autre, cela se fait facilement avec javascript. –

3

Ce que vous avez affaire est le bouillonnement d'événements. Jetez un oeil à cet article: http://www.quirksmode.org/js/events_order.html.

Fondamentalement, pour arrêter l'événement de passer à l'élément parent, vous pouvez utiliser quelque chose comme ceci:

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

La première ligne de cette fonction pourrait être raccourcie à 'e = e || window.event; ' – gnarf

+0

Cela fonctionne sur Chrome mais Firefox a déclaré" window.event is undefined " – Santiago

2

Vous êtes en cours d'exécution dans un cas commun de propagation des événements. Consultez quirksmode.org pour obtenir tous les détails sur ce qui se passe exactement. Au fond, ce que vous devez faire dans le gestionnaire de clic de plus petite div est la suivante:

if (!e) var e = window.event; 
e.cancelBubble = true; 
if (e.stopPropagation) e.stopPropagation(); 
Questions connexes