Скопировано из моего собственного ответа в похожей теме
В этом примере используется .contents()
для получения всех дочерних узлов (включаятекстовые узлы), затем использует .map()
, чтобы превратить каждый дочерний узел в строку, основанную на nodeType
.Если узел является текстовым узлом (т. Е. Текст не входит в промежутки), мы возвращаем его nodeValue
.
Возвращает набор jQuery, содержащий строки, поэтому мы вызываем .get()
, чтобы получить «стандартный» объект массива, который мы можем вызвать .join()
.
// our 'div' that contains your code:
var $html = $("<div id='attachmentContainer'>\n #Attachment#\n <span id='spnAttachmentName' class='hidden'>#AttachmentName#</span>\n <span id='spnAttachmentPath' class='hidden'>#AttachmentPath#</span>\n</div>");
// 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('');
// "
// #Attachment#
//
//
// "
Если вы хотите обрезать лишние пробелы, вы можете использовать $.trim(this.nodeValue)
Если вам нужно сделать это много, вы можете даже создать плагин (теперь с некоторыми опциями):
$.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: ''
};