Se eu tiver html assim:
<li id="listItem">
This is some text
<span id="firstSpan">First span text</span>
<span id="secondSpan">Second span text</span>
</li>
Estou tentando usar .text()
para recuperar apenas a string "Este é um texto", mas, se eu disser $('#list-item').text()
, recebo "Este é um texto textFirst span textSecond span text".
Existe uma maneira de obter (e possivelmente remover, por meio de algo como .text("")
) apenas o texto livre em uma tag e não o texto em suas tags filho?
O HTML não foi escrito por mim, então é com isso que tenho que trabalhar. Eu sei que seria simples colocar apenas o texto em tags ao escrever o html, mas, novamente, o html é pré-escrito.
Respostas:
Gostei dessa implementação reutilizável com base no
clone()
método encontrado aqui para obter apenas o texto dentro do elemento pai.Código fornecido para fácil referência:
fonte
Resposta simples:
fonte
this.nodeType == Node.TEXT_NODE
vez dethis.nodeType == 3
. Mais fácil de ler e entender o IMO..contents().filter(...)
chamada em uma variável local e verificar seu tamanho, por exemplo,var text = $(this).contents().filter(...); if (text.length) { return text[0].nodeValue; } return "";
Este parece ser um caso de uso excessivo de jquery para mim. A seguir, o texto será ignorado pelos outros nós:
Você precisará apará-lo, mas ele obterá o que você deseja em uma linha fácil.
EDITAR
O acima irá obter o nó de texto . Para obter o texto real, use o seguinte:
fonte
$('.foo')[0].childNodes[0].nodeValue.trim()
document
. Vim aqui usandocheerio
.Mais fácil e rápido:
fonte
get(0)
invés de apenas[0]
?Semelhante à resposta aceita, mas sem clonagem:
E aqui está um plugin jQuery para este fim:
Aqui está como usar este plugin:
fonte
.contents()
parte é crítica aqui!não é o código:
apenas se tornando jQuery pelo bem do jQuery? Quando operações simples envolvem tantos comandos encadeados e muito processamento (desnecessário), talvez seja hora de escrever uma extensão jQuery:
chamar:
os argumentos estão no caso de um cenário diferente, como
o texto terá valor:
fonte
Tente o seguinte:
fonte
Terá de ser algo adaptado às necessidades, que depende da estrutura que lhe é apresentada. Para o exemplo que você forneceu, isso funciona:
Demo: http://jquery.nodnod.net/cases/2385/run
Mas é bastante dependente da marcação ser semelhante à que você postou.
fonte
clone
método aqui se esse não for o efeito pretendido..detach()
método em vez de.remove()
.Variante curta de resposta Stuart.
ou com
get()
fonte
fonte
Esta é uma pergunta antiga, mas a resposta principal é muito ineficiente. Aqui está uma solução melhor:
E faça isso:
fonte
Presumo que essa seria uma boa solução também - se você deseja obter o conteúdo de todos os nós de texto que são filhos diretos do elemento selecionado.
Nota: a documentação do jQuery usa código semelhante para explicar a função do conteúdo: https://api.jquery.com/contents/
PS: Há também uma maneira um pouco mais feia de fazer isso, mas isso mostra mais detalhadamente como as coisas funcionam e permite um separador personalizado entre nós de texto (talvez você queira uma quebra de linha lá)
fonte
Proponho usar o createTreeWalker para encontrar todos os elementos de texto não anexados aos elementos html (essa função pode ser usada para estender o jQuery):
fonte
Se a posição
index
do nó de texto estiver fixa entre seus irmãos, você poderá usarfonte
Não tenho certeza de quão flexível ou quantos casos você precisa cobrir, mas, por exemplo, se o texto sempre vem antes das primeiras tags HTML - por que não dividir o html interno na primeira tag e pegar o primeiro:
e se você precisar mais amplo talvez apenas
e se você precisar do texto entre dois marcadores, como após uma coisa, mas antes de outra, poderá fazer algo como (não testado) e usar as instruções if para torná-la flexível o suficiente para ter um marcador de início ou fim ou ambos, evitando erros nulos de ref :
Geralmente, faço funções utilitárias para coisas úteis como essa, as deixo livres de erros e depois confio nelas frequentemente uma vez sólidas, em vez de sempre reescrever esse tipo de manipulação de string e arriscar referências nulas, etc. Dessa forma, você pode reutilizar a função em muitos projetos e nunca mais perca tempo depurando por que uma referência de string tem um erro de referência indefinido. Pode não ser o código de 1 linha mais curto de todos os tempos, mas depois que você tiver a função de utilitário, será uma linha a partir de então. Observe que a maior parte do código é apenas manipular parâmetros que estão lá ou não para evitar erros :)
Por exemplo:
fonte
$('#listItem').html( newHTML )
; onde newHTML é uma variável que já possui o texto despojado.Esta é uma boa maneira para mim
fonte
Eu vim com uma solução específica que deveria ser muito mais eficiente do que a clonagem e modificação do clone. Essa solução funciona apenas com as duas reservas a seguir, mas deve ser mais eficiente que a solução atualmente aceita:
Com isso dito, aqui está o código:
fonte
Assim como a pergunta, eu estava tentando texto extrato, a fim de fazer alguma substituição regex do texto, mas estava ficando problemas onde meus elementos internos (ou seja:
<i>
,<div>
,<span>
, etc.) estavam se também removidos.O código a seguir parece funcionar bem e resolveu todos os meus problemas.
Ele usa algumas das respostas fornecidas aqui, mas em particular, substituirá o texto apenas quando o elemento for de
nodeType === 3
.O que o acima faz é percorrer todos os elementos do dado
el
(que foram simplesmente obtidos com$("div.my-class[name='some-name']");
. Para cada elemento interno, basicamente os ignora. Para cada parte do texto (conforme determinado porif (this.nodeType === 3)
), aplicará a substituição do regex apenas nesses elementos .A
this.textContent = text
porção simplesmente substitui o texto Substituição, que no meu caso, eu estava à procura de sinais como[[min.val]]
,[[max.val]]
, etc.Este trecho curto de código ajudará qualquer um que tente fazer o que a pergunta estava perguntando ... e um pouco mais.
fonte
basta colocá-lo em um
<p>
ou<font>
e pegar o $ ('# listItem font'). text ()Primeira coisa que veio à mente
fonte
Você pode tentar isso
fonte
Use uma condição extra para verificar se innerHTML e innerText são iguais. Somente nesses casos, substitua o texto.
http://jsfiddle.net/7RSGh/
fonte
Para poder aparar o resultado, use o DotNetWala da seguinte maneira:
Eu descobri que usar a versão mais curta como
document.getElementById("listItem").childNodes[0]
não funcionará com o trim () do jQuery.fonte
document.getElementById("listItem").childNodes[0]
é javascript simples, você tem que envolvê-la na função jQuery$(document.getElementById("listItem").childNodes[0]).trim()
.trim()
ao final. Essa resposta é necessária?Eu não sou um especialista em jquery, mas que tal,
fonte
Isso não foi testado, mas acho que você pode tentar algo como isto:
http://api.jquery.com/not/
fonte
$('#listItem').text()
.#listItem
não é uma<span>
adição tãonot('span')
não faz nada.