Alguém pode me ajudar com uma função javascript que pode destacar o texto em uma página da web. E o requisito é - destacar apenas uma vez, não como destacar todas as ocorrências do texto como fazemos em caso de pesquisa.
javascript
highlighting
Ankit
fonte
fonte
Respostas:
Você pode usar o efeito de realce jquery .
Mas se você estiver interessado em código javascript bruto, dê uma olhada no que eu obtive. Simplesmente copie e cole em um HTML, abra o arquivo e clique em "destacar" - isso deve destacar a palavra "raposa". Em termos de desempenho, acho que isso seria suficiente para texto pequeno e uma única repetição (como você especificou)
Editar% s:
Usando
replace
Vejo que essa resposta ganhou alguma popularidade, pensei em acrescentá-la. Você também pode usar facilmente substituir
"the fox jumped over the fence".replace(/fox/,"<span>fox</span>");
Ou para várias ocorrências (não relevantes para a pergunta, mas foram feitas nos comentários), basta adicionar
global
a expressão regular de substituição."the fox jumped over the other fox".replace(/fox/g,"<span>fox</span>");
Espero que isso ajude os comentaristas intrigados.
Substituindo o HTML em toda a página da web
para substituir o HTML por uma página da web inteira, você deve consultar
innerHTML
do corpo do documento.document.body.innerHTML
fonte
"<span class='highlight'>"
por"<span style='color: " + color + ";'>"
, a cor deve ser algo comovar color = "#ff0000";
<img src="fox.jpg" />
Você obteria um HTML inválido que se pareceria com:<img src="<span class='highlight'>fox</span>.jpg" />
Não é bomAs soluções oferecidas aqui são muito ruins.
&
para &,<
para <,>
para>,ä
para ä,ö
para öü
para üß
para ß, etc.O que você precisa fazer:
Percorra o documento HTML, encontre todos os nós de texto, obtenha o
textContent
, obtenha a posição do texto destacado comindexOf
(com um opcionaltoLowerCase
se não for sensível a maiúsculas e minúsculas), anexe tudo antes deindexof
comotextNode
, anexe o texto correspondente com uma extensão de destaque, e repita para o resto do textnode (a string realçada pode ocorrer várias vezes natextContent
string).Aqui está o código para isso:
Então você pode usá-lo assim:
Aqui está um exemplo de documento HTML
A propósito, se você pesquisar em um banco de dados com
LIKE
,por exemplo
WHERE textField LIKE CONCAT('%', @query, '%')
[o que você não deveria fazer, você deve usar fulltext-search ou Lucene], então você pode escapar de todos os caracteres com \ e adicionar uma instrução SQL-escape, dessa forma você encontrará caracteres especiais que são expressões LIKE.por exemplo
e o valor de @query não é
'%completed%'
senão'%\c\o\m\p\l\e\t\e\d%'
(testado, funciona com SQL-Server e PostgreSQL, e todos os outros sistemas RDBMS que suportam ESCAPE)
Uma versão datilografada revisada:
Uso:
fonte
ä
por exemplo, será convertido para o caractere real, mesmo quando estiver usandoinnerHTML
.Por que usar uma função de realce criada por você mesmo é uma má ideia
O motivo pelo qual provavelmente é uma má ideia começar a construir sua própria função de realce do zero é porque você certamente encontrará problemas que outros já resolveram. Desafios:
innerHTML
)Parece complicado? Se você deseja alguns recursos como ignorar alguns elementos de realce, mapeamento de diacríticos, mapeamento de sinônimos, pesquisa dentro de iframes, pesquisa de palavras separadas, etc., isso se torna cada vez mais complicado.
Use um plugin existente
Ao usar um plugin existente e bem implementado, você não precisa se preocupar com as coisas nomeadas acima. O artigo 10 dos plug - ins de realce de texto da jQuery no Sitepoint compara os plug-ins de realce populares.
Dê uma olhada em mark.js
mark.js é um plugin escrito em JavaScript puro, mas também está disponível como plugin jQuery. Ele foi desenvolvido para oferecer mais oportunidades do que os outros plug-ins com opções para:
DEMO
Alternativamente, você pode ver este violino .
Exemplo de uso :
É gratuito e desenvolvido em código aberto no GitHub ( referência do projeto ).
fonte
acrossElements
opção. E para o terceiro comentário; mark.js não é grande em comparação com as funcionalidades que oferece. E não, é improvável que algo quebre no futuro, uma vez que mark.js foi testado, por exemplo, iniciando o Chrome 30 e em todas as versões mais novas com testes de unidade em vários navegadores e nunca houve problemas com as versões futuras.fonte
span.style.backgroundColor = "yellow";
traduz em CSSstyle="background-color: yellow;"
- aquela diferença sutil entre o camelCase e a notação tracejada me atrapalhou no começo.Esta é minha solução regexp de JavaScript puro:
fonte
one|two|three
>
caractere. Modifique o regex usando(?!([^<]+)?<)
para que funcione.Eu tenho o mesmo problema, um monte de texto chega por meio de uma solicitação xmlhttp. Este texto está formatado em html. Eu preciso destacar cada ocorrência.
O problema é que não preciso destacar o texto nas tags. Por exemplo, preciso destacar a raposa:
Agora posso substituí-lo por:
Para responder à sua pergunta: você pode deixar o g nas opções regexp e apenas a primeira ocorrência será substituída, mas esta ainda é a que está na propriedade img src e destrói a tag da imagem:
Foi assim que resolvi, mas queria saber se existe uma maneira melhor, algo que perdi nas expressões regulares:
fonte
<img src="word">
ou<a href="word">
.Nenhuma das outras soluções realmente atendeu às minhas necessidades e, embora a solução de Stefan Steiger tenha funcionado como eu esperava, achei-a um pouco prolixa.
A seguir está minha tentativa:
Eu também recomendaria usar algo como escape-string-regexp se suas palavras-chave puderem ter caracteres especiais que precisariam ser escapados em regexes:
fonte
Exemplo simples de TypeScript
NOTA: Embora eu concorde com @Stefan em muitas coisas, eu só precisava de um simples destaque de correspondência:
E então construir o resultado real:
fonte
Desde HTML5 você pode usar o
<mark></mark>
tags para destacar o texto. Você pode usar javascript para envolver algum texto / palavra-chave entre essas tags. Aqui está um pequeno exemplo de como marcar e desmarcar texto.JSFIDDLE DEMO
fonte
innerHTML
é perigoso. Isso excluirá eventos.Avançando para 2019, a API da Web agora tem suporte nativo para destacar textos:
E você está pronto para ir!
anchorNode
é o nó inicial da seleção,focusNode
é o nó final da seleção. E, se forem nós de texto,offset
é o índice do caractere inicial e final nos respectivos nós. Aqui está a documentaçãoEles até têm uma demonstração ao vivo
fonte
Eu também estava pensando nisso, você pode experimentar o que aprendi neste post.
Eu usei:
você também pode tentar aqui: http://henriquedonati.com/projects/Extension/extension.html
xc
fonte
Se você também deseja que ele seja destacado no carregamento da página, há uma nova maneira.
apenas adicione
#:~:text=Highlight%20These
tente acessar este link
/programming/38588721#:~:text=Highlight%20a%20text
fonte
Usando o método surroundContents () no tipo Range . Seu único argumento é um elemento que envolverá esse intervalo.
fonte