#javascript #jquery
#javascript #jquery
Вопрос:
Есть ли способ обнаружить щелчок мыши или событие наведения мыши при выделении текста, но фактически пропустить при выделении текста?
https://jsfiddle.net/chille1987/ctm4rd7n/
<div id="editor">
<p>What is Lorem Ipsum?</p>
<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industryamp;#39;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
</div>
<div id="status"></div>
И вот мой js-код
$(function() {
$('#editor').on('mouseup', function(e) {
let selection = window.getSelection().toString().length;
let targetContainsSelection = e.target.contains(window.getSelection().baseNode);
if(selection > 0 amp;amp; targetContainsSelection) {
$('#status').text('true');
} else {
$('#status').text('false');
}
});
})
Желаемое решение заключается в том, чтобы текст состояния был верным только при нажатии на выделенный текст, но не при выборе.
Ответ №1:
Вы можете добавить mousedown
прослушиватель и отслеживать, было ли выделение при запуске действия (щелчок или выделение). Вот пример:
$(function() {
let hasSelection = false;
$('#editor').on('mousedown', function() {
hasSelection = document.getSelection().toString().length;
}).on('mouseup', function(e) {
if (hasSelection) {
let selection = window.getSelection().toString().length;
let targetContainsSelection = window.getSelection().containsNode(e.target, true);
if (selection > 0 amp;amp; targetContainsSelection) {
$('#status').text('TRUE').css('color', 'green');
}
} else {
$('#status').text('FALSE').css('color', 'red');
}
});
});
#status {
font-weight: bolder;
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="status">FALSE</div>
<div id="editor">
<p>What is Lorem Ipsum?</p>
<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industryamp;#39;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
</div>
Я изменил e.target.contains(window.getSelection().baseNode);
на window.getSelection().containsNode(e.target, true);
, потому что, e.target.contains(window.getSelection().baseNode);
кажется, всегда есть false
в FireFox.
Комментарии:
1. На самом деле это не делает того, о чем просит OP… Или что-нибудь действительно…
2. @ikiK Что заставляет тебя так говорить. Насколько я понимаю, OP хочет, чтобы для текста
#status
элемента было установлено значениеtrue
, еслиmouseup
событие происходит на элементе, который является частью выделения текста. Я протестировал свое решение, и, кажется, оно делает именно это, но, возможно, я что-то упустил.3. О, вы правы, но это не работает в Firefox (на двух компьютерах macOS, той же последней версии), оно остается ложным. Только что протестирован в Safari, и он работает так, как задумано, приношу свои извинения. Но это немного сбивает с толку, я не вижу причин, по которым это не сработало бы в Firefox, и я потерял 2 часа, пытаясь решить это самостоятельно, возможно, даже сделал, это просто не сработало в моем браузере :(. В любом случае, ваше решение короче, чем мои попытки, и эффективно.
4. @ikiK Я не тестировал это в FireFox, я сделал это сейчас, и кажется, что проблемы
e.target.contains(window.getSelection().baseNode);
всегдаfalse
. Я отредактировал свой ответ, чтобы решить эту проблему.5. @ikiK Думая об этом, это не такое уж хорошее решение, можно выделить текст другими способами, кроме использования мыши.