Không chắc chắn mức độ linh hoạt hoặc bao nhiêu trường hợp bạn cần nó để che, nhưng đối với ví dụ của bạn, nếu văn bản luôn xuất hiện trước các thẻ HTML đầu tiên - tại sao không chỉ tách html bên trong ở thẻ đầu tiên và lấy trước:
$('#listItem').html().split('<span')[0];
và nếu bạn cần nó rộng hơn có lẽ chỉ cần
$('#listItem').html().split('<')[0];
và nếu bạn cần văn bản giữa hai điểm đánh dấu, như sau một điều nhưng trước một điều khác, bạn có thể làm một cái gì đó như (chưa được kiểm tra) và sử dụng các câu lệnh để làm cho nó đủ linh hoạt để có điểm bắt đầu hoặc kết thúc hoặc cả hai, trong khi tránh các lỗi ref :
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...
Tôi thường tạo các hàm tiện ích cho những thứ hữu ích như thế này, không mắc lỗi và sau đó dựa vào chúng thường xuyên một lần, thay vì luôn viết lại kiểu thao tác chuỗi này và mạo hiểm tham chiếu null, v.v. Bằng cách đó, bạn có thể sử dụng lại hàm trong rất nhiều dự án và không bao giờ phải lãng phí thời gian để gỡ lỗi một lần nữa tại sao một tham chiếu chuỗi có lỗi tham chiếu không xác định. Có thể không phải là mã 1 dòng ngắn nhất từng có, nhưng sau khi bạn có chức năng tiện ích, nó là một dòng từ đó trở đi. Lưu ý hầu hết các mã chỉ là xử lý các tham số có hoặc không để tránh lỗi :)
Ví dụ:
/**
* 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)