我可以把这个jquery选择器做得更好吗?

我可以把这个jquery选择器做得更好吗?,jquery,Jquery,我正在做一些字符串操作来构建jquery选择器。这很有意思,但我觉得有点难看。有没有更好的方法来做我下面正在做的事情 $(".hierarchical[data-dependson='"+id+"']") 编辑:为什么看起来很难看?如果可以的话,我想避免字符串操作。我见过使用.eq和.has的代码更好看,但我看不出在这里使用它们的方法。通过类以外的属性进行搜索的速度很慢,如果你想加快速度,你可以将id设为类,然后像这样选择它: $(".hierarchical."+id) 下面是一个jspe

我正在做一些字符串操作来构建jquery选择器。这很有意思,但我觉得有点难看。有没有更好的方法来做我下面正在做的事情

$(".hierarchical[data-dependson='"+id+"']")

编辑:为什么看起来很难看?如果可以的话,我想避免字符串操作。我见过使用
.eq
.has
的代码更好看,但我看不出在这里使用它们的方法。

通过
类以外的属性进行搜索的速度很慢,如果你想加快速度,你可以将
id
设为类,然后像这样选择它:

$(".hierarchical."+id)

下面是一个jsperf,它显示了两种选择器的速度差异:(剧透警告:按类选择要快两倍)。

您真正缺少的是一种很好的javascript格式设置方法,因此您尝试的操作不会被所有的引用淹没

我喜欢引用的格式化方法。在这里,它被复制为一个实用函数,因此您不必对内置字符串对象进行修补

var format = function(target) {
  var args = arguments;
  return target.replace(/{(\d+)}/g, function(match, number) {
    number = parseInt(number) + 1;
    return typeof args[number] != 'undefined'
      ? args[number]
      : match
    ;
  });
};
然后你可以做:

var selector = format(".hierarchical[data-dependson='{0}']", id);
// or with the monkey patch
selector = ".hierarchical[data-dependson='{0}']".format(id);
$(selector)
仍然有点混乱,但基本上是将值拼接到字符串中。我也不能保证这一切的表现。其他答案可能很好地说明这很慢,但这不是你的问题。

你可以过滤它:

$(".hierarchical").filter(function(){
    return $(this).data("dependson") === id;
});
这个怎么样:

$.fn.attrIs = function(attr, value) { 
    return $(this).filter(function(index){
        return $(this).attr(attr) == value;
    });  
}
然后:

给定jQuery对象集合,此attrIs(attr,value)函数将只将集合减少为attr==value的元素

下面是一个例子:


您可能可以修改此方法以更好地满足您自己的目的。

值得注意的是,为了提高效率,您应该尽可能将标记名添加到类选择器中。我认为这看起来非常好。(我想不出改进的方法)为什么你觉得它很难看?@JohnHartsock-为什么添加标签名会有帮助?如果内部实现能够使用
getElementsByClassName()
querySelectorAll()
,这将需要额外的工作。似乎只有当这两种方法中的任何一种都不存在(例如,非常旧的浏览器)时,它才可能有帮助,否则会使速度减慢一点。@antisanity-为什么要优化IE8及以下版本的选择器,使现代浏览器变慢?对我来说似乎是倒退。只要旧浏览器继续工作,就可以针对大多数人使用的内容进行优化。我认为没有理由将标记类型添加到大多数选择器中,除非您合法地需要按标记类型进行额外筛选。
该外部函数中的此
已经是jQuery对象,因此无需重新包装它。在内部函数中,还可以
返回$(this).attr(attr)=value我认为最后的答案是“你不能用vanilla jquery避免字符串concat”。但是我喜欢这个助手方法,我会将它添加到我的库中,并在将来使用它
$(".hierarchical").attrIs("data-dependson", id);