Не впевнений, наскільки гнучким або скільки справ вам потрібно це охопити, але для вашого прикладу, якщо текст завжди надходить перед першими тегами HTML - чому б просто не розділити внутрішній html на перший тег і взяти перший:
$('#listItem').html().split('<span')[0];
і якщо вам це потрібно ширше, можливо просто
$('#listItem').html().split('<')[0];
і якщо вам потрібен текст між двома маркерами, як-от після одного, але перед іншим, ви можете зробити щось на кшталт (неперевірене) і використовувати, якщо заяви, щоб зробити його досить гнучким, щоб мати маркер початку або кінця або обидва, уникаючи помилок нульового відхилення :
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...
Я, як правило, роблю корисні функції для таких корисних речей, роблю їх без помилок, а потім часто покладаюсь на них, колись суцільно, а не завжди переписуючи цей тип маніпуляцій рядків та ризикуючи нульовими посиланнями тощо. Таким чином, ви можете повторно використовувати функцію у багатьох проектах і ніколи не доведеться витрачати час на це знову налагодження, чому посилання рядка має невизначену помилку посилання. Можливо, це не найкоротший 1-й рядковий код будь-коли, але після того, як у вас з'явиться функція утиліти, це буде один рядок відтепер. Зверніть увагу, що більша частина коду - це лише обробка параметрів, які існують або не для уникнення помилок :)
Наприклад:
/**
* 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)