【问题标题】:jQuery selector where text = some valuejQuery选择器,其中文本=某个值
【发布时间】:2009-05-01 21:58:47
【问题描述】:

我有一个对象(在本例中是来自 js-kit 的评级对象),如果评级值为“未评级”,我想让它不可见。我无法获得正确的 jQuery 选择器来执行此操作。

尽管下面的代码看起来应该可以工作,但实际上并没有。

$(".js-rating-labelText:contains('unrated')").css("visibility", "hidden");  

.js-rating-labelText 是在文本上设置的类。

【问题讨论】:

  • 你能粘贴你运行它的 HTML 吗?
  • 您可以使用 innerhtml 或 .html 对内容运行正则表达式。这将是一种类似的方式来查找它是否包含某个字符串。
  • 它有点复杂(至少对我来说),因为评级 div 的内容是由 js-kit javascript 函数填充的,因此在设计时不可用。 div 为空(开始),如下所示:
  • 奇怪的是,更改 jquery 函数以添加第二个括号——这看起来是错误的,因为它没有匹配的左括号... $("#ratingDiv:contains('unrated'))") .css("可见性", "隐藏"); ...导致列表中的第一项呈现为不可见。
  • 这里有更多代码:
    和脚本...

标签: jquery jquery-selectors


【解决方案1】:

您可以创建自己的选择器方法

例如,如果您希望能够执行以下操作:

$('.js-rating-label:hasText(unrated)');

你可以定义hasText方法如下

$.expr[':']['hasText'] = function(node, index, props){
  return node.innerText.contains(props[3]);
}

props[3] 包含 ':hasText' 之后括号内的文本。

【讨论】:

  • 这是一个很好的答案。我不得不将返回函数更改为:return node.innerText.indexOf(props[3]) > -1;
【解决方案2】:

还有其他方法可以根据文本内容选择元素吗?

试试这个:

$('.js-rating-labelText').filter(function(){
  return (/unrated/i).test($(this).text())
}).css('visibility', 'hidden');

【讨论】:

  • 是的!我根据父类设置值并使用 .hide() 方法,但这对我有用。太感谢了! $('.js-kit-rating').filter(function() { return (/Unrated/i).test($(this).text()) }).hide();
【解决方案3】:

也许问题出在函数的:contains('Unrated') 部分。将文本更改为任何随机值都会产生相同的结果:

$("#ratingDiv:contains('somerandomtext')").hide();

【讨论】:

  • 还有其他方法可以根据文本内容选择元素吗?
  • 应该是$("#ratingDiv:contains('somerandomtext')").hide();,里面没有右括号吗?
【解决方案4】:

@tgmdbm 的出色答案略有不同。唯一的区别是它只选择具有与hasText() 参数完全匹配的单个子文本节点的节点。而.innerText 返回所有后代文本节点的串联。

  if( ! $.expr[':']['hasText'] ) {
     $.expr[':']['hasText'] = function( node, index, props ) {
       var retVal = false;
       // Verify single text child node with matching text
       if( node.nodeType == 1 && node.childNodes.length == 1 ) {
         var childNode = node.childNodes[0];
         retVal = childNode.nodeType == 3 && childNode.nodeValue === props[3];
       }
       return retVal;
     };
  }

【讨论】:

    【解决方案5】:

    确保您的代码在 js-kit 函数填充文本之后运行,而不是在它之前运行。

    【讨论】:

    • 它确实遵循 js-kit 脚本调用。谢谢。
    【解决方案6】:

    根据您提供的 HTML,我看不出您要测试的“未分级”文本来自何处。

    但是,如果这是该 div 中文本的全部,则直接对其进行测试。

    if ($('.js-rating-labelText').text() == 'unrated'){
      $(this).hide();
    }
    

    【讨论】:

      【解决方案7】:

      您也可以考虑使用 hide() / show() 方法。

      $(".js-rating-labelText:contains('unrated')").hide()
      

      【讨论】:

      • $(".js-rating-labelText:contains('Unrated'))").hide();使已评级和未评级的文本都消失。
      【解决方案8】:

      解释该主题的最佳方式是提供示例和参考链接:-

      示例:- 以下 jQuery 选择器语法从一组已选择(匹配)的 HTML 元素中选择第一个或第 n 个元素。

      $("selector:contains(searchText)")
      

      HTML:-

      <table>
      <tr><td>John Smith</td><td>Marketing</td></tr>
      <tr><td>Jane Smith</td><td>Sales</td></tr>
      <tr><td>Mike Jordon</td><td>Technology</td></tr>
      <tr><td>Mary Jones</td><td>Customer Support</td></tr>
      </table>
      Search: <input id="txtSearch" type="text">
      <input id="btnTestIt" type="button" value="Test It">
      <input id="btnReset" type="reset" value="Reset">
      

      Jquery:-

      $(document).ready( function(){
          $("#btnTestIt").click( function(){
              var searchText = $("#txtSearch").val();
              $("td:contains('" + searchText + "')").css("background-color", "yellow");
          });
          $("#btnReset").click( function(){
              $("td").css("background-color", "white");
          });
      });
      

      【讨论】:

        【解决方案9】:

        以下是来自 javascript 函数的一些 html:

        <div class="js-kit-rating" id="ratingDiv" style="width: 86px; visibility: hidden;" jk$initialized="true" path="/business/blogger-com" permalink="/businessblogger-com" freeze="yes" starcolor="Golden">
          <table class="js-ratings-tableWrapper" border="0" cellSpacing="0" cellPadding="0">
            <tbody>
              <tr>
                <td>
                  <div class="js-ratingWrapper" style="width: 80px;">
                  <div style="float: left; cssfloat: left;">
                      <div style="width: 80px; height: 15px;">
        <div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png">
          <img style="display: none;" src="//js-kit.com/images/stars/golden.png" complete="complete"/>
        <div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png"/>
        <div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/golden.png"/>
        <div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/gray.png">
          <img style="display: none;" src="//js-kit.com/images/stars/gray.png" complete="complete"/>
        <div class=" js-kit-objIcon" style="width: 16px; float: left; height: 15px; cssfloat: left;" imageURL="//js-kit.com/images/stars/gray.png"/>
        <div class=" js-rating-labelText">
        

        【讨论】:

        • 从您到目前为止告诉我们的情况来看,我认为没有任何理由不应该工作。如果您愿意的话,将问题复制到公开可用的主机(例如 jsbin.com)上会非常有帮助。
        猜你喜欢
        • 2012-07-06
        • 2011-04-26
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 2013-07-04
        • 2011-03-04
        相关资源
        最近更新 更多