复杂的jquery选择器,用于在string.split中查找标记

时间:2011-06-01 21:43:57

标签: javascript jquery jquery-selectors

我有一个html表,其中一列包含带有逗号分隔数据的<span>。我想提出一个返回所有行的jQuery选择器(<tr> s更可取,但<span> s现在可用),其中一个以逗号分隔的标记{{1} span标记中的}与提供的字符串匹配。

我从以下内容开始:

<span>

这将使我在包含单词'duck'的特定列中的所有跨度。但是,它也可以匹配$('td.col_8 span:contains("duck")') 。由于'duck'在该范围内不是唯一的标记,我不希望包含在匹配中。

有没有办法缩小我的结果集,所以我只包含与列分隔列表中的特定标记完全匹配的结果?

(我正在使用jQuery 1.2.3)

3 个答案:

答案 0 :(得分:3)

这就是jQuery表达式的美妙之处。

您可以添加自己的自定义选择器。在这种情况下,我将把它称为标签

jQuery.expr[":"].tag = function(elem, index, match, nodeList) {
    var tags = $(elem).text().replace(/(?:\ +)?,(?:\ +)?/g, ",").split(",");
    return tags.indexOf(match[3]) > -1;
}

这将针对此选择器检查每个先前匹配的元素。它会使分离变平(所以像“firstTag,onotherer,badly,spaced,tag”这样的东西会起作用)。 jQuery已经负责解析选择器并将其作为匹配传递。匹配[3]是你感兴趣的。通过以下用法匹配[3]将是'duck'

$('td.col_8 span:tag("duck")')

返回行将根据列表中的标记返回true。

答案 1 :(得分:2)

我认为应该这样做

$('td.col_8 span').filter(function() { 
    return $(this).text().match(/^duck$/); 
});

现在您只需要定义所需的正则表达式,或者实现字符串拆分和数组搜索以返回布尔值,以指示是否应包含<span>

答案 2 :(得分:0)

离开Russ Cam's answer,这就是我想出的:

$('td.col_8 span').filter(function() { 
  return $.inArray('quiet',$(this).html().split(', ')) !== -1;
});

当然,这假设列表将始终与,[space]分隔,但它应该适用于我的直接用例。