2009-06-01 13 views
0

Si j'ai le code comme ceci:Puis-je parler d'un hyperlien cliqué en JavaScript?

<script> 
function determine() 
{ 
    // ???? 
} 
</script> 

<a href="blah1" onclick="determine()">blah1</a> 
<a href="blah2" onclick="determine()">blah2</a> 

est-il un moyen de déterminer() pour voir quel lien a été cliqué?

(Oui, je sais, la chose facile et correcte à faire serait de passer "ceci" à déterminer() ... mais dans ce cas, cela ne va pas être facile à cause de problèmes de code hérités.)

EDIT: Je devrais probablement dû le dire au début ... notre site est considéré en utilisant (et ne peut pas utiliser, pour le moment) JQuery ... donc des réponses JQuery (bien que précieux en général pour cette type de question) ne m'aidera pas réellement.

Répondre

1

Si vous ne pouvez pas changer le onclick = « déterminer() » dans votre code HTML, mais vous pouvez changer la fonction de déterminer(), alors je pense que le mieux est de:

Laisser la fonction déterminer() blanc donc ça ne fait rien.

Utilisez javascript (tel que décrit par d'autres réponses) pour ajouter un véritable gestionnaire de clic pour chaque lien, et utiliser l'événement pour déterminer quel lien a été cliqué puis exécutez le code désiré.

4

Vérifiez cette link de quirksmode. Vous pouvez obtenir la cible de l'événement.

function doSomething(e) { 
    var targ; 
    if (!e) var e = window.event; 
    if (e.target) targ = e.target; 
    else if (e.srcElement) targ = e.srcElement; 
    if (targ.nodeType == 3) // defeat Safari bug 
     targ = targ.parentNode; 
} 
+0

les réponses jquery des autres sont mieux que cela, je pense – Geoff

+4

peut-être, pour certains, les réponses JQuery seraient mieux ... mais pour nous, nous ne sommes pas en utilisant JQuery en ce moment (et peut » t l'utilise pour l'instant) ... donc ça ressemble à La meilleure solution jusqu'à présent. – Beska

+2

Mais je pensais que vous avez indiqué que vous ne pouviez pas changer le onclick = "determiner()" dans votre code HTML? Dans ce cas, cet exemple ne résoudra pas le problème - vous pourriez juste changer à onclick = "déterminer (ceci)" et l'appeler un jour. – BarelyFitz

0

vous pouvez ajouter des événements à chaque lien comme si

links = document.getElementsByTagName('a'); 

for (link in links) { 

    link.onclick = function() { 
     alert(this.id); 
     determine(); // or some other important code? 
    } 

} 
+1

Ne pas utiliser pour ... pour parcourir des tableaux ou des objets de type tableau comme des listes de nœuds! De plus, il n'y a pas besoin de 'getElementsByTagName()' - 'document.links' fait aussi le travail – Christoph

2

Vous pouvez avec JavaScript directement vers le haut, mais je préfère utiliser quelque chose comme jQuery:

<a href="blah1">blah1</a> 

<script type="text/javascript"> 
    $('a[href=blah1]').click(function() { 
    var link = $(this); // here's your link. 
    return false; // acts like the link was not clicked. return true to carry out the click. 
    }); 
</script> 

En supposant que vous utilisez la fonctionnalité $().click(), $(this) vous donnera le lien.

0

Une autre solution:

Ajouter un gestionnaire onclick au document. Quand un utilisateur clique sur le lien, l'événement click va "surgir" jusqu'à la fenêtre, et vous aurez accès à l'événement pour déterminer quel lien a été cliqué.

Cela peut être utile si vous voulez que le code s'exécute pour les liens qui ont déjà onclick = "determiner()" - vous pouvez définir la fonction determiner() pour définir une variable. Ensuite, lorsque l'utilisateur clique sur le lien, le déterminer() fonction est exécutée pour définir la variable, et lorsque le gestionnaire de clic de document court pouvez vérifier la variable - alors vous saurez que le lien a onclick = « déterminer() ».

Laissez-moi savoir si je peux faire un peu plus compliqué pour vous ...:-)

0

Si vous ne pouvez pas modifier l'attribut onclick, patcher via JavaScript:

// use a DOMContentLoaded hack or `onload` as fallback 
onload = function() { 
    var links = document.links; 
    for(var i = 0; i < links.length; ++i) { 
     // there might be a better way to check which links to modify 
     // don't know without further details 
     if(/determine\(\)/.test(links[i].onclick)) 
      links[i].onclick = determine; 
    } 
}; 

function determine() { 
    // the link is now available as `this` 
    alert(this.href); 
} 

Peut-être une solution encore meilleure serait de patcher dans un objet global, IE style event pour les normes conformes navigateurs:

if(document.addEventListener) { 
    document.addEventListener('click', function(e) { 
     window.event = e; 
    }, true); 
} 

function determine() { 
    var src = event.target || event.srcElement; 
    alert(src.href); 
} 
Questions connexes