Gostaria de obter todos os nós de texto descendentes de um elemento, como uma coleção jQuery. Qual o melhor jeito pra fazer isso?
fonte
Gostaria de obter todos os nós de texto descendentes de um elemento, como uma coleção jQuery. Qual o melhor jeito pra fazer isso?
O jQuery não possui uma função conveniente para isso. Você precisa combinar contents()
, que fornecerá apenas nós filhos, mas incluirá nós de texto, com find()
, que fornecerá todos os elementos descendentes, mas nenhum nó de texto. Aqui está o que eu vim com:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Nota: Se você estiver usando o jQuery 1.7 ou anterior, o código acima não funcionará. Para corrigir isso, substitua addBack()
por andSelf()
. andSelf()
é descontinuado a favor de addBack()
1,8 em diante.
Isso é um tanto ineficiente comparado aos métodos DOM puros e deve incluir uma solução alternativa feia para a sobrecarga de sua contents()
função pelo jQuery (graças a @rabidsnail nos comentários por apontar isso), então aqui está a solução não-jQuery usando uma função recursiva simples. O includeWhitespaceNodes
parâmetro controla se os nós de texto em espaço em branco são ou não incluídos na saída (no jQuery, eles são filtrados automaticamente).
Atualização: Corrigido o erro quando includeWhitespaceNodes é falso.
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], nonWhitespaceMatcher = /\S/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
getTextNodesIn(el);
document.getElementById()
primeiro, se é isso que você quer dizer:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
qualquer maneira implica que ele irá pesquisar no iframe também. Não vejo como isso poderia ser um bug.Jauco postou uma boa solução em um comentário, por isso estou copiando aqui:
fonte
fonte
jQuery.contents()
pode ser usado comjQuery.filter
para encontrar todos os nós de texto filho. Com uma pequena reviravolta, você também pode encontrar nós de texto dos netos. Não é necessária recursão:jsFiddle
fonte
Eu estava recebendo muitos nós de texto vazios com a função de filtro aceita. Se você estiver interessado apenas em selecionar nós de texto que não contenham espaços em branco, tente adicionar um
nodeValue
condicional à suafilter
função, como um simples$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Ou, para evitar situações estranhas em que o conteúdo se parece com espaços em branco, mas não é (por exemplo, o
­
caractere de hífen suave , novas linhas\n
, guias, etc.), você pode tentar usar uma Expressão regular. Por exemplo,\S
corresponderá a caracteres que não sejam espaços em branco:fonte
Se você puder supor que todos os filhos sejam nós de elemento ou nós de texto, essa é uma solução.
Para obter todos os nós de texto filho como uma coleção de jquery:
Para obter uma cópia do elemento original com os filhos que não são de texto removidos:
fonte
Por alguma razão
contents()
, não funcionou para mim; portanto, se não funcionou para você, aqui está uma solução que eu criei, crieijQuery.fn.descendants
com a opção de incluir nós de texto ou nãoUso
Obter todos os descendentes, incluindo nós de texto e nós de elemento
Obter todos os descendentes retornando apenas nós de texto
Obter todos os descendentes retornando apenas nós de elemento
Original do café :
Soltar na versão Javascript
Este é um navegador cruzado, um pequeno
Array.indexOf
polyfill está incluído no código.fonte
Também pode ser feito assim:
O código acima filtra os textNodes dos nós filhos diretos filhos de um determinado elemento.
fonte
se você deseja remover todas as tags, tente isso
função:
uso:
fonte
Para mim, o velho simples
.contents()
parecia funcionar para retornar os nós de texto, apenas tenha cuidado com os seletores para que você saiba que eles serão nós de texto.Por exemplo, isso envolveu todo o conteúdo de texto dos TDs na minha tabela com
pre
tags e não teve problemas.fonte
Eu tive o mesmo problema e resolvi-o com:
Código:
Uso:
É como,
next()
mas também retorna os nós de texto.fonte