2017-10-17 6 views
1

J'ai un gabarit que je suis en train de cloner pour faire une application de page unique. A l'intérieur de ce modèle sont des DIV qui devraient avoir un ids uniques afin qu'il devrait fonctionner individuellement quand j'ouvre des applications multiples (divs plusieurs clones)Comment changer le div interne lors du clonage d'un template?

<template id="templ"> 
<div id="name"></div> 
<div id="btn"> 
    <fieldset id="fld"> 
    <input type="text" id="userMessage"placeholder="Type your message…" autofocus> 
    <input type="hidden"> 
    <button id="send" >Save</button> 
    </fieldset> 
</div> 
</template> 

et je suis le clonage comme ça

var i =0 
let template = document.querySelector('#templ') 
let clone = document.importNode(template.content, true) 
clone.id = 'name' + ++i // I can't change the Id o this name div 
document.querySelector('body').appendChild(clone) 

Merci

+0

mis '++ I' entre **() ** –

+0

cela fonctionne sans le mettre entre parenthèses, en raison de l'espace, pas une solution – Harman

Répondre

1

clone.id est indéfini puisque le clone est un #document-fragment avec deux enfants.

Vous devez interroger l'enfant « nom » et changer son identifiant, par exemple comme ceci:

const template = document.querySelector('#templ') 
const body = document.querySelector('body') 

function appendClone(index){ 
    let clone = document.importNode(template.content, true) 
    clone.getElementById('name').id = 'name' + index 
    // all other elements with IDs 
    body.appendChild(clone) 
} 

Ensuite, vous pouvez itérer sur la quantité de clones et simplement appeler la fonction avec l'index de la boucle:

let clones = 5 
for (let i = 0; i < clones; i++){ 
    appendClone(i) 
} 
+0

Cela ne fonctionnera pas si je dois dire que 5 clones. Tous les enfants 'name' auront le même identifiant – Jason

+0

Ensuite, vous devrez bien sûr parcourir les clones, mais ma réponse reste valide. Je peux ajouter un exemple de fonction plus tard, dès que je suis à la maison. Aussi, rappelez-vous que vous devrez changer chaque identifiant. – Barthy

0

stockez les données HTML dynamiques dans l'élément de script et ajoutez-les lorsque cela est nécessaire en les remplaçant par des données dynamiques.

données HTML:

<script id="hidden-template" type="text/x-custom-template"> 
    <div id='${dynamicid}'> 
     <p>${dynamic_data}</p> 
    </div> 
</script> 

Script pour remplacer et append.

var template_add = $('#hidden-template').text(); 
var items = [{ 
    dynamicid: '1', 
    dynamic_data: '0' 
    }]; 

function replaceDynamicData(props) { 
    return function(tok, i) { 
     return (i % 2) ? props[tok] : tok; 
    }; 
} 
var dynamic_HTML = template_add.split(/\$\{(.+?)\}/g); 
$('tbody').append(items.map(function(item) { 
    return dynamic_HTML.map(replaceDynamicData(item)).join(''); 
})); 
+0

Je veux faire ça avec vanille JS merci – Jason