【问题标题】:jQuery - Find a word within a span and take that word and add the class to the span elementjQuery - 在跨度内查找一个单词并获取该单词并将类添加到跨度元素
【发布时间】:2013-07-24 12:34:37
【问题描述】:

我需要帮助。我的任务是从 span 元素中提取一个单词,然后将该单词分配给与 class 相同的 span 元素。

我已经写了这段代码:

jQuery(".product span").each(function() {
if(jQuery("this:contains('hat')")) {
    jQuery(this).addClass("hat");
} else if (jQuery("this:contains('sunglasses')")) {
    jQuery(this).addClass("sunglasses");
} else {
    jQuery(this).addClass("vest");
};  
});

然而,它并不能正常工作。它将类“帽子”分配给类“产品”中的所有跨度元素。

使用时:

jQuery(".product span").each(function() {
if(jQuery("this:contains('hat')")) {
    jQuery(this).addClass("hat");
    };
});

它工作并将“帽子”类分配给同一个跨度元素。如果我这样做,它也有效。但我不希望有这样的三行代码:

jQuery(".product span:contains('hat')").addClass("hat");

我希望它在一个很好的 if 和 else 语句中,或者在可能的情况下使用解析的其他方式。

其他注意事项:我没有使用 jQuery 的快捷方式,因为它会与我有趣的其他库发生冲突。我也知道 var $js = jQuery.noConflict();方法。

非常感谢 Sushanth、Kevin 和 Karl 的大力响应!我希望我可以将两个答案都作为解决方案

【问题讨论】:

  • 这不是你想要的吗?
  • 不,我想要一个很好的 if 和 else 语句。
  • :contains() 区分大小写。这可能是你的问题吗?
  • 另外,由于代码的结构方式,如果跨度包含帽子和太阳镜,则只会添加“帽子”类。

标签: jquery html contains addclass


【解决方案1】:
jQuery("this:contains('hat')")

应该是

jQuery(this).filter(":contains('hat')")

this 在引号内时与元素或上下文不对应。它应该不带引号使用

jQuery(this) 而不是jQuery("this")

JS

jQuery(".product span").each(function() {
   // cache the jQuery object
   var $this = jQuery(this);
   // check the length if it returns anything
   if($this.filter(":contains('hat')").length) {
       $this.addClass("hat");
   } else if ($this.filter(":contains('sunglasses')").length) {
       $this.addClass("sunglasses");
   } else {
      $this.addClass("vest");
   }  
});

Check Fiddle

【讨论】:

  • $this.filter(":contains('hat')") 总是正确的,你需要检查长度。
  • 感谢您的快速响应。当我添加额外的代码并仔细检查我是否输入正确时,此方法不起作用。它仍然为所有 .product 跨度分配了“电”类。
  • @patorikkuv2 它在小提琴中工作,你的代码与小提琴有什么不同?
  • 我的错,我错过了 .length 因为我看了小提琴链接:P。也谢谢。两种方法都是解决方案。你们真棒!谢谢凯文和苏珊斯
  • @patorikkuv2.. 很高兴能帮上忙 :)
【解决方案2】:

您的代码中有一些错误。

'this:contains("hat")' 将不起作用,它将搜索名为 this 的标记名并查看它是否包含“帽子”。

另外,如果要检查元素是否存在,则需要检查长度。 $('ANYThING') 永远是真的。

我建议这样做:

jQuery(".product span").each(function() {
    var $this = jQuery(this); //Caching this is optimal and less writing;
    if($this.is(":contains('hat')")) {
        jQuery(this).addClass("hat");
    } else if ($this.is(":contains('sunglasses')")) {
        $this.addClass("sunglasses");
    } else {
        $this.addClass("vest");
    };  
});

jQuery .is() 文档:http://api.jquery.com/is/

另外,:contains() 区分大小写,因此如果您的文字是“太阳镜”,它将不起作用。

【讨论】:

  • 非常感谢。这是我的问题的解决方案!我很接近。我从来不知道.is()。我学到了一些新东西。再次感谢卡尔!区分大小写将是我将来需要考虑的事情!
【解决方案3】:

你可以做到这一点,非常简单地使用 javascript String replace function

这是jsfiddle link 和下面的代码。

我还冒昧地重写了代码,使其更具可读性

// Create a closure, where $ is assigned to jQuery, so we dont have to write it
(function ($) {

  $(".product span").each(function() {
    findClass(this,"hat");
    findClass(this,"sunglasses");
  });

  function findClass(el, word) {
    var $el = $(el); //cache element

    $el.text().replace(word, function (match) {
      $el.addClass(match); //add the class to our element
      return match; //return the same word, so it's not replaced
    });
  }

})(window.jQuery);

replace 函数,有两个参数,第一个是字符串或我们正在匹配的RegExp,第二个是回调函数,它返回一个字符串来替换我们可以利用的匹配项

通过使用 RegExp,您还可以获得忽略大小写的好处。简单替换

"hat"/hat/i 就完成了! (/后面的i,表示忽略大小写)

希望对你有帮助

【讨论】:

  • 啊,这也是一个非常棒的解决方案。谢谢道国!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2011-11-11
  • 2015-11-07
相关资源
最近更新 更多