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