@RohitVerma: Isso funcionará apenas no caso simples de uma seleção que está contida em um único nó de texto, o que de nenhuma maneira é garantido.
Tim Baixo
@Dipak Como você replica a funcionalidade de compartilhamento social do blog que você menciona na sua postagem? Em vez de apenas retornar a sequência selecionada, estou tentando preencher essa variável em um link do twitter.
Respostas:
481
Obter o texto que o usuário selecionou é relativamente simples. Não há benefício a ser obtido com o jQuery, pois você não precisa de nada além dos objetos windowe document.
function getSelectionText(){var text ="";if(window.getSelection){
text = window.getSelection().toString();}elseif(document.selection && document.selection.type !="Control"){
text = document.selection.createRange().text;}return text;}
Se você estiver interessado em uma implementação que também lide com elementos de seleção <textarea>e texty <input>, use o seguinte. Como agora é 2016, estou omitindo o código necessário para o suporte ao IE <= 8, mas eu publiquei material para isso em muitos lugares no SO.
function getSelectionText(){var text ="";var activeEl = document.activeElement;var activeElTagName = activeEl ? activeEl.tagName.toLowerCase():null;if((activeElTagName =="textarea")||(activeElTagName =="input"&&/^(?:text|search|password|tel|url)$/i.test(activeEl.type))&&(typeof activeEl.selectionStart =="number")){
text = activeEl.value.slice(activeEl.selectionStart, activeEl.selectionEnd);}elseif(window.getSelection){
text = window.getSelection().toString();}return text;}
document.onmouseup = document.onkeyup = document.onselectionchange =function(){
document.getElementById("sel").value = getSelectionText();};
Selection:
<br><textareaid="sel"rows="3"cols="50"></textarea><p>Please select some text.</p><inputvalue="Some text in a text input"><br><inputtype="search"value="Some text in a search input"><br><inputtype="tel"value="4872349749823"><br><textarea>Some text in a textarea</textarea>
Para que mais se o {} -fork serve? sobre o que é "Control"?
Dan
29
@ Dan: Desculpe, eu perdi essa pergunta (não acho que SO me alertou para isso). O segundo ramo é para o IE <= 8 (implementos do IE 9 window.getSelection()). A document.selection.typeverificação está testando se a seleção é uma seleção de texto em vez de uma seleção de controle. No IE, uma seleção de controle é uma seleção dentro de um elemento editável que contém um ou mais elementos (como imagens e controles de formulário) com contornos e alças de redimensionamento. Se você chamar .createRange()essa seleção, obterá um ControlRangeao invés de um TextRangee ControlRanges não têm textpropriedade.
Tim Down
2
@ TimDown É muito difícil dizer "jQuery não tem X", porque é claro que, com o plug-in certo, ele pode fazer qualquer coisa que você possa fazer no navegador com javascript. Nesse caso, temos jquery.selection ( madapaja.github.io/jquery.selection ). É igualmente errado dizer "nem deveria". Cheguei aqui porque estava procurando exatamente isso. Eu tenho um caso de uso e o jQuery é a solução certa.
Auspex
8
@Auspex: Eu meio que entendo seu ponto de vista, mas discordo. Um plugin do jQuery é uma biblioteca que depende do jQuery; não é ele próprio jQuery. No caso do manuseio de seleção, o jQuery em si não fornece exatamente nada (o que deve ser porque o manuseio de seleção não é o que serve para o jQuery); portanto, qualquer solução que use o jQuery o usa incidentalmente.
Tim Down
11
@ Dennis98: não sou remotamente irritado ou ofendido :) A verificação dos tipos de entrada é porque você recebe avisos no console do Chrome se tentar acessar selectionStartou selectionEndem um <input>tipo de elemento (como "número") que não apoie-o (consulte jsfiddle.net/6zoposby/2 , por exemplo). Eu deixei a verificação para a existência de, selectionStartpara que o código não seja quebrado no IE <= 8. Admito que a verificação activeElementesteja provavelmente exagerada agora. Eu uso sliceporque é mais poderoso (embora não seja útil aqui) e um pouco mais curto para digitar do que substring.
Isso falhará sob várias condições em vários navegadores (por exemplo, Firefox).
Makyen
11
Esta solução funciona se você estiver usando o chrome (não é possível verificar outros navegadores) e se o texto estiver localizado no mesmo elemento DOM:
Respostas:
Obter o texto que o usuário selecionou é relativamente simples. Não há benefício a ser obtido com o jQuery, pois você não precisa de nada além dos objetos
window
edocument
.Se você estiver interessado em uma implementação que também lide com elementos de seleção
<textarea>
e texty<input>
, use o seguinte. Como agora é 2016, estou omitindo o código necessário para o suporte ao IE <= 8, mas eu publiquei material para isso em muitos lugares no SO.fonte
window.getSelection()
). Adocument.selection.type
verificação está testando se a seleção é uma seleção de texto em vez de uma seleção de controle. No IE, uma seleção de controle é uma seleção dentro de um elemento editável que contém um ou mais elementos (como imagens e controles de formulário) com contornos e alças de redimensionamento. Se você chamar.createRange()
essa seleção, obterá umControlRange
ao invés de umTextRange
eControlRange
s não têmtext
propriedade.selectionStart
ouselectionEnd
em um<input>
tipo de elemento (como "número") que não apoie-o (consulte jsfiddle.net/6zoposby/2 , por exemplo). Eu deixei a verificação para a existência de,selectionStart
para que o código não seja quebrado no IE <= 8. Admito que a verificaçãoactiveElement
esteja provavelmente exagerada agora. Eu usoslice
porque é mais poderoso (embora não seja útil aqui) e um pouco mais curto para digitar do quesubstring
.Obtenha o texto destacado desta maneira:
e, claro, um tratamento especial para ie:
fonte
document.selection
suporte foi removido no IE10 e substituído porwindow.getSelection
". Origem: connect.microsoft.com/IE/feedback/details/795325/…Esta solução funciona se você estiver usando o chrome (não é possível verificar outros navegadores) e se o texto estiver localizado no mesmo elemento DOM:
fonte
Use
window.getSelection().toString()
.Você pode ler mais em developer.mozilla.org
fonte