【问题标题】:Identity selector for element.querySelector?element.querySelector 的身份选择器?
【发布时间】:2011-11-18 23:52:26
【问题描述】:

我正在编写一个应用程序,其中我将元素的相对引用存储为适合传递给 querySelector 的 CSS 选择器。当我想存储对“基本”元素的相对引用时,我想要一个返回相同元素的选择器。

Level 1 Selectors API 中定义的ElementquerySelector 方法的标识选择器满足以下条件吗?

var identitySelector = "<this is the selector I want to know>"

for (int i = 0; i < document.all.length; i++) {
    var elem = document.all[i];
    if (elem !== elem.querySelector(identitySelector)) {
        throw identitySelector + " is not the identity selector";
    }
}

更新:

由于此选择器不可用,我将使用一个函数包装对 querySelector 的调用,如果选择器等于伪类 :root,则该函数返回上下文元素。

var identitySelector = ":root"

var querySelectorProxy = function(elem, selector) {
    return selector === ':root' ? elem: elem.querySelector(identitySelector);
}

for (int i = 0; i < document.all.length; i++) {
    var elem = document.all[i];
    if (elem !== querySelectorProxy(elem, selector)) {
        throw identitySelector + " is not the identity selector";
    }
}

【问题讨论】:

    标签: javascript dom css-selectors selectors-api


    【解决方案1】:

    没有。


    John Resig 在他的博客主题Thoughts on querySelectorAll 中提供了一个link to a discussion

    他的缺点是,虽然您可以从任何元素节点进行搜索,但您传递的选择器会考虑整个文档。 (我个人认为这是正确的方法。)因此,他希望有一个像你描述的那样的身份选择器。

    jQuery (Sizzle) 通过使用元素的 ID(如果不可用,则分配一个临时 ID)并重构选择器以添加该 ID 选择器,从而使用了一些技巧。

    类似这样的:

    var identitySelector = "<this is the selector I want to know>"
    
    for (int i = 0; i < document.all.length; i++) {
        var elem = document.all[i],
            needs_id = false;
        if( !elem.id ) {
            needs_id = true;
            elem.id = '___some___obscure___value___';
        }
        if (elem !== elem.querySelector( '#' + elem.id )) {
            throw identitySelector + " is not the identity selector";
        }
        if( needs_id ) {
            elem.id = null;
        }
    }
    

    ...虽然我不知道这会在这里完成什么。

    【讨论】:

    • 感谢您的快速回答。作为我的应用程序中的一种解决方法,我将保留一个 null 或缺失的选择器,转换为建议的 ":root" 伪元素选择器,并包装我对 querySelector 的调用以处理该输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2014-07-13
    • 2016-06-03
    • 2015-03-06
    相关资源
    最近更新 更多