ОБНОВЛЕНО С ПОЛНЫМ КОДОМ
Я пытаюсь динамически добавить div в некоторые другие DIV, хранящиеся в массиве.
Массив, содержащий DIV, называется categoryData, который содержит атрибут с его category name
Элемент div строки магазина (categoryData) вначале пуст.
У меня есть другой массив, который содержит объект продукта, хранящийся в массиве с именем
storeCategoryData
Объект продукта имеет следующий формат:
{CategoryName:categoryname,StoreObject:store_clearfix} // store_clearfix is another div
Я пытаюсь добавить StoreObject в категорию DIV Data.
К сожалению, некоторые объекты добавляются, а другие нет. Я могу понять, что я делаю неправильно здесь. Любая помощь приветствуется.
Спасибо!
Я пытался сделать все возможное. Все равно не повезло :(
var store_list = document.getElementsByClassName("shop-list")[0];
if (data['stores']!=null && data['stores'] !== typeof undefined){
var numstores = Object.keys(data["stores"]).length;
var count = 0;
while (count < numstores) {
var categories = data["stores"][count].Categories;
var catcount = categories.length;
var c=0;
while(c<catcount){
var cat = categories[c];
if (!(storeCategories.indexOf(cat) > -1)) {
var category_element = document.createElement("li");
if (count==0 && c==0){
category_element.className = "active";
}
var clickable = document.createElement("a");
clickable.href = "#";
clickable.innerText = cat;
clickable.setAttribute("category-data", cat);
storeCategories.push(cat);
category_element.appendChild(clickable);
category_list.appendChild(category_element);
var div = document.createElement("div");
div.className = "shop-row";
div.setAttribute("category-name", cat);
categoryData.push(div);
}
c++;
}
count++;
}
count = 0;
while (count < numstores) {
var StoreId = data["stores"][count].StoreId;
var WebsiteUrl = data["stores"][count].WebsiteUrl;
var LogoUrl = data["stores"][count].LogoUrl;
var categories = data["stores"][count].Categories;
var store_clearfix = document.createElement("div");
store_clearfix.className = "single-products-catagory clearfix";
var store_atag = document.createElement("a");
store_atag.className = "home-shop";
store_atag.href = WebsiteUrl;
var store_img = document.createElement("img");
store_img.className = "shop-icon";
store_img.src = LogoUrl;
store_img.alt = StoreId;
store_atag.appendChild(store_img);
store_clearfix.appendChild(store_atag);
c=0;
catcount = categories.length;
while(c<catcount){
var categoryname = categories[c];
var i = 0;
var datacount = categoryData.length;
while(i<datacount){
var datarow = categoryData[i];
if (categoryname==datarow.getAttribute("category-name")) {
var storeObj = {CategoryName:categoryname,StoreObject:store_clearfix};
storeCategoryData.push(storeObj);
break;
}
i++;
}
c++;
}
count++;
}
categories_tab.appendChild(category_list);
i=0;
for (i = 0; i < categoryData.length; i++) {
var div = categoryData[i];
console.info(div);
var name = div.getAttribute("category-name");
var c;
for (c = 0; c < storeCategoryData.length; c++) {
console.info(storeCategoryData[c].CategoryName);
if (storeCategoryData[c].CategoryName==name){
console.info(storeCategoryData[c].StoreObject);
div.appendChild(storeCategoryData[c].StoreObject);
}
}
console.info("Finished "+name );
console.info(div);
store_list.appendChild(div);
}
}
Пример переменной data определяется следующим образом
{
"status": "success",
"stores": [
{
"StoreId": "randomStore",
"WebsiteUrl": "https://abcd.com",
"LogoUrl": "https://abcd.come",
"Categories": [
"ALL",
"MENS",
"WOMENS"
]
},
{
"StoreId": "someStoreId",
"WebsiteUrl": "https://someurl.com",
"LogoUrl": "https://someLogo.com",
"Categories": [
"MENS"
]
}
]
}
Я согласен с Мунимом Мунной: «непонятно, о чем вы спрашиваете», ваш код неверен, когда я пытаюсь запустить это на JSFiddle, я получаю несколько ReferenceError: {propertyName} не определено. Это рабочий пример JSFiddle. jsfiddle.net/c3ozfvry . Укажите, что вы ожидали и что не так?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, причина в том, что один элемент хранилища может быть добавлен только к одному элементу категории, даже если он может принадлежать нескольким категориям.
======== сохранить историю ниже:=====================
Лог мне кажется идеальным. Я не вижу проблемы.
Вы написали заявление:
if (storeCategoryData[c].CategoryName==name)
Итак, некоторые StoreObject добавлены; другие нет.
Проверьте строку 183 в журнале, объект в строке 175 в журнале не добавлен. Я просто не понимаю! Почему бы нет?
Я не могу до конца понять, что вы там написали, но, как я вижу, вы хотите прикрепить из строки JSON, а не Node с appendChild.
var div = categoryData[i];
Это должно быть что-то вроде этого:
store_list.innerHTML += DIV;
Я бы даже не начал цикл while с NULL или пустым массивом categoryData. Я бы передал это в функцию, потому что, если я хочу снова вызвать ее динамически или сначала посмотреть, доступна ли она вообще. storeCategoryData - это объект, а не массив... и т.д.
categoryData не пуст при использовании, потому что данные добавляются в массив до того, как будут назначены на div. Ваше решение с использованием innerHTML не работает.
У меня много общего с этим, но я не все вижу в вашем примере. возможно, это поможет вам, если вы посмотрите на мой код здесь: digital.deutsches-museum.de/hitlist/
Я попробую. Но обратите внимание, что div здесь является фактическим узлом, а не строкой, потому что дочерний элемент добавления работает. Он добавляется, но не каждый div, который должен быть добавлен. В этом примере добавляются только два div, но если вы посмотрите на консоль, вы увидите, что должны быть добавлены 4 div (clearfix для одной категории продуктов). Прежде чем я появился, я распечатал содержимое на консоли.
Проблема, с которой вы столкнулись, вызвана следующим поведением:
The Node.appendChild() method adds a node to the end of the list of children of a specified parent node. If the given child is a reference to an existing node in the document, appendChild() moves it from its current position to the new position (MDN: Node.appendChild())
Это означает, что appendChild удалит узел, если он уже присутствует в DOM, что мы и видим здесь. Это можно легко решить, создав глубокий клон узла, сначала используя cloneNode, прежде чем добавлять его к целевому div, как показано ниже:
var clone = storeCategoryData[c].StoreObject.cloneNode(true);
div.appendChild(clone);
Вы также можете обратиться к приведенному ниже фрагменту для рабочего примера:
var categories_tab = document.getElementById('category-tab');
var store_list = document.getElementById('store-list');
var storeCategories = [];
var storeCategoryData = [];
var data = {
"status": "success",
"stores": [{
"StoreId": "randomStore",
"WebsiteUrl": "https://abcd.com",
"LogoUrl": "https://abcd.come",
"Categories": [
"ALL",
"MENS",
"WOMENS"
]
},
{
"StoreId": "someStoreId",
"WebsiteUrl": "https://someurl.com",
"LogoUrl": "https://someLogo.com",
"Categories": [
"MENS"
]
}
]
};
var categoryData = [];
var category_list = document.createElement("ul");
if (data['stores'] != null && data['stores'] !== typeof undefined) {
var numstores = Object.keys(data["stores"]).length;
var count = 0;
while (count < numstores) {
var categories = data["stores"][count].Categories;
var catcount = categories.length;
var c = 0;
while (c < catcount) {
var cat = categories[c];
if (!(storeCategories.indexOf(cat) > -1)) {
var category_element = document.createElement("li");
if (count == 0 && c == 0) {
category_element.className = "active";
}
var clickable = document.createElement("a");
clickable.href = "#";
clickable.innerText = cat;
clickable.setAttribute("category-data", cat);
storeCategories.push(cat);
category_element.appendChild(clickable);
category_list.appendChild(category_element);
var div = document.createElement("div");
div.className = "shop-row";
div.setAttribute("category-name", cat);
categoryData.push(div);
}
c++;
}
count++;
}
count = 0;
while (count < numstores) {
var StoreId = data["stores"][count].StoreId;
var WebsiteUrl = data["stores"][count].WebsiteUrl;
var LogoUrl = data["stores"][count].LogoUrl;
var categories = data["stores"][count].Categories;
var store_clearfix = document.createElement("div");
store_clearfix.className = "single-products-catagory clearfix";
var store_atag = document.createElement("a");
store_atag.className = "home-shop";
store_atag.href = WebsiteUrl;
var p = document.createElement("p");
p.className = "shop-icon";
var t = document.createTextNode(LogoUrl);
p.appendChild(t)
store_atag.appendChild(p);
store_clearfix.appendChild(store_atag);
c = 0;
catcount = categories.length;
while (c < catcount) {
var categoryname = categories[c];
var i = 0;
var datacount = categoryData.length;
while (i < datacount) {
var datarow = categoryData[i];
if (categoryname == datarow.getAttribute("category-name")) {
var storeObj = {
CategoryName: categoryname,
StoreObject: store_clearfix
};
storeCategoryData.push(storeObj);
break;
}
i++;
}
c++;
}
count++;
}
categories_tab.appendChild(category_list);
i = 0;
for (i = 0; i < categoryData.length; i++) {
var div = categoryData[i];
console.info(div);
var name = div.getAttribute("category-name");
var c;
for (c = 0; c < storeCategoryData.length; c++) {
console.info(storeCategoryData[c].CategoryName);
if (storeCategoryData[c].CategoryName == name) {
console.info(storeCategoryData[c].StoreObject);
var clone = storeCategoryData[c].StoreObject.cloneNode(true);
div.appendChild(clone);
}
}
console.info("Finished " + name);
console.info(div);
store_list.appendChild(div);
}
}<div id = "category-tab" style = "min-height: 20px; border: 1px solid; padding: 10px"></div>
<div id = "store-list" style = "min-height: 20px; border: 1px solid green; padding: 10px; margin-top: 30px"></div>
Можете ли вы создать фрагмент стека или jsfiddle? без вашего HTML-кода непонятно, о чем вы спрашиваете.