【问题标题】:Is there a way to search for attributes that start with a certain string in HTML有没有办法在 HTML 中搜索以某个字符串开头的属性
【发布时间】:2012-09-10 09:07:33
【问题描述】:

有没有办法找到所有具有以特定字符串开头的属性的元素?

我正在使用 Mootools 框架,这是我尝试过的:

$$('*[data-media-*]');

但它只是输出页面中的所有元素。

那么有没有办法获取页面中所有属性以data-media-开头的元素?

【问题讨论】:

  • 你能发布一些示例 html 吗?
  • 看起来你必须添加一些其他属性来联合元素。
  • 一个兼容的 CSS 选择器实现会输出 no elements 因为那是无效的...
  • @Starx:这是一个 jQuery 问题,并且询问的是属性选择器以外的选择器中的通配符,所以它不是一个好的重复。

标签: javascript html mootools css-selectors


【解决方案1】:

您可以通过迭代容器中每个元素的属性并查看属性名称是否与您要查找的正则表达式匹配来近似这样的事情:

例如,in this jsFiddle, I am looking for li elements with the data-media-tv and data-media-dvd properties

您可以定制正则表达式以仅返回您想看到的内容。只想查看具有 data-media-* 的元素(如您的问题)? Here you go.


请记住,这不是完全可扩展的。因为我们正在遍历页面上的每一个元素,并检查每一个属性(但如果找到则提前返回),这对于大页面来说可能而且可能会很慢。

仅限于您​​想要搜索的容器,或者仅限于您想要迭代的元素!如果您针对document.body 运行此程序,它将遍历页面中的每个元素,如果您的房子因此被烧毁,我将不承担任何责任。 :)


这里是函数化的:

function attrMatch(elements, regexp) {
    // Iterate through all passed-in elements, return matches
    var matches = elements.filter(function(li) {
    var numAttr = li.attributes.length;
    for(x=0;x<numAttr;x++) {
        var attr = li.attributes[x];
        return attr['name'].test(regexp);
    }
    });

    return matches;
};

elements 中,只传入您要检查的元素,可能通过$$ 选择。如果要检查容器元素中的所有元素,请在上述element 的每个实例中将elements 替换为containercontainer.getChildren()

【讨论】:

    【解决方案2】:

    试试this jsfiddle 只需知道属性data-media-* 的(通用)索引/位置并相应地在代码中使用。

    【讨论】:

    • 试试 jsFiddle?是的,这很有帮助。
    【解决方案3】:

    您可以过滤已经必须返回具有匹配 data-* 属性的元素。

    Elements.implement({
        filterData: function(substring){
            return this.filter(function(element){
                var attribs = element.attributes,
                    len,
                    ii = 0;
    
                for (len = attribs.length; ii < len; ++ii) {
                    if (attribs[ii].name.indexOf('data-') === 0 && attribs[ii].name.indexOf(substring) !== -1) {
                        return true;
                    }
                }
            });
    
        }
    });
    
    console.log($$("div").filterData('foo'));
    console.log($$("div").filterData('bar'));
    console.log($$("div").filterData('oba'));
    

    在行动:http://jsfiddle.net/dimitar/pgZDw/

    缺点:您已经需要将它传递给有意义的元素集合,例如。 div.foo 或 #someid *

    更优雅的解决方案是将:data() 伪添加到 Slick:

    (function(){
        // cache reusable string 
        var data = 'data',
            hyphen = '-',
            // set the fallback via XMLSerializer, if no outerHTML (eg. FF 2 - 10)
            XS = this.XMLSerializer && new XMLSerializer();
    
        Slick.definePseudo(data, function(value){
            return (this.outerHTML || XS.serializeToString(this)).test([data, value].join(hyphen));
        });
    }());
    
    
    console.log($$("div:data(foo)"));
    console.log($$(":data(media-)"));
    

    更新示例:http://jsfiddle.net/dimitar/pgZDw/3/

    【讨论】:

    • 我想我可以将它添加到 Slick。无论如何,看看 Slick 的代码对我来说不是一个坏主意。
    • 我也可以这样做:$$('*')...但这有点开销...我担心的一件事是性能...
    • 你的问题是需要通配符。在元素中查找特定的数据属性很容易......当您使用通配符时,您需要遍历所有属性并且这很昂贵 - 就像您说的,如果您将 * 作为选择器传递会发生什么?你也可以扫描outerHTML,可能会更快...
    • 通过自定义伪示例查看更新的响应。粗略并检查跨浏览器的 outerHTML 的可靠性,但这将是最快的。缺点:只寻找 data-string* 而不是 data-*string 但你可以调整它。
    【解决方案4】:
    $$('div[attrName="attrnameValue"]').each(function() {
        // `this` is the div
    });
    

    【讨论】:

    • 这不是 OP 要求的。
    猜你喜欢
    • 2022-11-13
    • 2011-10-04
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多