Я работаю над чем-то, что немного над моей головой, и я не могу найти какие-либо библиотеки, которые относятся к этому. В веб-приложении, над которым я работаю, у меня есть список русских людей, и при нажатии на имя человека будет создан список из n статей, написанных этим человеком. Я пытаюсь выполнить это с помощью JavaScript и JSON.
Вот как будут структурированы мои данные JSON:
var people = {
'clients': [
{
'fname': 'joe',
'lname': 'smith',
'AFD': [
{
'articleName': 'AFDArticle1byjoe'
},
{
'articleName': 'AFDArticle2byjoe'
},
{
'articleName': 'AFDArticle3byjoe'
},
{
'articleName': 'AFDArticle4byjoe'
},
{
'articleName': 'AFDArticle5byjoe'
}
]
},
{
'fname': 'jim',
'lname': 'Hoff',
'AFD': [
{
'articleName': 'AFDArticle12byjim'
}
]
},
{
'fname': 'rick',
'lname': 'Robinson',
'AFD': [
{
'articleName': 'AFDArticle5byrick'
}
]
},
{
'fname': 'sarah',
'lname': 'Ross',
'AFD': [
{
'articleName': 'AFDArticle20bysarah'
}
]
},
{
'fname': 'jack',
'lname': 'jones',
'AFD': [
{
'articleName': 'AFDArticle9byjack'
}
]
}
]
};
У каждого есть имя, фамилия и список n статей AFD.
Этот код будет хорошо перечислять количество n людей в таблице HTML из приведенного выше примера JSON:
<table border="1">
<script>
for (var i=0;i<people.clients.length;i++)
{
$("#tabX").append("<tr><td>"+people.clients[i].fname+"</td></tr>");
}
</script>
</table>
и поэтому я получу хороший вывод из первых имен в таблице, например: "joe jim rick sarah jack"
И поэтому, щелкнув "joe", будет создана таблица данных статей Joe. Я уже могу это сделать так:
<table border="1">
<script>
for (var i=0;i<people.clients.length;i++)
{
$("#tabX").append("<tr><td>"+people.clients[ selectedClient ].AFD[i].articleName+"</td></tr>");
}
</script>
</table>
Если "selectedClient" является выбранным клиентом, статьи AFD будут генерироваться так: AFD Article 1 by joe,..., AFD Article 4 by joe.
Итак, наконец! У меня есть некоторые вопросы, которые действительно помогут мне пройти через это. Как я могу изменить значение selectedClient после нажатия на имя кого-то? Возможно ли это сделать, выполнив функцию, как показано ниже?
$("#tabX").append("<tr><td><a href="javascript:selectName();">" +people.clients[i].fname+ "</a></td></tr>");
Я думаю, что ты на правильном пути. Может быть, что-то вроде этого поможет:
$("#tabX").append("<tr><td><a href=\"javascript:;\" onclick=\"javascript:selectName("+i+");\">" +people.clients[i].fname+ "</a></td></tr>");
и тогда это будет ваша функция selectName:
function selectName (idx)
{
selectedClient = idx;
}
Вот как я к этому подхожу.
Я предполагаю следующий HTML:
<table id="people"></table>
<div id="articles"></div>
И следующий Javascript. forEach
- IE9 и выше.
Поэтому для каждого человека в списке клиентов добавьте их в таблицу, указав идентификатор data
для этого индекса клиента в объекте JS и включив имя класса.
people.clients.forEach(function(el, i) {
$('#people').append('<tr><td data-id="' + i + '" class="name">' + el.fname + '</td></td>');
});
Затем, когда вы нажимаете на элемент с name
класса имени, выбираете идентификатор из атрибута data, перебираете AFD для этого клиента, используя идентификатор, и добавляете их в div (или элемент по вашему выбору.). Это делает дальнейшее предположение о том, что между тем, как вы перечисляете своих клиентов, и вы начинаете нажимать на их имена, вы не сортируете объект people, иначе индексы (ids) будут полностью исключены.
$('.name').click(function() {
var id = $(this).data('id');
people.clients[id].AFD.forEach(function(el, i){
$('#articles').append('<div>' + el.articleName + '</div>');
});
});
var node = document.getElementById('tabA'); while (node.hasChildNodes()) { node.removeChild(node.lastChild); }
Сделайте именно в jfiddle, который вы предоставили? Я пытаюсь понять это, так как теперь мне нужно добавить возможность заполнять DOM после выбора одной из статей KCS от любого из людей.