Javascript: использовать window.getSelection () одним щелчком мыши?

В JavaScript я не знаю, как использовать window.getSelection() одним щелчком мыши?

var s = window.getSelection();
s = s.toString().trim();
alert(s);

HTML содержит:

<p>This text contains --this; and that-that.</p>

Если один раз щелкнуть по --это;, ожидаемый результат должен быть это. Двойной щелчок должен делать это хорошо, но как это сделать одним щелчком?

Всем большое спасибо, пришел к такому решению:

$('p').bind('click', function () {
    var sel_obj = window.getSelection(); //it will return an object
    sel_obj.modify("move","forward","character");
    sel_obj.modify("extend","backward","word");

    sel_obj.modify("move","backward","character");
    sel_obj.modify("extend","forward","word");

    var text = sel_obj.toString().trim();
    text = text.toLowerCase();
    alert (text);

Рекомендации: https://developer.mozilla.org/en-US/docs/Web/API/Selection

https://developer.mozilla.org/en-US/docs/Web/API/Selection/modify

Определить, какое слово в тексте было нажато

Думаю, вы неправильно понимаете, как работает getSelection. Он получает то, что вы выделили в данный момент. Поэтому, если вы щелкнете что-то один раз, это ничего не выделит. Двойной щелчок по слову выделяет его.

levininja 02.05.2018 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
938
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вам нужно, чтобы ваш код javascript запускался событием onclick.

Итак, внутри вашего элемента p установите onclick на имя вашей js-функции:

<p onClick = "myFunction()">Whatever text here</p>

Где эта функция определяется как

var myFunction = function(){
    var s = window.getSelection();
    s = s.toString().trim();
    alert(s);
}

Большое спасибо. Но дело не в вызове функции myFunction. И приведенный выше код также вернет пустое значение.

behappy 02.05.2018 16:54

Дайте этому идентификатор, затем привяжите функцию щелчка:

<p>This text contains <span id = "this">--this;</span> and that-that.</p>

$( "#this" ).click(function() {
    var s = window.getSelection();
    s = s.toString().trim();
    alert(s);
});

https://api.jquery.com/click/

Для двойного щелчка используйте .dblclick

$( "#this" ).dblclick(function() {
    var s = window.getSelection();
    s = s.toString().trim();
    alert(s);
});

https://api.jquery.com/dblclick/

Спасибо Sirence, но это не так. А текстовое содержимое длинное и сложное для добавления диапазона. Для диапазона можно использовать: $ ('# this'). Text (); достаточно.

behappy 02.05.2018 17:08
Ответ принят как подходящий

Когда вы щелкаете одним щелчком мыши, вы создаете диапазон выбора нулевой длины, поэтому toString() выбора, естественно, будет пустой строкой.

Если вы хотите знать все слово, которое существует там, где произошел единственный щелчок, вам придется немного глубже изучить то, что возвращает getSelection(): https://developer.mozilla.org/en-US/docs/Web/API/Selection

Объект Selection сообщит вам узел в дереве DOM, где существует этот выбор нулевой длины, и смещение в этом узле, где вы щелкнули. Вы можете легко получить весь текст, принадлежащий узлу, но это больше текста, чем вы хотите.

Что вам нужно сделать дальше, так это посмотреть на текст со смещением выделения и сканировать назад и вперед от этой точки, чтобы найти границы слов.

Извините, я не знаю менее сложного подхода, чем этот - насколько я знаю, нет ничего, что могло бы дать вам все слово при выборе одного щелчка автоматически.

большое спасибо за ссылку! Это тоже важно: developer.mozilla.org/en-US/docs/Web/API/Selection/modify to

behappy 02.05.2018 19:13

Это моя реализация, демо здесь

document.addEventListener('mouseup', (e) => {
    const selection = window.getSelection();
    if (!selection.isCollapsed) {
        console.info("[skipping] Selection detected");
        return;
    }

    const word = getWordAt(selection.focusNode.textContent, selection.focusOffset);
    if (!word) {
        console.info("[skipping] Nothing selected");
        return;
    }

    const range = selection.getRangeAt(0);

    const elementOfSelectedWord = range.startContainer.splitText(range.startOffset - word.offset),
        elementAfterSelectedWord = elementOfSelectedWord.splitText(word.word.length);

    const decoratedElementOfSelectedWord = document.createElement('span');
    decoratedElementOfSelectedWord.appendChild(document.createTextNode(elementOfSelectedWord.textContent));
    elementOfSelectedWord.parentNode.insertBefore(decoratedElementOfSelectedWord, elementAfterSelectedWord);
    elementOfSelectedWord.parentNode.removeChild(elementOfSelectedWord);

    const clientRect = decoratedElementOfSelectedWord.getBoundingClientRect();

    if (!isMousePosCoveredInClientRect(e, clientRect)) {
        console.info("[skipping] Mouse pos is not covered in client rect");
        return;
    }

    drawRedRect(clientRect);

    console.info(`${word.word}`);
})


function getWordAt(content, offset) {
    const matchLeft = content.substr(0, offset).match(/(\w+)$/);
    const left = matchLeft ? matchLeft[1] : "";

    const matchRight = content.substr(offset).match(/^(\w+)/);
    const right = matchRight ? matchRight[1] : "";

    if (!left && !right) {
        return null;
    }

    return {word: left + right, offset: left.length};
}

function isMousePosCoveredInClientRect(event, clientRect) {
    return (
        event.clientY >= clientRect.y &&
        event.clientY <= clientRect.y + clientRect.height &&
        event.clientX >= clientRect.x &&
        event.clientX <= clientRect.x + clientRect.width
    );
}

function drawRedRect(clientRect) { // this is to simulate a popup
    const div = document.createElement('div');
    Object.assign(div.style, {
        display: "block",
        position: "absolute",
        left: (clientRect.left + window.scrollX) + "px",
        top: (clientRect.top + window.scrollY) + "px",
        width: clientRect.width + "px",
        height: clientRect.height + "px",
        border: "1px solid red"
    });

    document.body.appendChild(div);
    setTimeout(() => {
        document.body.removeChild(div);
    }, 1000)
}

Другие вопросы по теме