Nie wiem, jak elastycznie lub ile spraw potrzebujesz, aby to uwzględnić, ale na przykład, jeśli tekst zawsze pojawia się przed pierwszymi znacznikami HTML - dlaczego nie po prostu podzielić wewnętrzny HTML na pierwszy znacznik i wziąć pierwszy:
$('#listItem').html().split('<span')[0];
a jeśli potrzebujesz go szerszego, może po prostu
$('#listItem').html().split('<')[0];
a jeśli potrzebujesz tekstu między dwoma znacznikami, na przykład po jednej rzeczy, ale przed drugą, możesz zrobić coś takiego (nieprzetestowane) i użyć instrukcji if, aby uczynić go wystarczająco elastycznym, aby mieć znacznik początkowy lub końcowy lub oba, jednocześnie unikając błędów zerowania odwołania :
var startMarker = '';// put any starting marker here
var endMarker = '<';// put the end marker here
var myText = String( $('#listItem').html() );
// if the start marker is found, take the string after it
myText = myText.split(startMarker)[1];
// if the end marker is found, take the string before it
myText = myText.split(endMarker)[0];
console.log(myText); // output text between the first occurrence of the markers, assuming both markers exist. If they don't this will throw an error, so some if statements to check params is probably in order...
Generalnie tworzę funkcje użyteczne dla takich przydatnych rzeczy, robię je bezbłędne, a następnie polegam na nich często, gdy są solidne, zamiast zawsze przepisywać tego typu manipulacje ciągami i ryzykować zerowe odwołania itp. W ten sposób możesz ponownie użyć funkcji w wielu projektach i nigdy więcej nie trzeba tracić czasu na debugowanie, dlaczego odwołanie do ciągu zawiera nieokreślony błąd odwołania. Być może nie będzie to najkrótszy 1-liniowy kod w historii, ale po uruchomieniu funkcji narzędziowej jest to jedna linia od tego momentu. Zauważ, że większość kodu to po prostu obsługa parametrów, aby uniknąć błędów :)
Na przykład:
/**
* Get the text between two string markers.
**/
function textBetween(__string,__startMark,__endMark){
var hasText = typeof __string !== 'undefined' && __string.length > 0;
if(!hasText) return __string;
var myText = String( __string );
var hasStartMarker = typeof __startMark !== 'undefined' && __startMark.length > 0 && __string.indexOf(__startMark)>=0;
var hasEndMarker = typeof __endMark !== 'undefined' && __endMark.length > 0 && __string.indexOf(__endMark) > 0;
if( hasStartMarker ) myText = myText.split(__startMark)[1];
if( hasEndMarker ) myText = myText.split(__endMark)[0];
return myText;
}
// now with 1 line from now on, and no jquery needed really, but to use your example:
var textWithNoHTML = textBetween( $('#listItem').html(), '', '<'); // should return text before first child HTML tag if the text is on page (use document ready etc)