Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавить div при нажатии Enter [на чистом JS] (https://javascript.ru/forum/misc/83617-dobavit-div-pri-nazhatii-enter-%5Bna-chistom-js%5D.html)

рони 26.01.2022 09:58

webgraph,
ошибки в консоли какие-то есть?

webgraph 26.01.2022 10:05

рони,

У меня тоже пк — макбук..

и в iOS тоже не работает.

Добавлять — добавляет, а удалять — не хочет.. прям никак не хочет..

Что же теперь делать?.. :)

webgraph 26.01.2022 10:06

рони,

в консоли нет никаких ошибок

рони 26.01.2022 10:11

webgraph,
попробуйте так заменить
//list.remove();
                        e.removeChild(list);

webgraph 26.01.2022 10:19

рони,

Это тоже не сработало.

Я решила вывести в консоль текст при нажатии. И когда нажимаешь клавишу delete - в консоль ничего не выводится. словно он эту кнопку не считает кнопкой.

______________

Даже это не помогло:

let key = event.keyCode || event.charCode || event.which;

if (key === 46 || key === 'Delete' || key === 8 || key === 'Backspace' && (target = target.closest('.check-text'))) {

...

}

рони 26.01.2022 10:21

webgraph,
keydown в вашем коде или keypress?

webgraph 26.01.2022 10:31

рони,

У вас было написано keydown, а до этого keypress. Т.к. при keydown не сработало — было поставлено keypress. Хы

Т.к. были добавлены дополнительные коды, то теперь с keydown удаление работает!)) оказывается на macbook это вообще Backspace (код клавиши 8).

НО !) При фокусе после удаления — курсор появляется в начале строки. А по логике он должен в конец текста вставать.

Как сфокусировать на самом конце текста?)

рони 26.01.2022 11:09

Цитата:

Сообщение от webgraph
Как сфокусировать на самом конце текста?)

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <style type="text/css">
        [contenteditable] {
            height: 50px;
            width: 400px;
            border: 1px solid #000000;
        }

        [contenteditable]:focus {
            outline: none;
            border-color: #FF0000;
        }
    </style>
    <title></title>
</head>

<body>
    <!-- Весь список check-листов -->
    <section id="lists">
        <!-- Первая группа check-листов -->
        <div class="group">
            <div class="list list-container">
                <input type="checkbox">
                <div class="check-text" contenteditable=""></div>
            </div>
            <div class="list list-container">
                <input type="checkbox">
                <div class="check-text" contenteditable=""></div>
            </div>
        </div>
        <!-- Вторая группа check-листов -->
        <div class="group">
            <div class="list list-container">
                <input type="checkbox">
                <div class="check-text" contenteditable=""></div>
            </div>
            <div class="list list-container">
                <input type="checkbox">
                <div class="check-text" contenteditable=""></div>
            </div>
        </div>
        <!-- ... Следующая группа check-листов и т.д. -->
    </section>
    <script>
        //функция, которая создает новый див
        function enterCheck(list) {
            let html = `<div class="list list-container">
        <input type="checkbox">
        <div class="check-text" contenteditable=""><\/div>
        <\/div>`
            list.insertAdjacentHTML('afterend', html);
            list.nextElementSibling.querySelector('.check-text').focus();
        }
        //собираем массив всех group'ов
        let checkTexts = document.querySelectorAll('.group');
        //перебираем этот массив
        checkTexts.forEach(function(e) {
            //когда в нём нажимаются клавиши
            e.addEventListener('keydown', function(event) {
                let target = event.target;
                //когда нажата Enter
                if (event.key === 'Enter' && (target = target.closest('.check-text'))) {
                    //отменяем стандартное поведение(перенос строки)
                    event.preventDefault();
                    //если текущий блок не пустой, то добавляем новый сразу после него
                    if (target.innerText !== '') {
                        let list = target.closest('.list')
                        enterCheck(list);
                    }
                };
                if (event.key === 'Delete' && (target = target.closest('.check-text'))) {
                    //отменяем стандартное поведение(перенос строки)
                    event.preventDefault();
                    //если текущий блок пустой и есть блок выше, то удаляем его
                    if (target.innerText === '') {
                        let list = target.closest('.list')
                        let prev = list.previousElementSibling;
                        if (prev) {
                            e.removeChild(list);
                            let div = prev.querySelector('.check-text'),
                                pos = div.innerHTML.length,
                                range = document.createRange();
                            range.setStart(div.childNodes[0], pos);
                            range.collapse(true);
                            let sel = window.getSelection();
                            sel.removeAllRanges();
                            sel.addRange(range);
                        }
                    }
                };
            });
        });
    </script>
</body>

</html>


Часовой пояс GMT +3, время: 02:01.