devote,
Так что нового?, это ж самое интересное
Посмею пролить немного занудной слизи по поводу этих движков селекторов. Когда cмотришь регулярные выражения подобных творений, складывается впечатления что авторы не потрудились посмотреть грамматику селекторов в спецификации, где, чуть ли не готовые регулярные выражения написаны. Конечно адекватный пользователь интерфейса (который заведомо кривые селекторы вводить не будет), не натолкнется на косяки, но раз уж авторы утверждают, что движок dom выборок по
CSS селекторам, то я думаю, что нужно соответствовать спецификации, раз уж мы имеем право гневно обсуждать, например, разработчиков браузеров, которые им не следуют. Например, приведу, некоторые из частей регулярного выражения QSA. В спецификации есть понятие IDENT, в QSA это выглядит вот так
[\w\-]+
Хотя по спецификации IDENT выглядит, если не ошибаюсь, вот так
-?(?:\\[\s\S]|[_a-zA-Z\u0080-\uFFFF])(?:\\[\s\S]|[\w\-\u0080-\uFFFF])*
Это конечно наглеж, но я хотя бы вот так написал
-?[_a-zA-Z][\-\w]*
чтобы цифру первой не вводили
И так далее. Такие допущения позволяют пользователю вводить невалидные данные и получать в лучшем случае никакой результат, в худшем - повисший браузер. Но это еще ладно.
У меня есть элемент
<a href = "javascript: void 0">
Я накосячил, написал
qsa.querySelectorAll("a[href*='jav\"]")
И получил [], и не понимаю почему? ведь если бы я неправильно ввел что-то, то получил бы SyntaxError, верно? А элемент искомый в моем документе 100% есть. Потом я ввел "a[href*='jav\"] +" и браузер вообще ушел куда то в бесконечность, дальше исследовать не стал.
Нет стал, еще интересный момент. В последовательности простых селекторов NS|TYPE#ID.CLASS[NS|ATTR]:PSEUDOFN(ARG) селектор типа может быть ТОЛЬКО первым номером. Но рядовой регексп с радостью обнаружит селектор типа например в таком случае [ATTR]TYPE или в таком :not(ololo)div, я в своем парсере ( однажды заморочился и написал парсер такой, который не позволял вводить невалидные данные, но выборки сделать сравнительно быстрые не получилось, особенно на том моменте где идет удаление дубликатов и сортировка (дубликаты ок, но наф вообще сортировка?) ) это все контролировал и кидал SyntaxError. Но к сожалению если все это учесть, то регулярка получается толстенная, которая ловит еще и ошибки, в ней около 15-20 карманов и возможно (я тогда не сравнивал) было не шибко производительно
А если без занудства, то движок реально крут, что так быстр.
IMHO qsa настолько быстр потому что не валидирует входные данные, а парсер очень мягок