2017-08-14 3 views
-1

Je souhaite créer des éléments de liens dynamiques. J'ai créé une fonction qui crée un élément et attache une fonction onclick à elle:Ajout d'éléments dynamiques et définition d'une fonction onclick différente

for (var i = 7; i > 0; i--) { 
     var date = moment().add(-i, 'days') 
     var dateFormatted = date.format('YYYY-MM-DD'); 

     // Magic happens here 
     divDates.appendChild(createLink('<a href="#">' + dateFormatted + '</a>', 
      function() { alert(dateFormatted); })); 
    } 

function createLink(s, onClick) { 
    var a = document.createElement('a'); 
    if (s.indexOf('target="_blank"') >= 0) { 
     a.target = '_blank'; 
    } 

    var href = s.match(/href="([^"]*)/)[1]; 
    var text = s.match(/>([^<]*)/)[1]; 

    a.href = href; 
    a.title = text; 
    a.onclick = onClick; 
    a.appendChild(document.createTextNode(text)); 

    return a; 
} 

Cependant, le alert(dateFormatted) montre le même message, quel que je clique sur lien. Comment puis-je les faire travailler indépendamment?

+0

Note de côté, au lieu de passer d'une chaîne HTML, et d'essayer de chercher pour information, juste passer un objet avec vos informations en tant que propriétés, par exemple '{href: 'http://link.com',target: '_ blank'} 'alors dans la fonction faire comme' a.href = s.href'. Ou utilisez [DOMParser] (https://developer.mozilla.org/en-US/docs/Web/API/DOMParser) pour générer l'élément à partir de la chaîne. –

+0

La solution simple est d'utiliser le code OP et de remplacer la deuxième valeur passée dans l'appel à * createLink * avec '(function (value) {return function() {alert (valeur)}} (dateFormatted))' rompre la fermeture avec * dateFormatted *. – RobG

Répondre

2

Essayez ceci:

for (var i = 7; i > 0; i--) { 
    (function (i) { 
     var date = moment().add(-i, 'days') 
     var dateFormatted = date.format('YYYY-MM-DD'); 

     // Magic happens here 
     divDates.appendChild(createLink('<a href="#">' + dateFormatted + '</a>', 
      function() { alert(dateFormatted); })); 
    })(i); 
} 
+0

merci ça marche mais je ne comprends pas la subtilité ... pouvez-vous expliquer un peu s'il vous plaît? :) – ibiza

+0

Patrick Evans vous a déjà répondu où trouver des informations –

+0

Ce n'est pas une bonne solution, le problème est * dateFormatted *, pas * i *. Il garde beaucoup plus dans la fermeture que ce qui est souhaitable. Dans les navigateurs modernes, 'let dateFormatted = ...' dans le code d'origine corrigera le problème. Un IIFE n'est requis que pour les navigateurs plus anciens et ne devrait que "débloquer" * dateFormatted *. – RobG