Работа с "Uncaught TypeError: Не удалось установить индексированное свойство для 'NodeList': установщик свойства индекса не поддерживается" - PullRequest
1 голос
/ 01 мая 2020

В моей функции hideMessage(selectedCards) я пытаюсь установить новый элемент div для каждого индекса в моей переменной selectedCards. Однако в строке selectedCards[i] = generateACard(generateRandomAttributes(easyDifficulty)); я получаю сообщение о том, что существует «Uncaught TypeError: не удалось установить индексированное свойство для« NodeList »: установщик свойства индекса не поддерживается».

Насколько я понимаю, это потому, что Chrome больше не позволяет устанавливать новые индексы на NodeLists сейчас. С учетом вышесказанного, есть ли альтернативный способ mimi c поведения, которое я пытаюсь получить здесь?

Я искал разные способы обновления DOM. Будет ли работать такой метод, как replaceChild ()?

  function cardSelected() {
    if (!this.classList.contains("selected")) {
      this.classList.add("selected");
      let selectedCards = qsa(".selected");

      if (selectedCards.length === 3) {
        for (let i = 0; i < selectedCards.length; i++) {
          selectedCards[i].classList.remove("selected");
        }

        if (isASet(selectedCards)) {
          messageDisplay(selectedCards, "SET!");
          let foundSets;
          foundSets++;
          qs("#set-count").textContent = foundSets;
        } else {
          messageDisplay(selectedCards, "Not a Set");
        }
        let timeDelay = 1000;
        setTimeout(() => {
          hideMessage(selectedCards);
        }, timeDelay);
      }
    } else {
      this.classList.remove("selected");
    }
  }

  function messageDisplay(selectedCards, displayMessage) {
    for (let i = 0; i < selectedCards.length; i++) {
      let msg = gen("p");
      msg.textContent = displayMessage;
      selectedCards[i].classList.add("hide-imgs");
      selectedCards[i].appendChild(msg);
    }
  }

  function hideMessage(selectedCards) {
    for (let i = 0; i < selectedCards.length; i++) {
      let msg = qs("#" + selectedCards[i].id + " p");
      selectedCards[i].removeChild(msg);
      selectedCards[i].classList.remove("hide-imgs");
      if (isASet(selectedCards)) {
        qs("#" + selectedCards[i].id).innerHTML = "";
        let divCards = qsa("#board div");
        let board = [];
        for (let i = 0; i < divCards.length; i++) {
          board.push(divCards[i].id);
        }

        while (board.includes(selectedCards[i].id) && board.length > 0) {
          selectedCards[i] = generateACard(generateRandomAttributes(easyDifficulty));
        }
        generateImages(generateRandomAttributes(easyDifficulty), selectedCards[i]);
      }
    }
  }

1 Ответ

0 голосов
/ 01 мая 2020

Попробуйте преобразовать объект типа массива NodeList в обычный массив, используя Array.from :

let selectedCards = Array.from(qsa(".selected"));

или кросс-браузер (для IE):

let selectedCards = Array.prototype.slice.call(qsa(".selected"));

Теперь вы сможете изменить массив или даже добавить в него sh новые элементы, как обычный массив.

PS: Я предполагаю, что qsa стоит для querySelectorAll или какого-либо другого полифилла, который вы реализовали:)

...