Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2021, 01:21
Профессор
Отправить личное сообщение для savsoft Посмотреть профиль Найти все сообщения от savsoft
 
Регистрация: 03.01.2019
Сообщений: 155

Делать произвольные заметки к тексту.
Такая задача, есть текст. Необходимо или выделить фразу или просто тыкнуть мышкой в произвольное место в тексте и автоматом формируюется сноска, фокус переключается на текстовое поле для ввода текста сноски, по нажатию кнопки текст сноски сохраняется и организуется связь между сноской в тексте и ее содержимым. При клике по сноске в тексте, текст сноски подсвечивается. Что-то типа

Даже не знаю, как к такому подступиться.

Выделять текст и по кнопке обрамлять выделенный текст в span с нужным дата атрибутом? Или делать режим ввода сноски, когда при клике мышкой в произвольном месте ставить сноску [2] и переключать фокус на поле ввода текста сноски? Может кто сталкивался с подобным, пните в нужном направлении.

Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2021, 02:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

выделение цветом или заметки к тексту
savsoft,
по мотивам кода от Malleys
написать текст, сделать выделение, нажать сохранить.

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <style type="text/css">
        .selected {
            border-radius: 3px;
            -webkit-box-decoration-break: clone;
        }
        ::selection {
            background: rgba(0, 0, 0, .25);
        }
        .sel{
           border: 1px solid red;
           font-size: 1.3em;
        }
        .show {
            display: inline-flex;
            flex-direction: column;
        }
    </style>
    <script>
        let dataTxt = new Map;
        let current;
        function styliString(color) {
            const textarea = document.querySelector(".txt");
            const content = textarea.value.trim();
            if(!content) return;
            const selection = getSelection();
            const range = selection.getRangeAt(0);
            const selectionContents = range.extractContents();
            const span = document.createElement("span");
            const txt = span.cloneNode();
            txt.style.backgroundColor = color;
            txt.textContent = content;
            textarea.value = "";
            document.querySelector(".show").append(txt);
            for(const oldSpan of selectionContents.querySelectorAll(".selected")) {
                for(const childNode of [...oldSpan.childNodes])
                    oldSpan.parentNode.insertBefore(childNode, oldSpan);
                oldSpan.remove();
            }
            selectionContents.normalize();
            span.classList.add("selected");
            span.style.backgroundColor = color;
            span.appendChild(selectionContents);
            range.insertNode(span);
            dataTxt.set(span, txt)
        }
        const  randomColor = () => "#" + ('00000' + (Math.random()*(1<<24)|0).toString(16)).slice(-6)
        document.addEventListener("click", ({ target }) => {
            if(target.classList.contains("save")) {
                styliString(randomColor());
            }
            if(target.classList.contains("selected")) {
                const txt = dataTxt.get(target);
                if(current && current !== txt) current.classList.remove("sel");
                current = txt;
                current.classList.toggle("sel")
            }
        });
    </script>
</head>
<body>
    <button class="save" >Сохранить</button>
    <textarea class="txt" name=""></textarea>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Itaque si aut requietem natura non quaereret aut eam posset alia quadam ratione consequi. Hanc quoque iucunditatem, si vis, transfer in animum; <b>Quod autem ratione actum est, id officium appellamus.</b> Nec vero sum nescius esse utilitatem in historia, non modo voluptatem. An hoc usque quaque, aliter in vita? Quos quidem tibi studiose et diligenter tractandos magnopere censeo. Duo Reges: constructio interrete. Theophrasti igitur, inquit, tibi liber ille placet de beata vita? <i>Eademne, quae restincta siti?</i> Nummus in Croesi divitiis obscuratur, pars est tamen divitiarum. Potius ergo illa dicantur: turpe esse, viri non esse debilitari dolore, frangi, succumbere.</p>
    <div class="show"></div>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Может ли Javascript делать выборку из iframe razorg1991 Общие вопросы Javascript 3 18.06.2015 02:17