Uncaught TypeError: невозможно прочитать значение свойства undefined в HTMLInputElement. <anonymous> - PullRequest
0 голосов
/ 13 июля 2020

Я получаю сообщение об ошибке в консоли «Uncaught TypeError: Не удается прочитать значение свойства undefined в HTMLInputElement». в строке 18. Я не смог найти ни одной ошибки в моем коде js, также когда срабатывает предупреждение, оно не go в одном go фактически появляется 2-3 раза. Также мой файл сценария находится в конце тела. Пожалуйста, помогите мне найти ошибку.

let editbox = document.getElementById('editbox');
let val = editbox.innerText;
let showAlert = document.getElementById('alrt');
let edit = document.getElementsByClassName('edit');
let cl = document.getElementsByClassName('input')
editbox.addEventListener('click', clicked);

function clicked() {
    if (cl.length == 0) {
        editbox.innerHTML = '<input type="text" class="input">';
        cl[0].value = val
    }
    showAlert.style.visibility = 'visible';
    
    cl[0].addEventListener('blur', function () {
        if(cl[0].value.length > 0){
        val = cl[0].value
        editbox.innerHTML = `<div class="edit">${val}</div>`;
        showAlert.style.visibility = 'hidden'
        } else {
            alert('You can not leave box empty')
        }

    })
}
@import url('https://fonts.googleapis.com/css2?family=Oswald&family=Raleway:wght@300&display=swap');

*{
    margin: 0px;
    padding: 0px;
    box-sizing: border-box;
}
.container{
    background-color: #83AF9B;
    border: 4px solid black;
    width: 80%;
    margin: 50px auto;
    padding: 5px;
    color: rgb(0, 0, 0);
    display: flex;
    justify-content: center;
    height: 100px;
    border-radius: 10px;
    box-shadow: 10px 10px 40px grey;
    flex-direction: column;
}
.edit {
    margin: 0px 0px 0px 10px;
    font-size: 25px;
    font-family: 'Oswald', sans-serif;
}
.alert{
    margin-left: 10px;
    font-family: 'Raleway', sans-serif;
    font-size: 12px;
    visibility: hidden;
}

.input{
    margin: 0px 0px 0px 10px;
    font-size: 25px;
    font-family: 'Oswald', sans-serif;
    background: none;
    color: black;
    border: 1px solid black;
    border-radius: 5px;
    outline: none;
    padding-left: 2px;
    width: 97%;
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Editable div</title>
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <div class="container">
        <div class="box" id="editbox">
            <div class="edit">Click Here To Edit Me.</div>
        </div>
        <div class="alert" id="alrt">You can now edit it</div>
    </div>
<script src="index.js"></script>
</body>

</html>

1 Ответ

0 голосов
/ 13 июля 2020

«проблема» связана с прослушивателем событий внутри большой функции

прослушиватель событий активируется, когда происходит изменение в cl [0], и, естественно, вы перезаписываете editbox.inner HTML, когда это слушатель активирован, поэтому он снова активируется (асинхронный лог c)

решение просто говорит, если (cl [0]! = undefined) {выполнить остальную часть функции}

мой пример находится ниже (также предотвращает перекрытие слушателей)

let editbox = document.getElementById('editbox');
let val = editbox.innerText;
let showAlert = document.getElementById('alrt');
let edit = document.getElementsByClassName('edit');
var cl = document.getElementsByClassName('input')
editbox.addEventListener('click', clicked);

function clicked() {
    if (cl.length == 0) {
        editbox.innerHTML = '<input type="text" class="input">';
        cl[0].value = val
    }
    showAlert.style.visibility = 'visible';
    
    function theEditor () {
      if(cl[0] != undefined){
        if(cl[0].value.length > 0){
        val = cl[0].value;
        editbox.innerHTML = `<div class="edit">${val}</div>`;
        showAlert.style.visibility = 'hidden'
        } else {
            alert('You can not leave box empty')
        }
      }
    }
    cl[0].removeEventListener('blur', theEditor)
    cl[0].addEventListener('blur', theEditor)
}
@import url('https://fonts.googleapis.com/css2?family=Oswald&family=Raleway:wght@300&display=swap');

*{
    margin: 0px;
    padding: 0px;
    box-sizing: border-box;
}
.container{
    background-color: #83AF9B;
    border: 4px solid black;
    width: 80%;
    margin: 50px auto;
    padding: 5px;
    color: rgb(0, 0, 0);
    display: flex;
    justify-content: center;
    height: 100px;
    border-radius: 10px;
    box-shadow: 10px 10px 40px grey;
    flex-direction: column;
}
.edit {
    margin: 0px 0px 0px 10px;
    font-size: 25px;
    font-family: 'Oswald', sans-serif;
}
.alert{
    margin-left: 10px;
    font-family: 'Raleway', sans-serif;
    font-size: 12px;
    visibility: hidden;
}

.input{
    margin: 0px 0px 0px 10px;
    font-size: 25px;
    font-family: 'Oswald', sans-serif;
    background: none;
    color: black;
    border: 1px solid black;
    border-radius: 5px;
    outline: none;
    padding-left: 2px;
    width: 97%;
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Editable div</title>
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <div class="container">
        <div class="box" id="editbox">
            <div class="edit">Click Here To Edit Me.</div>
        </div>
        <div class="alert" id="alrt">You can now edit it</div>
    </div>
<script src="index.js"></script>
</body>

</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...