Доброй ночи! Суть вопроса в следующем: есть текст в блоке или . Как щелкнув например на любое слово в тексте передать именно его в переменную, через которую потом в базе текстового файла найти его синоним и подставить обратно в тоже самое место?
Например, таким образом: Код (Javascript): document.querySelector('div').addEventListener('click', function(e) { let txt = this.textContent, sel = window.getSelection(), range = sel.getRangeAt(0), startPos = txt.lastIndexOf(' ', range.startOffset), endPos = txt.indexOf(' ', range.startOffset); startPos = startPos !== -1 ? startPos + 1 : 0; endPos = endPos !== -1 ? endPos : txt.length; alert(txt.substring(startPos, endPos)); }); Что нужно учесть при обработке: 1. При клике на пробельном символе - получаем пробел 2. Вместе со словом, будут захватываться знаки препинания 2.1. При очистке от знаков препинания, не забывайте, что могут быть слова, разделенные дефисом: как-то, где-то и т.д. Кстати, подобные сокращения ("т.д.", "т.п.") тоже нужно учитывать.
Отличное решение =))) а подскажите тогда еще одно. Например в переменной лежит другое слово, как мне его подставить взамен изначально полученного?
У вас есть индекс первого и последнего символа в слове. Конкатенируем: подстрока от 0 до startPos + "НовоеСлово" + подстрока от endPos до длина текста. Получаем на выходе такой результат: Код (Javascript): /* ... */ this.textContent = txt.substring(0, startPos) + newWord + txt.substring(endPos, txt.length); /* ... */ --- Добавлено --- Раздел "PHP для профи" плавно переквалифицировался в раздел "JavaScript"
с пробелами думаю можно справиться. А как все это дело перенести в textarea? Попробовал исправить блок на текстареа, меняется только первое слово и это понятно. А как сделать переклюючение между блоком и teatarea, чтобы можно было подредактировать текст если что?
это как? объясните пожалуйста. Мне по хорошему нужно было вообще на php в связке ajax сделать, но и предложенный вариант мне понравился.
Тут особо нечего переделывать. Разве что установка обработчика события и получение/запись текстового содержимого элемента: Код (Javascript): $('div').on('click', function(e) { let txt = $(this).text(), //... остальное без изменений }); jQuery - это библиотека, написанная на нативном (чистом) JS. Если еще проще, то jQuery - это набор методов (функций), которые написаны обычным языком JavaScript. Например, в jQuery можно добавить метод "getClickWord", в которой будет код типа такого, как я показал выше, а вы, как пользователь, будуте только применять этот метод к определенному элементу: $('div').getClickWord(); Этих функций огромное количество, но в реальности, вы используете только какой-то маленький их процент. При этом, библиотека, которая весит очень не мало, всё равно вся грузится в клиенте, что утяжеляет страницы сайта. В чем проблема? Вы можете Ajax-ом передавать только позицию клика "range.startOffset", а все действия с текстом производить на сервере.
Зачем тут php то? Когда ты увидел страницу в браузере , то php уже отработал на сервере(именно на сервер) и завершил работу. В браузере его нет(если только ввиде обычного текста , с целью чтения глазами) и не должно быть. Чтобы заставить работать php, нужно отправить get, post, put, delete к серверу. (т.е. перейти по ссылке , отправить форму, отправить запрос к php из ajax/js и т.д.). В браузере может работать js и отправлять запросы к php и получать данные от сервера и выводить на страницу. И задача твоя решается на js.
@Deonis а как сделать так, чтобы при повторном клике еще раз добавлялось тоже самое слово? Немного доработал скрипт https://jsfiddle.net/Medvedoc/sa26uwxt/38/ Но как сделать, чтобы при первом запуске срабатывала замена? На данный момент начинает работать как только два раза нажать на кнопку.
@Medvedoc, вы словами опишите последовательность действий и что должно при этом происходить, тогда будет над чем подумать. А пока у вас в коде какая-то несуразица
1. Если нажать на слово, то оно меняется на заданное 2. Если нажать еще раз на добавленное слово, то к нему повторно добавляется слово через символ, например | 3. Если нажать кнопку, то div преобразуется в textarea, где можно подправить текст, но при этом при нажатиина слова не должны происходить замены 4. Перевести вновь textarea в div с сохранением сделанных изменений Как-то так
Исходя из вашего кода, там не пахнет никаким textarea, но не важно. Меня больше смущает второй пункт: То же самое слово из переменной?
@Medvedoc, пробуйте такой вариант Код (Javascript): const newWord = 'Medvedoc', mydiv = document.getElementById('mydiv'); document.getElementById('foo').addEventListener('click', () => { mydiv.contentEditable = !mydiv.isContentEditable; mydiv.focus(); }); mydiv.addEventListener('click', () => { if (mydiv.isContentEditable) { return false; } let txt = mydiv.textContent, sel = window.getSelection(), range = sel.getRangeAt(0), startPos = txt.lastIndexOf(' ', range.startOffset), endPos = txt.indexOf(' ', range.startOffset); startPos = startPos !== -1 ? startPos + 1 : 0; endPos = endPos !== -1 ? endPos : txt.length; let word = txt.substring(startPos, endPos), insertion = word.split('|').filter(el => el !== newWord).length === 0 ? word + '|' + newWord : newWord; mydiv.textContent = txt.substring(0, startPos) + insertion + txt.substring(endPos, txt.length); });
@Deonis, Вы просто гений! А как можно если последовательно заменились два слова их окружить кавычками или скобками? То есть Код (Text): Medvedoc|Medvedoc|Medvedoc|Medvedoc преобразовать в Код (Text): (Medvedoc|Medvedoc|Medvedoc|Medvedoc) или Код (Text): "Medvedoc|Medvedoc|Medvedoc|Medvedoc" Или просто выделить область эту и чтобы автоматически обрамить в скобки или кавычки. А касаемо пробелов поступить немного иначе. Если щелкнуть по пробелу, то он заменится на другой знак пунктуации. например, на нижнее подчеркивание (_) --- Добавлено --- а также при наведении на слово, чтобы оно выделялось рамкой или применялся другой стиль, чтобы обозначить hover-эффект
Змените: Код (Javascript): // строка let word = txt.substring(startPos, endPos), // на эту let word = txt.substring(startPos, endPos).replace(/^\(?|\)?$/g,''), // и участок кода word + '|' + newWord // на этот '(' + word + '|' + newWord + ')' Два остальных вопроса гораздо сложнее, чем вы себе можете представить. Во первых, заменяя пробельный символ на другой, мы как бы убираем границу между словами и для корректной работы остального кода, нужно вносить существенные правки. А что касается подсветки при наведении, то тут еще сложней задача, т.к. в работу с текстом вмешивается HTML-код. --- Добавлено --- На скорую руку набросал вам примерчик, без замены пробелов, но на доскональную проверку нет времени. Поэтому допиливать будете уже сами
со скобками все чудесно получилось =)))) а вот с нижним подчеркиванием что-то не совсем идеально =) --- Добавлено --- попробую объяснить =) (Medvedoc|Medvedoc|Medvedoc|Medvedoc) если выделить его как обычно выделяем текст, чтобы слева и справа проставились разные знаки например Код (Text): (Medvedoc|Medvedoc|Medvedoc|Medvedoc) на выходе Код (Text): [(Medvedoc|Medvedoc|Medvedoc|Medvedoc)] или как-то щелкнуть на пробел и замена на нужный знак. То есть щелкнули один раз - заменился на знак [, еще раз щелкнули - на знак ], еще раз - на { , еще раз - на } --- Добавлено --- заметил такую ошибку. Если делаю замену с несколькими словами, то после когда перехожу к тертьему слову и начинаю его заменять - замена происходит совсем другого слова
Я вам написал: Не объяснили, да и не имеет значения, т.к. я уже объяснил, что на решения таких задач, требуется совсем не 10-15 минут. А у меня, как и у многих других на форуме, есть своя работа, а в выходные еще и своими делами заняться хочется.
Код (Text): insertion = word === ' ' ? '_' : (word.split('|').filter(el => el !== newWord).length === 0 ? '(' + word + '|' + newWord + ')' : newWord); а подскажите пожалуйста еще как ' ' ? '_' разместить в конце данной строчки
Код (Javascript): insertion = word === ' ' || word === '' ? '_' : (word.split('|').filter(el => el !== newWord).length === 0 ? '(' + word + '|' + newWord + ')' : newWord);
а может можно как-то через а можно через условие проверить что слово для замены не пробел? например так Код (Text): if (word == ' ') {alert ('пробел')} если пробел, то меняем его на символы, если нет, то по обычной схеме