正在尝试使用jquery选择器查找跨度旁边的文本

Trying to find text next to a span using jquery selector

本文关键字:文本 查找 选择器 jquery      更新时间:2023-09-26

我的网页中有以下代码。我需要找到出现在类为pn的跨度之后的产品名称。当我运行下面的代码时,我从getFirstProduct方法中得到一个空字符串,也从getSecondProduct方法中得到了一个空串。然而,如果我使用以下表达式,那么我会得到正确的产品名称:$("#p0 span.pn")[0].nextSibling.data$("#p1 span.pn")[0].nextSibling.data,但这是使用JavaScript的,我想知道是否有一个纯jquery解决方案。

这个问题的演示在这个URL:演示代码

问题:在这两种方法中,正确的选择器应该是什么,以便它们分别返回Product 0Product 1

查找产品名称的代码

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id='p0'>
     <div>some content</div>
     <div></div>
     <div><span class='t pn'>Product : </span>Product 0</div>
     <div></div>
     <div>some content</div>
     <div>some content</div>
    </div>
    <div id='p1'>
     <div>some content</div>
     <div></div>
     <div><span class='t pn'>Product : </span>Product 1</div>
     <div></div>
     <div>some content</div>
     <div>some content</div>
</div>
<button type="button" onclick="var x =  getFirstProduct(); alert(x);">Get First Product</button>
<button type="button" onclick="var x =  getSecondProduct(); alert(x);">Get Second Product</button>
<script>
function getFirstProduct() {
    return $("#p0  span.pn").next().text();
}
function getSecondProduct() {
   return $("#p1  span.pn").next().text();
}
</script>

更新1

根据给出的答案和重复标记为的帖子,我想出了以下代码,它非常有效。解决方案的演示代码位于以下URL:解决方案代码演示。

其思想是获取类为pn的span的父div,然后只获取其下的所有类型的节点,即只从父div向下一级,这是通过contents()方法完成的(而不是children()方法,因为子节点将忽略文本节点)。这将给我们两个元素-span和span元素后面的文本,因为这两个元素是父div的唯一immediate子元素。文本节点将是我们正在寻找的产品的名称。

在jquery中查找文本节点时,似乎总是需要contents()方法

有效的代码

<div id='p0'>
     <div>some content</div>
     <div></div>
     <div><span class='t pn'>Product : </span>Product 0</div>
     <div></div>
     <div>some content</div>
     <div>some content</div>
    </div>
    <div id='p1'>
     <div>some content</div>
     <div></div>
     <div><span class='t pn'>Product : </span>Product 1</div>
     <div></div>
     <div>some content</div>
     <div>some content</div>
</div>
<button type="button" onclick="var x =  getFirstProduct(); alert(x);">Get First Product</button>
<button type="button" onclick="var x =  getSecondProduct(); alert(x);">Get Second Product</button>
<script>
function getFirstProduct() {
 return $("#p0  span.pn").parent().contents().filter(function(index) { return this.nodeType === 3 ;}).text();
}
function getSecondProduct() {
   return $("#p1  span.pn").parent().contents().filter(function(index) { return this.nodeType === 3 ;}).text();
}
</script>

$(function() {
  
  $('#out0').on('click', function(e) {
    
    getFirstProduct();
  });
  $('#out1').click(function(e) {
    
    getSecondProduct();
  });
  function getFirstProduct() {
    $("#p0 span.pn").text('');
    var txt0 = $("#p0 span.pn").parent().text();
    $('#out0').text(txt0);
  }
  function getSecondProduct() {
    $('#p1 span.pn').text('');
    var txt1 = $("#p1 span.pn").parent().text();
    $('#out1').text(txt1);
  }
});
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id='p0'>
  <div>some content</div>
  <div></div>
  <div><span class='t pn'>Product : </span>Product 0</div>
  <div></div>
  <div>some content</div>
  <div>some content</div>
</div>
<div id='p1'>
  <div>some content</div>
  <div></div>
  <div><span class='t pn'>Product : </span>Product 1</div>
  <div></div>
  <div>some content</div>
  <div>some content</div>
</div>
<button id="out0">Get First Product</button>
<button id="out1">Get Second Product</button>