我有以下html:
<div>
<div id="t1">Text1</div>
<div id="t2">
Text2
<ul id="t3">
<li id="t4">Text3</li>
</ul>
</div>
</div>
我想为每个元素选择仅拥有文本。我尝试使用jQuery text
函数,但它返回选择中所有元素的组合文本内容:
t1 => Text1
t2 => Text2 Text3
t3 => Text3
t4 => Text3
我需要的是:
t1 => Text1
t2 => Text2
t3 =>
t4 => Text3
答案 0 :(得分:5)
$.fn.ownText = function() {
return this.eq(0).contents().filter(function() {
return this.nodeType === 3 // && $.trim(this.nodeValue).length;
}).map(function() {
return this.nodeValue;
}).get().join('');
}
var text = $('#t2').ownText();
稍微快一点的选择:
$.fn.ownText = function() {
var children = this.get(0).childNodes,
l = children.length,
a = [];
for (var i = 0; i < l; i++) {
if (children[i].nodeType === 3)
a.push(children[i].nodeValue);
}
return a.join('');
}
或者一种不同的方法,它接受粘合剂来连接节点的值和修剪结果的选项:
$.fn.ownText = function(o) {
var opt = $.extend({ glue: "", trim: false }, o),
children = this.get(0).childNodes,
l = children.length,
a = [];
for (var i = 0; i < l; i++) {
if (children[i].nodeType === 3) {
var val = children[i].nodeValue;
a.push(opt.trim ? $.trim(val) : val);
}
}
return a.join(opt.glue);
}
$('#t2').ownText({
glue: ',',
trim: true
});
答案 1 :(得分:2)
尝试
function getText(el) {
return $(el).contents().map(function () {
return this.nodeType == 3 && $.trim(this.nodeValue) ? $.trim(this.nodeValue) : undefined;
}).get().join('')
}
$('div *').each(function () {
console.log(this.id, getText(this))
})
演示:Fiddle
答案 2 :(得分:2)
更好的方法是:
$("selector").clone().children().remove().end().text();
在这里演示:
这不是优化版本,但你可以优化它:-)谢谢!
答案 3 :(得分:0)
试试这个
var n = new Array();
$("div div, li").each(function () {
n[$(this).attr('id')] = $(this).text()
})
console.log(n)