2010-09-13 4 views
8

J'ai essayé de faire cela, mais il ne semble pas fonctionner:Comment ajouter un événement onclick aux balises html sans identifiant utilisant javascript?

window.onload = initAll; 


    function initAll(){ 
    document.getElementsByTagName('a').onclick = clickHandler; 
    } 

    function clickHandler(){ 
     if(this.toString().indexOf("localhost") < 0) { 
      confirmation = confirm("You are now leaving http://soso.com. Please click 'ok' to continue to this site, or 'cancel' to stay in http://soso.com"); 
       if (confirmation == false){ 
        return false; 
       } 

     } 

    } 

Je sais que je peux getElementByID et qui fonctionne, mais cela ne fonctionne pas de cette façon. Toute aide serait appréciée.

Merci!

+2

Est-ce que 'document.getElementsByTagName' renvoie un tableau? Vous devrez peut-être parcourir ce tableau retourné et affecter le gestionnaire? – danjah

+1

JQuery a été conçu spécifiquement pour ce genre de travail. Pouvez-vous utiliser Jquery? – StriplingWarrior

+0

Je considérais jquery pour insérer le gestionnaire onclick s'il n'y avait pas une solution plus simple, oui. – Graham

Répondre

1

Vous devez itérer sur tous les éléments retournés par document.getElementsByTagName

var links = document.getElementsByTagName('a'); 
var i = links.length; 
while (i--) { 
    links[i].onclick = clickHandler; 
} 
// ... rest of your code ... 
+0

votre condition est erronée. devrait être 'i> 0'. vous pouvez aussi combiner votre décrémentation et votre condition pour obtenir 'while (i--)'. – lincolnk

+0

Qu'en est-il de 'while (i--) {links [i] .onclick = clickHandler; } '? – palswim

+0

@lincolnk @palswim - les bons points ... mis à jour pour être légèrement plus sensible (et travailler ... vous savez, pendant que nous réparons les choses) :-) Merci! –

3
function initAll() 
{ 
    var elements = document.getElementsByTagName('a'); // returns an array 

    // add the handler to each element 
    var n; 
    for (n = 0; n < elements.length; ++n) 
     elements[n].onclick = clickHandler; 
} 
+3

Remplacer par 'int' avec' var', ce n'est pas valide Javascript. –

+3

int n; : O: O. Il n'y a pas d'int en JavaScript. – Rajat

+3

En outre, vous pourriez vouloir calculer cette propriété de longueur une fois. Cela peut causer de sérieux problèmes dans ce cas, car getElementsByTagName renvoie une liste d'éléments en temps réel. – Rajat

1

C'est parce que getElementsByTagName retourne un NodeList. Vous ne pouvez pas affecter un gestionnaire d'événements via la propriété onclick sur un NodeList, un seul DOMElement.

Essayez:

var elems = document.getElementsByTagName('a'); 
for (var i = 0; i < elems.length; i++) { 
    elems[i].onclick = clickHandler; 
} 
0

Je suggère fortement l'utilisation JQuery. Quelque chose comme ça devrait faire l'affaire:

$(function(){$('a').click(clickHandler);}); 
+2

Alors que jQuery * fait * faciliter le travail avec le DOM, y compris 24 Ko de code (minifié et gzippé) sur la page lorsque 125 ** caractères ** le tour est plutôt exagéré. ;-) –

+1

http://lifeinafolder.posterous.com/jquery-nuff-said – Rajat

+0

@Sean: 125 caractères Unicode prendront 4 Ko de code. Y compris tout ce code en ligne sur votre document (ce qui est probablement ce qu'il fait) ajoute rapidement 24 Ko sur un certain nombre de demandes de pages. Si vous utilisez la copie hébergée de Google, vous pouvez tirer parti de leurs serveurs rapides et distribués pour servir JQuery rapidement, avec une forte probabilité que l'utilisateur l'ait déjà mis en cache de toute façon. Cela signifie également que vous pouvez utiliser JQuery n'importe où ailleurs dans votre application pour créer un code concis, compatible avec plusieurs navigateurs.Sauf si c'est le seul endroit où il va utiliser javascript, je dirais que c'est une évidence. – StriplingWarrior

7

document.getElementsByTagName ('a') retourne un NodeList des DOM éléments. Donc, pour commencer, vous devrez itérer sur eux et attacher un gestionnaire à chaque comme ceci:

var links = document.getElementsByTagName('a'); 
for(var i=0,il = links.length; i< il; i ++){ 
links[i].onclick = clickHandler; 
} 

S'il y a beaucoup d'éléments, je vous suggère de lire à propos de event delegation et d'assigner un seul gestionnaire pour tout.

+5

+1 pour suggérer une délégation d'événement! –

+0

Vous avez oublié un point-virgule après la condition. –

+0

@Daniel Merci. Corrigée! – Rajat

Questions connexes