Как заменить выделенное слово
Привет. Выделяю слово в тексте. Нужно его потом редактировать и заменить на отредактированное. Сам процесс понятен. Не понятно как заменить слово. Поясняю. В тексте три слова Вася. Я отмечаю второе скажем. Вывожу его в текстовое поле. На этом этапе оно ещё отмечено, пока я его не стал редактировать его. Как поменять в тексте именно это слово? Уже весь мозг сломал.
|
Вышел на финишную прямую). Осталось решить с одной ф-цией. Итак. Выделяю слово. Кликаю на ссылку и передаю это слово в текстовое поле. Там получаю координаты начала и длину выделенного слова. Редактирую слово и отправляю на сохранение.
function saveText(start,sellected_ln) { //start - координата начала слова(выделенного) //sellected_ln - длина слова(выделенного) var editor = document.querySelector('#select-text'); // текстовое поле var new_text = editor.value; // отредактированное слово var new_text_ln = new_text.length; all_text = document.getElementById('value_2');// контейнер статьи old_text = $(all_text).html(); // изначальный текст old_sel = old_text.substr(start,sellected_ln) new_text = setCharAt(old_text,start,new_text,new_text_ln); } И теперь, если так: function setCharAt(str,index,chr,new_text_ln) { if(index > str.length-1) return str; return str.substring(0,index) + chr + str.substring(index+new_text_ln); } то новый текст заканчивается на изменённом слове. Как правильно написать + str.substring(index+new_text_ln) что бы оно выводило оставшийся текст? |
редактирование выделенного
ureech,
:-? <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> #value_2 span{ background-color: #FFFF00; color: #008000; } </style> </head> <body> <input type="text" id="select-text"> <div id="value_2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat, sint, consectetur iusto esse aliquam consequuntur odio autem numquam error possimus temporibus commodi est aliquid. Earum, aut nisi ex totam a.</div> <button onclick="insertTxt()">insertTxt</button> <button onclick="replaceTxt()">replaceTxt</button> <script> let editor = document.querySelector('#select-text'); let all_text = document.getElementById('value_2'); let span = document.createElement("span"); const insertTxt = () => { let txt = window.getSelection().toString(); if(!txt) return; let range = window.getSelection().getRangeAt(0); let selectionContents = range.extractContents(); span.appendChild(selectionContents); range.insertNode(span); editor.value = txt; editor.focus() } const replaceTxt = () => { if(span.parentNode) span.replaceWith(editor.value); editor.value = span.innerHTML = ""; } </script> </body> </html> |
Блин, пипец.Весь мозг сломал. А ведь пытался в этом направлении мыслить...( Спасибо большое.
|
И последний вопрос по этой теме. В const insertTxt я строю DOM, текстовое поле и кнопки Save и Cansel. И вставляю с помощью append. $('.icms-content-fields').append(redactor); Как мне это дело отменить при нажатии на Cansel. Именно отменить, а не спрятать. Что бы после отмены можно было опять выполнять скрипт.
|
ureech,
могу только гадать, Цитата:
|
remove() не раюотает или я не правильно использую. span не совсем то. Вот код
let span = document.createElement("span"); const get_selected_text=()=> { let txt = window.getSelection().toString(); if (!txt) return false; let range = window.getSelection().getRangeAt(0); let selectionContents = range.extractContents(); span.appendChild(selectionContents); range.insertNode(span); var redactor = ''; redactor += '<div class="mb-3 editor">' redactor += '<textarea id="select-text" class="form-control mb-3 mt-3" rows="3" cols="100%" name="select-text"></textarea>' redactor += '<button type="button" onclick="saveText()" class="btn btn-sm btn-primary mr-3">Save</button>' redactor += '<button type="button" onclick="canselText(this)" class="btn btn-sm btn-primary ">Cansel</button>' redactor += '</div>' $('.icms-content-fields').append(redactor); let editor = document.querySelector('#select-text'); editor.value = txt; editor.focus(); } document.querySelector('.f_content > .value').onmouseup = get_selected_text; const saveText = () => { var editor = document.querySelector('#select-text'); if (span.parentNode) span.replaceWith(editor.value); editor.value = span.innerHTML = ""; var div = document.querySelector('.f_content > .value'); var new_text = $(div).html(); ... //ajax запрос } function canselText(e){ //????? } |
ureech,
а полноценный, но минимальный макет, никак? |
ureech,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .f_content>.value span { background-color: #FFFF00; color: #008000; } </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> let span = document.createElement("span"); const saveText = () => { var editor = document.querySelector('#select-text'); if (span.parentNode) span.replaceWith(editor.value); editor.value = span.innerHTML = ""; $('.mb-3.editor').remove(); var div = document.querySelector('.f_content > .value'); var new_text = $(div).html(); //... //ajax запрос } function canselText(button) { $('.mb-3.editor').remove(); span.replaceWith(span.textContent); span.textContent = ''; } const get_selected_text = () => { let txt = window.getSelection().toString(); if (!txt) return false; let range = window.getSelection().getRangeAt(0); let selectionContents = range.extractContents(); span.appendChild(selectionContents); range.insertNode(span); var redactor = ''; redactor += '<div class="mb-3 editor">' redactor += '<textarea id="select-text" class="form-control mb-3 mt-3" rows="3" cols="100%" name="select-text"></textarea>' redactor += '<button type="button" onclick="saveText()" class="btn btn-sm btn-primary mr-3">Save</button>' redactor += '<button type="button" onclick="canselText()" class="btn btn-sm btn-primary ">Cansel</button>' redactor += '</div>' $('.icms-content-fields').append(redactor); let editor = document.querySelector('#select-text'); editor.value = txt; editor.focus(); } $(function() { document.querySelector('.f_content > .value').onmouseup = get_selected_text; }); </script> </head> <body> <div class="icms-content-fields"></div> <div class="f_content"> <div class="value">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem, doloremque provident eos recusandae impedit possimus magnam tenetur corporis tempora aspernatur laboriosam repellendus est voluptatibus eum tempore incidunt inventore temporibus sit?</div> </div> </body> </html> |
А как?
|
Часовой пояс GMT +3, время: 23:42. |