Bonsoir, j'ai un code un peut comme ceci:
document.body.addEvenrListener('click', function(e) {
const el = e.target
if (el.classList.contains('app') {
console.log(el)
}
})
/* HTML */
<a href="mon lien" class="app">Lien 1</a>
<a href="mon lien" class="app">
<i class="icon-1"></i>
<img src="image">
Lien 2
<i class="icon-2"></i>
</a>
Pour le lien 1 tous fonctionne bien, mais lorsque le lien contient d'autres éléments HTML (img, i, span etc.) le target me renvoie l'un des éléments HTML enfant.
Moi je veux pourvoir récupérer uniquement le lien parent peut importe le nombre d'enfant qu'il contient. j'aurais bien pu faire des parentNode
mais tous les liens n'ont pas la même structure.
Actuellement je me voir bien faire e.path
et récupérer le lien compris dans le tableau, mais c'est pas obtimale je pense.
Merci de m'aider si vous avez une solution.
Comme ça ;)
<a href="mon lien" class="app lien">Lien 1</a>
<a href="mon lien" class="app lien">
<i class="icon-1"></i>
<img src="image">
Lien 2
<i class="icon-2"></i>
</a>
var liens = [].slice.call(document.getElementsByClassName("lien"));
liens.forEach(function (element, index){
element.addEventListener("click", function(e){
e.preventDefault();
console.log("you clicked slider controler " +index + "!");
});
});
Voir ici
a++
Bonjour, merci déjà pour ta réponse.
En partant du principe que le contenu de cette page est chargé de façon asynchrone, cette méthode vas prendre en compte les liens des nouveaux contenus ?
Salut essaie plutot ceci
const liens = document.querySelectorAll(".lien");
function getLink(e) {
e.preventDefault();
// this fera référence au lien cliqué, apres tu fais ce que tu veux avec
console.log(`the url of link is ${this.getAttribute("href")}`);
}
liens.forEach((el) => el.addEventListener("click", getLink));
Tu sais ou tu fais tes modifs dans ta page ?
tu met ce code dans une fonction et tu la rappelle après avoir ajouté tes liens supplémentaires ;)
@pluche
Pierre
La méthode de @Mickael Christine fonctionne bien, mais maintenant me sousis c'est que les nouveaux liens avev la classe "lien" ne fonctionne pas.
Voilà le code
function getLink(e) {
e.preventDefault();
// this fera référence au lien cliqué, apres tu fais ce que tu veux avec
console.log(`the url of link is ${this.getAttribute("href")}`);
}
fonction callLink () {
const liens = document.querySelectorAll(".lien");
liens.forEach((el) => el.addEventListener("click", getLink));
}
callLink();
En rappelant juste à là fin, ca fait n'importe quoi. Ça ne fonctionne pas tout à faif comme prévu :
function getLink(e) {
e.preventDefault();
console.log(`the url of link is ${this.getAttribute("href")}`);
callLink();
}
fonction callLink () {
const liens = document.querySelectorAll(".lien");
liens.forEach((el) => el.addEventListener("click", getLink));
}
callLink();
tu rappelles la fonction après avoir fais ton appel ajax qui a ajouté ou enlevé des liens ;)
fonction callLink () {
const liens = document.querySelectorAll(".lien");
liens.forEach((el) => el.addEventListener("click", getLink));
}
maFonctionQuifaitAppelAjax(){
appelAjax(param).done(
RafraichitPartielPage();
callLink();
}
a++
Pierre
Merci pour vos messages.
Actuellement voila le code que j'ai ecrit, il a le merite de fonctionner sur tous les navigateurs que j'ai testé mais je le trouve plutot lourd et pas optimisé.
document.body.addEventListener('click', function(e) {
let element = e.target;
while (element) {
if (element.classList.contains('js-app-link')) {
e.preventDefault();
appLink(element);
element = false;
break;
} else if (element.tagName === "BODY") {
element = false;
break;
} else {
element = element.parentNode;
}
}
});