4

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

满足以下条件的Level 1 Selectors API中定义的querySelector方法的标识选择器是什么?Element

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";
    }
}
4

1 回答 1

3

没有一个。


John Resig在他的博客主题对 querySelectorAll 的思考中提供了一个讨论链接

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

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;
    }
}

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

于 2011-09-16T20:45:54.267 回答