在各个类名上使用'starts with'选择器

DA.*_*DA. 145 jquery

如果我有以下内容:

<div class="apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>
Run Code Online (Sandbox Code Playgroud)

我可以使用以下选择器来查找前两个DIV:

$("div[class^='apple-']")
Run Code Online (Sandbox Code Playgroud)

但是,如果我有这个:

<div class="some-other-class apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>
Run Code Online (Sandbox Code Playgroud)

它只会找到第二个DIV,因为第一个div的类以字符串形式返回(我认为)并且实际上并不以'apple-'开头,而是'some-'

一种方法是不使用开头,而是包含:

$("div[class*='apple-']")
Run Code Online (Sandbox Code Playgroud)

问题是它还会在我的例子中选择第三个DIV.

问题:通过jQuery,在单个类名上使用谓词选择器的正确方法是什么,而不是将整个类属性用作字符串?它只是抓住CLASS,然后将它分成一个数组,然后用正则表达式遍历每个单独的一个?或者是否有更优雅/更简洁的解决方案?

Jos*_*ola 283

以"apple-"开头的类以及包含"apple-"的类

$("div[class^='apple-'],div[class*=' apple-']")
Run Code Online (Sandbox Code Playgroud)

  • +1.虽然我同意@parrots的建议,即"apple"应该是它自己的类,因为它显然重叠了多个div,但却是一个独特的实体.但这确实解决了这个问题. (5认同)

Par*_*ots 12

我建议把"苹果"作为自己的班级.如果可以的话,你应该避免使用开始/结束,因为能够选择使用div.apple会更快.这是更优雅的解决方案.如果它使任务更简单/更快,不要害怕将事物拆分成单独的类.

  • http://www.componenthouse.com/article-19:如果您查看逐个类的部分,使用常规点语法通常比将类视为属性快一点.添加子字符串搜索(以及他必须做的额外工作来打破具有多个类名的元素),它将节省相当多的性能. (2认同)

Mex*_*der 5

这是用于前缀的

$("div[class^='apple-']")

这是为了开始,所以你不需要在那里有' - '字符

$("div[class|='apple']")

你可以在这里找到一堆其他很酷的jQuery选择器 https://api.jquery.com/category/selectors/


equ*_*ion 5

虽然这里的最佳答案是针对提问者特定情况的解决方法,但如果您正在寻找一种解决方案,以便在单个类名上实际使用'starts with':

您可以使用此自定义jQuery选择器,我称之为:acp()"A类前缀".代码位于这篇文章的底部.

var test = $('div:acp("starting_text")');
Run Code Online (Sandbox Code Playgroud)

这将选择<div>具有至少一个以给定字符串开头的类名的任何和所有元素(在此示例中为"starting_text"),无论该类是在类属性字符串的开头还是其他位置.

<div id="1" class="apple orange lemon" />
<div id="2" class="orange applelemon banana" />
<div id="3" class="orange lemon apple" />
<div id="4" class="lemon orangeapple" />
<div id="5" class="lemon orange" />

var startsWithapp = $('div:acp("app")');
Run Code Online (Sandbox Code Playgroud)

这将返回元素1,2和3,但不返回 4或5.

这是:acp自定义选择器的声明,您可以放在任何地方:

$(function(){
    $.expr[":"].acp = function(elem, index, m){
          var regString = '\\b' + m[3];
          var reg = new RegExp(regString, "g");
          return elem.className.match(reg);
    }
});
Run Code Online (Sandbox Code Playgroud)

我做了这个因为我做了很多GreaseMonkey黑客攻击我没有后端控制的网站,所以我经常需要找到带有动态后缀的类名的元素.这非常有用.