Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   QSA CSS Selector Engine v1.0 - Выкладываю CSS-селектор по просьбе трудящихся (https://javascript.ru/forum/project/24330-qsa-css-selector-engine-v1-0-vykladyvayu-css-selektor-po-prosbe-trudyashhikhsya.html)

poorking 01.02.2012 01:42

Да, это можно определить и собирать распарсенные простые селекторы в кучки - последовательности, я сейчас шустро пишу примерно то , что раньше оборачивало эту регулярку и сразу ясно станет

devote 01.02.2012 01:51

Цитата:

Сообщение от poorking
Да, это можно определить и собирать распарсенные простые селекторы в кучки - последовательности

вот именно это и приводит к тому что TYPE проходит в любой части селектора... Увы но регой четко не сделаешь... Моя рега работает так же по правилам стандартов. То-есть все раскладывает по правильному порядку. Но в виду того что нужно выяснять принадлежность дополнительных атрибутов для элементов приводит к тому что вся логика просто рушится. Я не говорю что нельзя все нормально организовать, конечно же можно. Просто это повлияет на скорость, причем значительно. Поэтому порядок не особо страшный казус. Хотя у меня все же он вроде соблюдается... если судить по реге... Что то не припомню что бы такой селектор воспринимался:
a:not([href*=test]).test

poorking 01.02.2012 01:54

я убираю такой
string.replace(/\\([\s\S])/g, "$1");

Octane 01.02.2012 01:56

Цитата:

Сообщение от devote
не понимаю зачем поставлены слеши после prefix это что двоеточие за экранировали чтоль?

Ну да в CSS надо экранировать такие символы
prefix\:tag-name.class\\name {…}

а второй слэш появляется из-за экранирования в JavaScript-строке

devote 01.02.2012 01:59

Цитата:

Сообщение от Octane
Ну да в CSS надо экранировать такие символы

ну в CSS да.. но в селекторах что мы обсуждаем, двоеточие не экранируется... ибо Namespace там нужно указывать так:
prefix|tag-name.class\name

poorking 01.02.2012 02:00

Цитата:

Сообщение от devote
вот именно это и приводит к тому что TYPE проходит в любой части селектора

не ) это уже не регексп решает, но проверить просто, вы смотрите, если это начало последовательности, то после сборки распарсенного простого селектора ставите флажок, мол TYPE уже был. А в том ветвлении, где вы проверяете не селектор ли типа заматчен, вы смотрите на этот флажок и кидаете ошибку если он тру. Если вы в итерации видите что это конец последовательности простых селекторов то флажок переключаете на фолс

alert(document.querySelectorAll("a:not([href*=test]).test"));


Нативный qsa ест, значит так можно )

devote 01.02.2012 02:14

Цитата:

Сообщение от poorking
Нативный qsa ест, значит так можно )

Да и правда, мой тоже ест :D только что проверил :)

monolithed 02.02.2012 14:28

var hasQSA = (function() {
    var div = document.createElement('div');
    div.innerHTML = "<p class='TEST'></p>";

    if (!div.querySelectorAll || div.querySelectorAll(".TEST")|0)
        return 0;
    
    div = null;
    return 1;
})();

alert(hasQSA);

melky 02.02.2012 14:30

monolithed, а почему не прокатывает простая проверка наличия этого свойства в документе* ?
var hasQSA = "querySelector" in document;

* при условии, что это свойство не добавили для "заглушки".

poorking 02.02.2012 14:42

melky,
Из Sizzle
// Safari can't handle uppercase or unicode characters when
		// in quirks mode.
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
			return;
		}


Часовой пояс GMT +3, время: 02:10.