用jQuery选择元素的一部分?

时间:2015-09-17 13:22:53

标签: javascript jquery jquery-selectors

我有以下HTML:

<div id="foo">
    <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        1
    </span>
    <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        2
    </span>
    <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        Hello
    </span>
</div> 

我想使用jQuery在JS中只获取以下12hello(这意味着没有<a>标记或&nbsp;)。请注意我不想影响DOM本身。我只想检索对象(如数组)中的文本。

这是我到目前为止所做的:

$('#foo span');

但是我似乎无法删除“a”标签。

以下似乎也不起作用:

$('#foo span').remove('a');

我也知道.remove()会影响自己的DOM,而不只是检索文本。

7 个答案:

答案 0 :(得分:3)

解决方案通过循环遍历每个子节点并克隆它来进行操作来创建数组,因此dom保持不变

var values = $('#foo').children().map(function () {
    var $clone = $(this).clone();
    $clone.children().remove();
    return $.trim($clone.text());    
}).get();

console.log(values) /// ["1","2","Hello"]

DEMO

答案 1 :(得分:1)

这段代码将为您获得该值:

$('#foo span').each(function(){
    console.log($.trim($(this).html().substring($(this).html().lastIndexOf("&nbsp;") + 6)));
});

工作jsFiddle: http://jsfiddle.net/mrwqs2nb/1/

打开控制台,您将看到:

1
2
Hello

答案 2 :(得分:0)

尝试使用RegEx来匹配您想要的内容

$('#foo span').each(function () {
  alert($(this).html().match(/[0-9]/));
});

JSFIDDLE

答案 3 :(得分:0)

由于您的问题不详细,根据您的要求,可以按照以下方式完成

   var res=[];
    $('#foo span').map(function(i){
    var htm=$(this).text();
    var htm_d=$(this).find('a').html();
    htm=$.trim(htm.split("").reverse().join(""));
    htm_d=$.trim(htm_d.split("").reverse().join(""));
    res[i] = htm.substring(0,htm_d.length); 
    } );
    alert(res);

LIVE http://jsfiddle.net/mailmerohit5/5bvavx0p/

答案 4 :(得分:0)

不确定这个游戏的规则是什么,但如果可以假设你想要的是&nbsp;的右边那么这应该这样做:

$('#foo span').map(function() {
    //Split at the space.
    var parts = $(this).html().split('&nbsp;');
    //Remove the first element from the list.
    parts.shift();
    //Join and return.
    return parts.join('');
}).get();

答案 5 :(得分:0)

尝试将选择器$("foo span")$.map()String.prototype.match()RegExp [0-9]+|[a-z]+[^\s+|\n+|" + el.querySelector(".no-want").textContent + "]", "ig"匹配,以匹配数字或字符a-z不区分大小写,否定空格字符,或换行符或".no-want"元素.textContent位于父index元素的span

&#13;
&#13;
var res = $.map($("#foo span"), function(el, index) {
            return el.textContent.match(new RegExp("[0-9]+|[a-z]+[^\s+|\n+|" 
                   + el.querySelector(".no-want").textContent.trim() + "]", "ig"))
          });
console.log(res)
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="foo">
  <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        1
    </span>
  <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        2
    </span>
  <span>
        <a href="#" class="no-want">X</a>
        &nbsp;
        Hello
    </span>
</div>
&#13;
&#13;
&#13;

答案 6 :(得分:0)

使用jquery&#39; s contents - api页面有一个关于如何在忽略其他元素的同时额外添加文本节点的示例。

var result = $("#foo span")
             .contents()
             .filter(function() {
                 // #text nodes
                 return this.nodeType === 3;
             }).map(function() {
                 // get the value and trim it (also removes &nbsp)
                 return $(this).text().trim();
             }).filter(function() {
                 // remove blanks
                 return this != "";
             }).toArray();

$(&#34;#结果&#34)文本(result.join());

工作fiddle