не удается внедрить элемент DOM с помощью подхода node.insertBefore()

#javascript #arrays #algorithm

#javascript #массивы #алгоритм

Вопрос:

У меня есть список элементов, отсортированных в алфавитном порядке. Идея заключалась в том, чтобы внедрить соответствующую букву из alphabetArr массива after <li> с идентификатором из DOMElementsArr массива. Что я делаю не так?

В консоли нет ошибок, но это не работает.

Массивы:

 let alphabetArr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
    "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];

let DOMElementsArr = ['8MM', ... ,'Daddy_Day_Care']
  

Вот мой подход:

 //create function that injects new element
function insertAfter(el, referenceNode) {
  referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
}

//function that loops through both arrays
function injectAllAlphabetLetters(){

  //Create new element
  let newEl = document.createElement('li');
  newEl.className = 'titles alphabet';

  for (let i = 0; i < alphabetArr.length; i  ){
  console.log(alphabetArr[i]);
  newEl.innerHTML = alphabetArr[i][0];
  }

  let ref; 

  for (let j = 0; j < DOMElementsArr.length; j  ){
    console.log(DOMElementsArr[j]);
    ref = document.getElementById(DOMElementsArr[j]);
  }

  insertAfter(newEl, ref);
}

injectAllAlphabetLetters();
  

Комментарии:

1. вы вызываете insertAfter только один раз…

2. объедините оба цикла и вызовите insertAfter внутри цикла

Ответ №1:

В вашем текущем коде вы просто создаете один элемент, затем повторяете и обновляете его содержимое, затем получаете элемент в следующем цикле и, наконец, вы вызываете insertAfter функцию только один раз с последними значениями.

Чтобы это заработало, вам нужно объединить оба цикла, а затем переместить код вставки в цикл.

 //create function that injects new element
function insertAfter(el, referenceNode) {
  referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
}

//function that loops through both arrays
function injectAllAlphabetLetters() {
  // iterate until last element of minimum length array(to avoid problem in case array length are different)
  for (let i = 0; i < alphabetArr.length amp;amp; i < DOMElementsArr.length; i  ) {    
    //Create new element and set properties
    let newEl = document.createElement('li');
    newEl.className = 'titles alphabet';    
    newEl.innerHTML = alphabetArr[i][0];

    // get the element based on id
    let ref = document.getElementById(DOMElementsArr[i]);    
    // call function to insert
    insertAfter(newEl, ref);
  }

}

injectAllAlphabetLetters();