obtendo o conteúdo direto de um elemento html encapsulado em um object jquery

Eu tenho um pedaço de html em um object jquery. Quando eu digo $ (this) .html () eu recebo:

4teaspoonsbutter 

Eu quero obter apenas o pedaço de texto deste segmento html que não está nas extensões. Neste exemplo, é manteiga.

Como faço para conseguir isso?

Obrigado!

Existe a maneira fácil, mas enganadora, largar todas as crianças e obter a propriedade de texto

 var tmp = $(".post-text").clone(); tmp.children().remove(); tmp.text(); 

EDIT Existe também um plugin Text Children que faz isso.

Este exemplo usa .contents() para obter todos os nós filhos (incluindo nós de texto) e, em seguida, usa .map() para transformar cada nó filho em uma string com base no nodeType . Se o nó for um nó de texto (ou seja, texto que não esteja nas extensões), retornamos seu nodeValue .

Isso retorna um conjunto jQuery contendo strings, então chamamos .get() para obter um object array ‘padrão’ que podemos chamar .join() .

 // our 'div' that contains your code: var $html = $('
4teaspoonsbutter
'); // Map the contents() into strings $html.contents().map(function() { // if the node is a textNode, use its nodeValue, otherwise empty string return this.nodeType == 3 ? this.nodeValue : ''; // get the array, and join it together: }).get().join(''); // "butter"

Se você precisar fazer muito isso, você pode fazer um plugin rápido:

 $.fn.directText = function() { return this.contents().map(function() { return this.nodeType == 3 ? this.nodeValue : ''; }).get().join(''); }; 

Ou uma versão um pouco mais robusta que suporte a remoção de espaços em branco / alteração do texto que une a matriz resultante com:

 $.fn.directText = function(settings) { settings = $.extend({},$.fn.directText.defaults, settings); return this.contents().map(function() { if (this.nodeType != 3) return undefined; // remove non-text nodes var value = this.nodeValue; if (settings.trim) value = $.trim(value); if (!value.length) return undefined; // remove zero-length text nodes return value; }).get().join(settings.joinText); }; $.fn.directText.defaults = { trim: true, joinText: '' }; 
 var textvalues = $(this).contents().map(function() { return this.nodeType === 3 ? this.nodeValue : null; });