Javascript AppendChild Проблема

ОБНОВЛЕНО С ПОЛНЫМ КОДОМ

Я пытаюсь динамически добавить 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"
        ]
    }
  ] 
}

Javascript AppendChild Проблема

Можете ли вы создать фрагмент стека или jsfiddle? без вашего HTML-кода непонятно, о чем вы спрашиваете.

Munim Munna 04.04.2019 17:05

Я согласен с Мунимом Мунной: «непонятно, о чем вы спрашиваете», ваш код неверен, когда я пытаюсь запустить это на JSFiddle, я получаю несколько ReferenceError: {propertyName} не определено. Это рабочий пример JSFiddle. jsfiddle.net/c3ozfvry . Укажите, что вы ожидали и что не так?

Ruben.sar 10.04.2019 14:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
2
582
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, причина в том, что один элемент хранилища может быть добавлен только к одному элементу категории, даже если он может принадлежать нескольким категориям.

======== сохранить историю ниже:=====================

Лог мне кажется идеальным. Я не вижу проблемы.

Вы написали заявление:

if (storeCategoryData[c].CategoryName==name)

Итак, некоторые StoreObject добавлены; другие нет.

Проверьте строку 183 в журнале, объект в строке 175 в журнале не добавлен. Я просто не понимаю! Почему бы нет?

Elinoter99 02.04.2019 07:10

Я не могу до конца понять, что вы там написали, но, как я вижу, вы хотите прикрепить из строки JSON, а не Node с appendChild.

var div = categoryData[i];

Это должно быть что-то вроде этого:

store_list.innerHTML += DIV;

Я бы даже не начал цикл while с NULL или пустым массивом categoryData. Я бы передал это в функцию, потому что, если я хочу снова вызвать ее динамически или сначала посмотреть, доступна ли она вообще. storeCategoryData - это объект, а не массив... и т.д.

categoryData не пуст при использовании, потому что данные добавляются в массив до того, как будут назначены на div. Ваше решение с использованием innerHTML не работает.
Elinoter99 03.04.2019 09:43

У меня много общего с этим, но я не все вижу в вашем примере. возможно, это поможет вам, если вы посмотрите на мой код здесь: digital.deutsches-museum.de/hitlist/

Aleksandar Stajic 03.04.2019 09:50

Я попробую. Но обратите внимание, что div здесь является фактическим узлом, а не строкой, потому что дочерний элемент добавления работает. Он добавляется, но не каждый div, который должен быть добавлен. В этом примере добавляются только два div, но если вы посмотрите на консоль, вы увидите, что должны быть добавлены 4 div (clearfix для одной категории продуктов). Прежде чем я появился, я распечатал содержимое на консоли.

Elinoter99 03.04.2019 10:04
Ответ принят как подходящий

Проблема, с которой вы столкнулись, вызвана следующим поведением:

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>

Другие вопросы по теме