Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有用于匹配属性名子字符串的现有或即将推出的CSS3选择器?_Javascript_Css_Dom_Css Selectors - Fatal编程技术网

Javascript 是否有用于匹配属性名子字符串的现有或即将推出的CSS3选择器?

Javascript 是否有用于匹配属性名子字符串的现有或即将推出的CSS3选择器?,javascript,css,dom,css-selectors,Javascript,Css,Dom,Css Selectors,您可以执行[foo^=“bar”]来匹配具有属性foo的节点,其值以bar开头 是否有方法匹配以特定字符串开头的属性名称的节点?这种情况的用例是使用data-*属性匹配所有节点 编辑:我尝试这样做的原因是为了避免在所有节点上迭代寻找这些属性(出于性能原因)。我将使用querySelectorAll及其Sizzle polyfill来为旧浏览器提供支持。一种方法是使用.filter()方法: $('element').filter(function() { return $.grep(th

您可以执行
[foo^=“bar”]
来匹配具有属性
foo
的节点,其值以
bar
开头

是否有方法匹配以特定字符串开头的属性名称的节点?这种情况的用例是使用
data-*
属性匹配所有节点


编辑:我尝试这样做的原因是为了避免在所有节点上迭代寻找这些属性(出于性能原因)。我将使用
querySelectorAll
及其Sizzle polyfill来为旧浏览器提供支持。

一种方法是使用
.filter()
方法:

$('element').filter(function() {
    return $.grep(this.attributes, function(value) {
       return value.nodeName.indexOf('data') === 0;
    }).length;
});

这可能有点过分,但您可以编写一个自定义选择器:

$.expr[':'].attr = function (elem, index, regex_str) {
    var regex = new RegExp(regex_str[3]);

    for (var i = 0; i < elem.attributes.length; i++) {
        if (elem.attributes[i].name.match(regex)) {
            return true;
        }
    }

    return false;
};

它有点类似于常规的属性选择器语法。

jQuery的选择器语法类似于CSS,但与CSS不同。您正在尝试编写哪种类型的选择器?这两个库都不支持不精确的属性名称匹配,但如果您正在编写JavaScript,则有一些变通方法。CSS没有办法,但HTML5中有一个API可以使用dataset@MattBall获取数据属性,编辑了问题。@jli:没有选择器
getElementsByTagName
带有过滤功能将是您可以做的最快的事情。没有本机选择器可以做这件事,因此您会发现大多数不引人注目的javascript库都会查找特定的数据属性。例如,
然后您可以编写一个无结构的javascript库,查找任何具有
数据确认
属性的内容,然后在其中附加一个事件处理程序,显示
数据确认消息
,如果单击确认消息上的取消,则取消事件。
.lastIndexOf('data',0)===0
对于极端的千秒差异也是如此。@Fabriciomatté:不会有太大的差异,
$。一旦找到第一个
数据-
属性,grep
就不会爆发。@Blender我知道,我只是说这个操作会比
indexOf
快一点。以下是我最初没有明确说明的细节,但我使用这样的选择器的原因是为了避免迭代所有节点/属性(出于性能原因)。不幸的是,我认为,任何非本机解决方案都不起作用。是的,这有点过分,但仍然是一个有趣的解决方案
$('div:attr(^data)') // starts with
$('div:attr(foo$)')  // ends with