Есть ли способ проверить, будет ли селектор соответствовать данному элементу DOM? Предпочтительно, без использования внешней библиотеки, такой как Sizzle. Это для библиотеки, и я хотел бы свести к минимуму количество сторонних плагинов, необходимых для "основной" библиотеки. Если это заканчивается тем, что требует Sizzle, я просто добавлю это как плагин в библиотеку для тех, кто хочет включить эту функцию.
Например, я мог бы сделать что-то вроде:
var element = <input name="el" />
matches("input[name=el]", element) == true
EDIT: подумав об этом, я придумал решение, это технически работает, но оно не кажется оптимальным с точки зрения эффективности:
function matchesSelector(selector, element) {
var nodeList = document.querySelectorAll(selector);
for ( var e in nodeList ) {
return nodeList[e] === element;
}
return false;
}
В основном функция запрашивает весь документ с данным селектором, а затем выполняет итерацию над узломList. Если данный элемент находится в nodeList, он возвращает true, а если он не возвращает false.
Если кто-нибудь может придумать более эффективный ответ, я бы с радостью отметил их ответ в качестве ответа.
EDIT: Flavius Stef указал мне на решение для браузера для Firefox 3.6+, mozMatchesSelector. Я также нашел эквивалент для Chrome (неизвестность версии неизвестна, и она может работать или не работать в Safari или других браузерах веб-браузера): webkitMatchesSelector
, который в основном совпадает с реализацией Firefox. Я еще не нашел встроенной реализации для IE-браузеров.
В приведенном выше примере использование будет:
element.(moz|webkit)MatchesSelector("input[name=el]")
Кажется, W3C также обратился к этому в спецификации Selectors API Level 2 (все еще черновик в данный момент). matchesSelector
будет методом на DOM Elements после его одобрения.
W3C Использование: element.matchesSelector(selector)
Поскольку эта спецификация все еще является черновиком, и есть время запаздывания, прежде чем популярные браузеры реализуют методы, когда это станет стандартом, может быть какое-то время, пока это фактически не будет использовано. Хорошая новость заключается в том, что если вы используете какую-либо из популярных фреймворков, скорее всего, они реализуют эту функцию для вас, не беспокоясь о совместимости с браузером. Хотя это не помогает тем из нас, кто не может включать сторонние библиотеки.
Рамки или библиотеки, реализующие эту функциональность:
http://www.prototypejs.org/api/element/match
http://developer.yahoo.com/yui/docs/YAHOO.util.Selector.html
http://docs.jquery.com/Traversing/is
http://extjs.com/deploy/dev/docs/output/Ext.DomQuery.html#Ext.DomQuery-methods
http://base2.googlecode.com/svn/doc/base2.html#/doc/!base2.DOM.Element.matchesSelector