Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как выделить искомый запрос в результатах поиска (https://javascript.ru/forum/dom-window/85481-kak-vydelit-iskomyjj-zapros-v-rezultatakh-poiska.html)

WebMachine 16.09.2023 23:19

Как выделить искомый запрос в результатах поиска
 
Здравствуйте.
Хочу выделить искомый запрос в результатах поиска жирным шрифтом.
На данный момент написал:
<script>
document.addEventListener("DOMContentLoaded", () => {
   let searchinput = document.querySelector('#searchinput').value;
   let fullpage = document.querySelector('#fullpage').toString();
   // fullpage.replace(searchinput, '<b>'+searchinput+'</b>');
   fullpage.split(searchinput).join('<b>'+searchinput+'</b>');
});
</script>


Подскажите что я делаю не так? В консоли ошибок нет.
Почему запрос в найденных результатах не выделяется?

рони 17.09.2023 01:11

Цитата:

Сообщение от WebMachine
Почему запрос в найденных результатах не выделяется?

где строка которая выводит результат?

WebMachine 17.09.2023 01:16

Цитата:

Сообщение от рони (Сообщение 553254)
где строка которая выводит результат?

не понял вопроса

WebMachine 17.09.2023 01:20

Цитата:

Сообщение от рони (Сообщение 553254)
где строка которая выводит результат?

Надо чтобы код подсвечивал найденный из input value текст, везде где только увидит его в результатах поиска

WebMachine 17.09.2023 01:26

Цитата:

Сообщение от рони (Сообщение 553254)
где строка которая выводит результат?

HELP

рони 17.09.2023 02:58

WebMachine,
не могу помочь, но я говорил про что-то такое
out.innerHTML =  fullpage.replace(searchinput, '<b>'+searchinput+'</b>');

WebMachine 17.09.2023 03:02

Цитата:

Сообщение от рони (Сообщение 553258)
WebMachine,
не могу помочь, но я говорил про что-то такое
out.innerHTML =  fullpage.replace(searchinput, '<b>'+searchinput+'</b>');

Блин я не думаю что это на столько сложно. Надо просто подсвечивать введённое в input значение в тексте.

WebMachine 17.09.2023 03:21

Цитата:

Сообщение от рони (Сообщение 553258)
WebMachine,
не могу помочь, но я говорил про что-то такое
out.innerHTML =  fullpage.replace(searchinput, '<b>'+searchinput+'</b>');

Нашел решение но оно подсвечивает только первое найденное совпадение:
document.addEventListener("DOMContentLoaded", () => {
    let searchinput = document.querySelector('#searchinput').value;
    let newValue = '<b>' +searchinput+ '</b>';
    const elements = document.querySelectorAll('p.fullpage');
    elements.forEach((element) => {
        element.innerHTML = element.textContent.replace(searchinput, newValue);
    });
});

voraa 17.09.2023 10:01

Цитата:

Сообщение от WebMachine
element.innerHTML = element.textContent.replace(searchinput, newValue);

Используйте replaceAll вместо replace.

WebMachine 17.09.2023 12:17

Цитата:

Сообщение от voraa (Сообщение 553265)
Используйте replaceAll вместо replace.

Спасибо, а можете подсказать как объединить это:
document.addEventListener("DOMContentLoaded", () => {
    let searchinput = document.querySelector('#searchinput').value;
    let newValue = '<b>' +searchinput+ '</b>';
    const elements = document.querySelectorAll('.fulldesc');
    elements.forEach((element) => {
        element.innerHTML = element.textContent.replaceAll(searchinput, newValue);
    });
});

с этим: https://javascript.ru/forum/dom-wind...zav-konec.html

рони 17.09.2023 12:46

WebMachine,
let newValue = '<b>' +searchinput+ '</b>';
вместо этого должен быть regexp, надо искать по форуму, было 100500 раз.

рони 17.09.2023 13:23

WebMachine,
при условии что в искомом тексте нет тегов!!!
<!DOCTYPE HTML>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <script>
        document.addEventListener("DOMContentLoaded", () => {
            let searchinput = document.querySelector('#searchinput').value;
            const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
            const createRegExp = str => new RegExp('(^|\\s+)(' +escapeRegExp(str) + '[a-zа-яё]*)','gim');
            let reg = createRegExp(searchinput); console.log(reg)
            const elements = document.querySelectorAll('p.fullpage');
            elements.forEach((element) => {
                element.innerHTML = element.textContent.replace(reg, '<b>$1$2<\/b>');
            });
        });
    </script>
</head>

<body>
    <input type="text" id="searchinput" value="ipsum">
    <p class="fullpage">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Deleniti dignissimos omnis totam qui veritatis sunt laboriosam. Qui excepturi similique necessitatibus! Explicabo cum eius error facilis accusantium perferendis, voluptatibus rem, quas repudiandae
        quia obcaecati laborum alias a pariatur beatae dicta dolorum voluptas molestias recusandae dolores. Repellendus eligendi facere adipisci vel placeat id porro nisi, quisquam delectus aspernatur amet omnis perspiciatis sed similique. Impedit, ipsum!
        Voluptatum maxime sed fugit dolore nostrum. Facere nemo quam nesciunt necessitatibus officiis cumque aut itaque fugiat recusandae? Quos tempora laudantium autem natus, aut dicta ipsa, ab fugiat, voluptate voluptatem aliquid. Earum voluptates,
        est ad possimus esse ducimus ipsum!</p>
</body>

</html>

WebMachine 17.09.2023 13:36

Цитата:

Сообщение от рони (Сообщение 553289)
WebMachine,
при условии что в искомом тексте нет тегов!!!

Странно, но теперь вобще не выделяются слова: http://new.calangium.com/index.php?do=search, и как сделать так чтобы показывались именно те строки в которых есть это словосочетание? Надо ограничить кол-во отображаемых символов по умолчанию я делал через DLE методом: {short-story limit="250"}.
Но надо ограничить без метода: {short-story limit="250"}, чтобы данное слово было посередине 250 символов и выделено жирным шрифтом. Это последняя просьба Рони и с меня на пиво и чипсы!

Aetae 17.09.2023 14:05

Это всё такое говно, что говно-говно. Поломать страницу можно на раз-два.

Всё это делаться должно совершенно иначе - через Range\Selectoin и с очень-очень аккуратным отношением к нодам, а не innerHTML поверх textContent.

рони 17.09.2023 14:11

WebMachine,
пас, но на всякий случай для медитации
Цитата:

Сообщение от Aetae
Это всё такое говно, что говно-говно. Поломать страницу можно на раз-два.

Всё это делаться должно совершенно иначе - через Range\Selectoin и с очень-очень аккуратным отношением к нодам, а не innerHTML поверх textContent.

https://javascript.ru/forum/misc/851...tml#post551674

WebMachine 17.09.2023 14:19

Цитата:

Сообщение от Aetae (Сообщение 553291)
Это всё такое говно, что говно-говно. Поломать страницу можно на раз-два.

Всё это делаться должно совершенно иначе - через Range\Selectoin и с очень-очень аккуратным отношением к нодам, а не innerHTML поверх textContent.

Можете подсказать какое ни будь решение? Мне надо чтобы просто в результатах подсвечивалась фраза которую пользователь вбил в поиск а сами результаты были ограниченны в 250 символов. И чтобы эти искомые слова были видны в этих 250 символах. Просто сейчас через DLE используя метод {short-story limit="250"}, искомая фраза то видна то нет. В зависимости от её местоположения в тексте. а надо чтобы она была видна всегда и выделялась жирным

WebMachine 17.09.2023 14:20

Помогите хоть кто нибудь. Я заплачу 1000 руб !!! лижбы решить.

WebMachine 17.09.2023 15:37

В общем этот вариант подсвечивает все слова найденные на странице результатов поиска:
<script>
document.addEventListener("DOMContentLoaded", () => {
    let searchinput = document.querySelector('#searchinput').value;
    let newValue = '<b>' +searchinput+ '</b>';
    const elements = document.querySelectorAll('.fulldesc');
    elements.forEach((element) => {
        element.innerHTML = element.textContent.replaceAll(searchinput, newValue);
    });
});
</script>


Но осталось как то решить задачу чтобы выводился именно тот кусок описания в котором есть данное словосочетание.

рони 17.09.2023 18:33

Цитата:

Сообщение от WebMachine
Но осталось как то решить задачу чтобы выводился именно тот кусок описания в котором есть данное словосочетание.

сервер это должен делать.


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