Как получить текст отделения, которое не является частью никакого другого контейнера в JQuery?

Это должно быть очень легко. Данный ниже 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# в другой промежуток и получить доступ к нему непосредственно, но я был просто заинтригован о том, как сделать это. Любая справка очень ценится.

14
задан Klaster_1 11 January 2014 в 04:10
поделиться

6 ответов

Поскольку ваш текст является первым дочерним узлом для

:

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
11
ответ дан 1 December 2019 в 13:08
поделиться

$ ('# attachmentContainer'). Contents (). Filter (function () {return this.nodeType == 3;}). Text ()

2
ответ дан 1 December 2019 в 13:08
поделиться

Я думаю, что текст на самом деле является элементом text - дочерним элементом родительского div. Поэтому вам просто нужно запросить первый дочерний элемент. Хотя я не уверен. hth

0
ответ дан 1 December 2019 в 13:08
поделиться

Это даст вам только те элементы 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 ()

6
ответ дан 1 December 2019 в 13:08
поделиться

Я думаю, что правильным правильным углом было бы поместить эту первую часть в

(если интервал не подходил ).

Я подумал, что могу заставить .filter поработать с этим, но не совсем понял ...

0
ответ дан 1 December 2019 в 13:08
поделиться

Скопировано из моего собственного ответа в похожей теме

Этот пример использует .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: ''
};
1
ответ дан 1 December 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: