Выбор идентификатора для element.querySelector? - PullRequest
4 голосов
/ 17 сентября 2011

Я пишу приложение, в котором храню относительные ссылки на элементы как селектор CSS, подходящий для передачи в querySelector.Когда я хочу сохранить относительную ссылку на элемент «base», я хотел бы иметь селектор, который будет возвращать тот же элемент.

Что такое селектор идентичности для метода querySelector метода Element как определено в API селектора уровня 1 , который удовлетворяет следующим требованиям?

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

1 Ответ

3 голосов
/ 17 сентября 2011

Нет ни одного.


Джон Ресиг предоставил ссылку на обсуждение в теме своего блога Мысли о querySelectorAll .

Его проблема в том, что, хотя вы можете искать с любого узла элемента, передаваемый вами селектор принимает во внимание весь документ. (Лично я считаю, что это правильный подход.) Из-за этого он надеялся, что будет такой селектор идентичности, как вы описываете.

jQuery (Sizzle) использует немноговзлома путем использования идентификатора элемента (или назначения временного, если он недоступен) и восстановления селектора, чтобы добавить этот селектор идентификатора.

Примерно так:

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

.... хотя я не знаю, что это могло бы сделать здесь.

...