jQuery:从 .text() 中排除孩子

IT技术 javascript jquery
2021-01-29 02:04:15

鉴于此 HTML:

<a href="#" class="artist">Soulive<span class="create-play">Play</span></a>

我想要得到的文本内容a(这是this在我的函数的上下文中),而不的文本内容span,所以我留下了:

Soulive

如果我做:

$(this).text();

我得到:

SoulivePlay

如何排除 的文本内容span

4个回答

一个微插件:

$.fn.ignore = function(sel){
  return this.clone().find(sel||">*").remove().end();
};

...有这个HTML:

<div id="test"><b>Hello</b><span> World</span>!!!</div>

将导致:

var text = $('#test').ignore("span").text(); // "Hello!!!"
var html = $('#test').ignore("span").html(); // "<b>Hello</b>!!!"

如果你想要更快,你只需要排除直接的孩子......使用.children(而不是.find(

@Mrchief我与 John Resig 进行了一次简短的电话交谈,他为这个可怕的错误道歉,并Promise将在下一版本的;) 中修复它,开玩笑,编辑了我的答案!(并感谢您的通知!)
2021-03-22 02:04:15
完美的!我有类似的东西,:not但我错过了.contents(),这是关键。谢谢!
2021-03-23 02:04:15
现在是 2020 年,JQuery 还没有添加ignore()?
2021-03-31 02:04:15
contents不接受较新的 jQuery 的任何参数:api.jquery.com/contentsjQuery 1.10.1 的小提琴失败
2021-04-10 02:04:15
很棒的创新想法,非常感谢在一分钟内解决更大的问题。
2021-04-14 02:04:15

http://jsfiddle.net/r8kNL/

$(this).contents().filter(function() {
  return this.nodeType == 3;
}).text()
$(this).clone().find('span').remove().end().text();

否则,使用不同的方法,如果您确定span元素总是在末尾包含“播放”一词,只需使用 areplace()substring()函数,例如

var text = $(this).text();
text = text.substring(0, text.length-4);

后一个例子肯定是一种过于局部化且不是防弹方法,但我提到只是为了从不同的角度提出一个解决方案

没有@Roko,children()会比更有效find()children()唯一穿越1级下来,因为我们反正取出孩子,这也将随之删除所有较低的水平。
2021-03-15 02:04:15
你可以使用"*"这样它就不会依赖于我认为的这个特定结构
2021-03-30 02:04:15
或者,您可以替换find('span')children().
2021-04-05 02:04:15
$('li.yourclass').find('span').remove().end().text(); 对我来说很好。塔克斯
2021-04-12 02:04:15
$( this.childNodes ).map( function(){
    return this.nodeType === 3 && this.nodeValue || "";
}).get().join("");