【问题标题】:Wildcards in HTML5 data attributesHTML5 数据属性中的通配符
【发布时间】:2012-10-24 17:05:11
【问题描述】:

是否可以使用属性名称中带有通配符的 jQuery 查找所有 DOM 元素?

考虑以下 HTML:

<input 
     id="val1" 
     type="text" 
     data-validate-required 
     data-validate-minlength="3" 
     data-validate-email />

我想要实现的是找到所有属性名称以data-validate-开头的dom节点

据我了解,here 所描述的通配符与属性的“值”有关。

这样做的原因是 - 我想找出应该验证哪些元素 - 然后找出起作用的验证参数(如 -email)。

谢谢

【问题讨论】:

  • 对于我在很多模块中看到的情况,人们倾向于添加另一个仅带有前缀的属性。 HTH。
  • @ambs 所以不可能在属性名称中使用通配符,人们已经使用“前缀-”作为选择器来克服这个问题?

标签: javascript jquery html sizzle


【解决方案1】:

您可以创建一个自定义伪类,例如将属性名称与正则表达式匹配:http://jsfiddle.net/hN6vx/

jQuery.expr.pseudos.attr = $.expr.createPseudo(function(arg) {
    var regexp = new RegExp(arg);
    return function(elem) {
        for(var i = 0; i < elem.attributes.length; i++) {
            var attr = elem.attributes[i];
            if(regexp.test(attr.name)) {
                return true;
            }
        }
        return false;
    };
});

用法:

$(":attr('^data-')")

【讨论】:

  • 我正要回答这个问题,但你抢先了。伪类可能非常有用。
  • 谢谢!我接受了这种方法。尽管我认为我毕竟必须重构我的代码以避免大型 DOM 的性能问题......
【解决方案2】:

因为 JQuery 严重依赖 XPath,而 XPath 不支持通配符属性选择 - 如果没有您希望避免的开销,这是不可能的。

总是有可能创建自己的选择器,只是为了保持干净:

//adds the :dataValidate selector
$.extend($.expr[':'],{
    dataValidate: function(obj){
        var i,dataAttrs=$(obj).data()
        for (i in dataAttrs) {
                if (i.substr(0,8)=='validate') return true;
        }
        return false;
    }
})

这将允许您在普通的 jQuery 选择器中使用 :dataValidate:

$(".element:dataValidate .etc")

工作 JSFiddle:http://jsfiddle.net/rZXZ3/

【讨论】:

  • 谢谢您-同样好的答案,如下所示!我选择了更“通用”的方法作为“已回答”。感谢您提供 xpath 参考 - 现在我更清楚了。
【解决方案3】:

你可以遍历属性:

$('.element').each(function() {
  $.each(this.attributes, function(i, att){
     if(att.name.indexOf('data-validate')==0){
         console.log(att.name);
     }
  });
});

【讨论】:

  • 感谢您的建议-我已经可以使用$('.sth').data() 获取所有“数据-”属性并迭代结果。但这对我来说似乎是一种开销。所以基本上答案是:jQuery 标准选择器和我的属性通配符想法是不可能的?
【解决方案4】:

你可以使用filter方法和dataset对象:

允许在读取和写入模式下访问元素上设置的所有自定义数据属性 (data-*)。它是 DOMString 的映射,每个自定义数据属性都有一个条目。

$("input").filter(function(){
    var state = false;
    for (i in this.dataset) 
        if (i.indexOf('validate') > -1) state = true;

    return state             
})​

http://jsfiddle.net/Pxpfa/

【讨论】:

  • 很好,但对于浏览器支持存在问题的任何人,请确保检查该链接上的兼容性表:例如对于 IE,它仅在版本 11 中(甚至还没有发布)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2012-01-27
  • 2011-07-30
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多