Как избавиться от ошибки Uncaught TypeError [закрыт]

177
27 ноября 2021, 18:50
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 1 год назад.

Улучшить вопрос

Все работает, но в консоли у меня ошибка.

Uncaught TypeError: Cannot read property 'replaceChild' of null

methodName(); 
 
function methodName() { 
  let alldivs = document.querySelectorAll('.myBtn'); 
  let alldivsArr = Array.from(alldivs); 
 
  for (var i = alldivsArr.length - 1; i >= 0; i--) { 
 
    alldivsArr[i].addEventListener('click', function asd() { 
      console.log(i); 
      var d = document.createElement('input'); 
      d.setAttribute("class", "myInput"); 
      d.setAttribute("value", this.innerText); 
      this.parentNode.replaceChild(d, this); 
      d.select(); 
 
      d.addEventListener('blur', function() { 
        let g = document.createElement('div'); 
        g.setAttribute("class", "myBtn"); 
        g.innerHTML = d.value; 
 
        d.parentNode.replaceChild(g, d); 
        // removeIventLis(); 
        methodName(); 
 
      }) 
    }); 
  } 
}
<div class="myBtn">lolk</div> 
<div class="myBtn">lolkasdasd</div> 
 
 
<button id="btn">Click</button>

Answer 1

Проблема заключается в вызове methodName, внутри обработчика blur.

Так как внутри этого метода добавляются обработчики всем выбранным элементам на странице, а не только что добавленным, у некоторых элементов оказывается сразу несколько обработчиков клика. Поэтому при клике на них, на втором обработчике у this уже нет parentNode так как элемент уже был заменен на input.

Для решения достаточно вручную добавить обработчик вновь создаваемому элементу.

methodName(); 
 
function methodName() { 
  let alldivs = document.querySelectorAll('.myBtn'); 
  let alldivsArr = Array.from(alldivs); 
 
  for (var i = alldivsArr.length - 1; i >= 0; i--) { 
 
    alldivsArr[i].addEventListener('click', function myBtnClickHandler() { 
      console.log(i); 
      var d = document.createElement('input'); 
      d.setAttribute("class", "myInput"); 
      d.setAttribute("value", this.innerText); 
      this.parentNode.replaceChild(d, this); 
      d.select(); 
      d.addEventListener('blur', function() { 
        let g = document.createElement('div'); 
        g.setAttribute("class", "myBtn"); 
        g.innerHTML = this.value; 
        g.addEventListener('click', myBtnClickHandler); 
        this.parentNode.replaceChild(g, this); 
      }) 
    }); 
  } 
}
<div class="myBtn">lolk</div> 
<div class="myBtn">lolkasdasd</div> 
 
 
<button id="btn">Click</button>

READ ALSO
Как сделать код без переменной shift?

Как сделать код без переменной shift?

Есть вот такая часть из React-Redux приложения:

146
Браузер Xiaomi и загрузка файлов html форма

Браузер Xiaomi и загрузка файлов html форма

ХелоСтолкнулся с такой бедой

173
Разъезжаются строки в таблице при добавлении ячеек

Разъезжаются строки в таблице при добавлении ячеек

Задача - добавление в начале строк картинок, соответствующих названию игры, если подходящей картинки нет, то должна вставляться картинка...

263
Проверка всех input на пустоту и отображение сообщений об ошибке только у пустых

Проверка всех input на пустоту и отображение сообщений об ошибке только у пустых

Если несколько input, рядом с ними сообщения об ошибке, у которых дефолтно display: none

157