Как использовать (запускать) class в цикле

223
21 июля 2018, 12:50

Внесу некоторые изменения в вопрос, опишу поподробнее....

Коллеги, есть такой вот пример. В котором я создаю class CreateBlockInfo. не думаю что надо объяснять, что именно происходит в данном классе.

let info = document.querySelectorAll('.info'); 
class CreateBlockInfo { 
  constructor(elem) { 
    this.fragment = document.createDocumentFragment(); 
    this.element = document.createElement(elem); 
  } 
  Append(parent) { 
    this.fragment.appendChild(this.element); 
    parent.appendChild(this.fragment) 
  } 
} 
 
//Потом создаю экземпляр класса  runCreateBlockInfo 
let runCreateBlockInfo = new CreateBlockInfo('span'); 
// и вот далее я пытаюсь запустить экземпляр класса в цикле 
// я хочу в каждый элемент info  вставить созданный span 
for (let i = 0; i < info.length; i++) { 
  runCreateBlockInfo.Append(info[i]); 
} 
 
// рузультат такой, только в последний элемент info вставляется span  
 
console.log(info[0].childNodes); 
console.log(info[1].childNodes); 
console.log(info[2].childNodes);
<p class="info"></p> 
<p class="info"></p> 
<p class="info"></p>

Я прекрасно понимаю, что если в цикл создавать новый объект

for (let i = 0; i < info.length; i++) {
  let runCreateBlockInfo = new CreateBlockInfo();
  runCreateBlockInfo.Append(info[i]);
}

То я получу, то чего хочу.

Но, тут есть одно НО... Простите за выражение, нутром чую, что это не верно. Так как я создаю один и тот же Объект несколько раз. А мне кажется, что надо один раз проинициализировать новый объект. А потом использовать его сколько душе угодно.

Коллеги, вопрос - верно ли мои умозаключения выше и если да, как выйти из ситуации???

Или может я не верное рассуждаю? Помогите разобраться.

Answer 1

Метод .appendChild не создает новый элемент. Если элемент уже есть на странице, то он перенесется из одного места, в другое.

Чтобы решить это, можно создавать элемент span каждый раз, либо клонировать тот, который создан в конструкторе, например:

let info = document.querySelectorAll('.info'); 
class CreateBlockInfo { 
  constructor(elem) { 
    this.fragment = document.createDocumentFragment(); 
    this.element = document.createElement(elem); 
  } 
  Append(parent) { 
    this.fragment.appendChild(this.element.cloneNode()); 
    parent.appendChild(this.fragment) 
  } 
} 
 
//Потом создаю экземпляр класса  runCreateBlockInfo 
let runCreateBlockInfo = new CreateBlockInfo('span'); 
// и вот далее я пытаюсь запустить экземпляр класса в цикле 
// я хочу в каждый элемент info  вставить созданный span 
for (let i = 0; i < info.length; i++) { 
  runCreateBlockInfo.Append(info[i]); 
} 
 
// рузультат такой, только в последний элемент info вставляется span  
 
console.log(info[0].childNodes); 
console.log(info[1].childNodes); 
console.log(info[2].childNodes);
span::before { 
  content: "span" 
}
<p class="info"></p> 
<p class="info"></p> 
<p class="info"></p>

READ ALSO
Как завершить выполнение скрипта на jquery?

Как завершить выполнение скрипта на jquery?

В модальном окне с 2 input формами подключен ajax запрос на перехват нажатия кнопки отправки и пост запросом передает данные в бдПроблема в том...

248
Перебор свойств обьекта и мутация [дубликат]

Перебор свойств обьекта и мутация [дубликат]

На данный вопрос уже ответили:

194
MarkerClusterer не видит функцию getPosition()

MarkerClusterer не видит функцию getPosition()

Вывожу на карту фотографии в виде маркеров, которые необходимо кластеризироватьВыводит ошибку: Uncaught TypeError: marker

247
Merge записей с CASCADE ForeignKey

Merge записей с CASCADE ForeignKey

Допустим есть две записи в таблице userТак как это одна из основных таблиц в системе, на которой завязанны множество других таблиц, триггеров...

213