J'ai des «données» simples, notamment des balises li et des données. puis je l'ai ajouté à la balise «ul». Je veux que chaque balise li puisse cliquer pour transmettre ses données à txtBox.
J'utilise 'for loop' pour ajouter une valeur de chaîne comme ..
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>TEST</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> </head> <body> <input type="search" id="txtBox"> <ul id="ulTag"> </ul> </body> </html>
In function getet J'attends un clic pour envoyer un objet comme ...
li { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block; /* Make it into a block element to fill the whole list */ position: relative; } li:hover { background-color: #adadad; }
Alors. peut utiliser une valeur dans un objet comme ... getData.name, getData.job, ...
window.onload = function () { data = [ { id: 1, name: "namename1", lname: "imlname1", job: "artist", ages: "17" }, { id: 2, name: "namename2", lname: "imlname2", job: "artist", ages: "25" }, { id: 3, name: "namename3", lname: "imlname3", job: "artist", ages: "15" }, { id: 4, name: "namename4", lname: "imlname4", job: "artist", ages: "18" }, { id: 5, name: "namename5", lname: "imlname5", job: "artist", ages: "27" } ]; var datata = ''; for (let i = 0; i < data.length; i++) { datata += '<li onclick="getset(' + data[i] + ' )">' + data[i].name + '</li>'; } $("ul").append(datata); } function getset(data) { console.log("1"); console.log(data); }
mais .. tout ce que j'obtiens juste l'erreur 'Uncaught SyntaxError: Identifiant inattendu '
Pourquoi est-ce arrivé ?? merci
function getset(getData){ getData.name = document.getElementById("txtBox").value; }
{ id: 1, name: "namename1", lname: "imlname1", job: "artist", ages: "17" }
datata = '<li onclick = "getset('+ data[i] +')></li>">';
Dernier résultat, je vais créer une zone de texte pour rechercher des données à partir de 'données', variable, puis cliquer pour obtenir les données complètes de la zone de texte.
6 Réponses :
Vous êtes passign en tant que paramètre d'un objet. Html ne prend pas en charge les objets params. J'ai corrigé votre code:
Vous devez transmettre data [i] .id
et non data[i
.
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>TEST</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> </head> <body> <input type="search" id="txtBox"> <ul id="ulTag"> </ul> </body> </html>
Ensuite, récupérez par l'identifiant l'élément de la collection:
li { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block; /* Make it into a block element to fill the whole list */ position: relative; } li:hover { background-color: #adadad; }
window.onload = function () { data = [ { id: 1, name: "namename1", lname: "imlname1", job: "artist", ages: "17" }, { id: 2, name: "namename2", lname: "imlname2", job: "artist", ages: "25" }, { id: 3, name: "namename3", lname: "imlname3", job: "artist", ages: "15" }, { id: 4, name: "namename4", lname: "imlname4", job: "artist", ages: "18" }, { id: 5, name: "namename5", lname: "imlname5", job: "artist", ages: "27" } ]; var datata = ''; for (let i = 0; i < data.length; i++) { datata += '<li onclick="getset(' + data[i].id + ' )">' + data[i].name + '</li>'; } $("ul").append(datata); } function getset(id) { const match = data.find(e => e.id === id); console.log('Selection: ', match); }
function getset(id) { const match = data.find(e => e.id === id); console.log('Selection: ', match); }
for (let i = 0; i < data.length; i++) { datata += '<li onclick="getset(' + data[i].id + ' )">' + data[i].name + '</li>'; }
@savecost a complété l'exemple
datata = '<li onclick = "getset('+ data[i] +')"></li>';
Correct, mais cela ne résoudra pas le problème des OP.
@ Freedomn-m en fait. Voyez une vue d'ensemble.
Le principal problème est que vous essayez d'ajouter un objet à une chaîne, et donc le type est forcé et, dans ce cas, les données dont vous avez besoin sont perdues.
Une solution de contournement serait de créer un tableau d'objets jQuery que vous souhaitez ajouter, chacun ayant son objet pertinent stocké dans un attribut data
sur l'élément, qui peut être facilement accessible à partir d'un gestionnaire d'événements délégué quelque chose comme ceci:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <input type="search" id="txtBox"> <ul id="ulTag"></ul>
li { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block; /* Make it into a block element to fill the whole list */ position: relative; } li:hover { background-color: #adadad; }
$(function() { var data = [{ id: 1, name: "namename1", lname: "imlname1", job: "artist", ages: "17" }, { id: 2, name: "namename2", lname: "imlname2", job: "artist", ages: "25" }, { id: 3, name: "namename3", lname: "imlname3", job: "artist", ages: "15" }]; var datata = data.map(function(o) { return $('<li />', { text: o.name }).data('object', o); }); $("ul").append(datata).on('click', 'li', function() { console.log($(this).data('object')); }); });
var datata = data.map(function(o) { return $('<li />', { text: o.name }).data('object', o); }); $("ul").append(datata).on('click', 'li', function() { console.log($(this).data('object')); });
Vous pouvez utiliser des littéraux de modèle et vous devez utiliser JSON.stringify
pour transmettre l'objet en tant que paramètre.
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>TEST</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> </head> <body> <input type="search" id="txtBox"> <ul id="ulTag"> </ul> </body> </html>
li { border: 1px solid #ddd; margin-top: -1px; /* Prevent double borders */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block; /* Make it into a block element to fill the whole list */ position: relative; } li:hover { background-color: #adadad; }
window.onload = function () { data = [ { id: 1, name: "namename1", lname: "imlname1", job: "artist", ages: "17" }, { id: 2, name: "namename2", lname: "imlname2", job: "artist", ages: "25" }, { id: 3, name: "namename3", lname: "imlname3", job: "artist", ages: "15" }, { id: 4, name: "namename4", lname: "imlname4", job: "artist", ages: "18" }, { id: 5, name: "namename5", lname: "imlname5", job: "artist", ages: "27" } ]; var datata = ''; for (let i = 0; i < data.length; i++) { datata += ` <li onclick=getset(${JSON.stringify(data[i])})> ${data[i].name}</li> `; } $("ul").append(datata); } function getset(data) { console.log("1"); console.log(data); }
datata += `<li onclick=getset(${JSON.stringify(data[i])})>${data[i].name}</li>`;
c'est une si mauvaise pratique.
merci à tous pour vos réponses et merci à Rory. Je reçois une idée de votre part.
que je comprends .. si vous utilisez
getset({id: 1,name: "namename1",lname: "imlname1",job: "artist",ages: "17"});
le résultat est
getset(data[0]);
alors je essayez d'utiliser ..
datata = '<li onclick="getset(data[' + i + '])">' + data[i].name + '</li>';
est ..
<li onclick = "getset({id: 1,name: "namename1",lname: "imlname1",job: "artist",ages: "17"})></li>">';
pas ...
datata = '<li onclick = "getset('+ data[i] +')></li>">';
Cela fonctionne aussi mais je ne suis toujours pas sûr que ce soit la bonne manière.
Rory a expliqué la raison pour laquelle votre code ne fonctionne pas et une solution de contournement avec jQuery. Voici une autre solution de contournement avec vanilla JS qui
1) Attache chaque propriété d'objet en tant qu'attribut de données à chaque élément de liste
2) Ajoute un seul écouteur d'événement au
au lieu d'un par élément de liste pour écouter les événements de ses enfants alors qu'ils remontent dans le DOM ( délégation d'événements a >).
<ul id="ulTag"></ul>
const data = [{"id":1,"name":"namename1","lname":"imlname1","job":"artist","ages":"17"},{"id":2,"name":"namename2","lname":"imlname2","job":"artist","ages":"25"},{"id":3,"name":"namename3","lname":"imlname3","job":"artist","ages":"15"},{"id":4,"name":"namename4","lname":"imlname4","job":"artist","ages":"18"},{"id":5,"name":"namename5","lname":"imlname5","job":"artist","ages":"27"}]; function handleClick(e) { // Destructure the dataset from the event target const { target: { dataset: { name, job, ages } } } = e; console.log(name, job, ages); } // `map`over the data and create an array of list items const lis = data.map(obj => { return ( `<li data-name="${obj.name}" data-job="${obj.job}" data-ages="${obj.ages}" >${obj.name}</li>` ); }); // Grab the `ul` element, add the list items to it, and add // an event listener to listen for click events const ul = document.querySelector('#ulTag'); ul.innerHTML = lis.join(''); ul.addEventListener('click', handleClick, false);
"Dans la fonction getset, je m'attends à cliquer pour envoyer pour 1 objet" - eh bien, il y a votre problème.
Salut @savecost, veuillez utiliser data [i] .id au lieu de data [i] où vous créez le li dynamique. Merci.