Это должно быть очень легко. Данный ниже HTML.
<div id='attachmentContainer'>
#Attachment#
<span id='spnAttachmentName' class='hidden'>#AttachmentName#</span>
<span id='spnAttachmentPath' class='hidden'>#AttachmentPath#</span>
</div>
Я хочу получить просто #Attachment# а не другой текст. Когда я попробовал
$("#attachmentContainer").text()
это выделяет весь #Attachment#, #AttachmentName#, а также #AttachmentPath#. Я знаю, что мог просто поместить #Attachment# в другой промежуток и получить доступ к нему непосредственно, но я был просто заинтригован о том, как сделать это. Любая справка очень ценится.
Поскольку ваш текст является первым дочерним узлом для Проверка Чтобы получить значение всех текстовых дочерних элементов (или конкретного), просто переберите коллекцию
var firstChild = $("#attachmentContainer")[0].firstChild;
var textValue = firstChild.nodeType == 3 ? $.trim(firstChild.nodeValue) : "";
nodeType
предназначена для защиты - она проверяет, действительно ли вы обработка текстового узла - firstChild
в конце концов может быть чем-то другим. Реагируйте соответственно, это всего лишь пример. childNodes
вашего элемента, объединив все найденные биты в строку: // the optional "at" parameter lets you define which text node you want
// if not given, this returns all text nodes concatenated
$.fn.ownText = function(at) {
var result = [], node = this[0];
if (!(node && node.childNodes)) return;
for (var i=0; i<node.childNodes.length; i++) {
var child = node.childNodes[i];
if (child.nodeType != 3) continue;
var t = $.trim(child.nodeValue);
if (t != '') result.push(t);
}
return at ? result[at-1] : result.join(' ');
}
var text = $("#attachmentContainer").ownText(); // all text children
var text = $("#attachmentContainer").ownText(1); // first text child only
$ ('# attachmentContainer'). Contents (). Filter (function () {return this.nodeType == 3;}). Text ()
Я думаю, что текст на самом деле является элементом text - дочерним элементом родительского div. Поэтому вам просто нужно запросить первый дочерний элемент. Хотя я не уверен. hth
Это даст вам только те элементы text
var $item = $("#attachmentContainer").clone();
$item.children().remove();
alert($item.text());
, которые клонируют объект, поэтому вам не нужно удалять фактические дочерние элементы. Затем вы можете удалить дочерние элементы, и это оставит innerText нужного элемента.
А вот небольшой удобный способ сделать это легко
jQuery.fn.trueText = function(obj){
var $item = $(obj).clone();
$item.children().remove();
return $item.text();
};
Теперь вы можете вызвать $ ("# attachmentContainer"). TrueText ()
Я думаю, что правильным правильным углом было бы поместить эту первую часть в
(если интервал не подходил ).
Я подумал, что могу заставить .filter поработать с этим, но не совсем понял ...
Скопировано из моего собственного ответа в похожей теме
Этот пример использует .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: ''
};