Tester si un sélecteur correspond à un élément donné

Est-il un moyen de tester si un sélecteur pourrait correspondre à un Élément du DOM? De préférence, sans l'utilisation d'une bibliothèque externe comme Grésillement. C'est une bibliothèque, et je tiens à minimiser la quantité de plugins tiers requise pour le "core" de la bibliothèque. S'il finit par exiger Grésillement je vais juste ajouter que comme un plugin à la bibliothèque pour ceux qui veulent la fonctionnalité qu'il permettrait.

Par exemple, je serais capable de faire quelque chose comme:

var element = <input name="el" />

matches("input[name=el]", element) == true

MODIFIER: Après y avoir réfléchi plus, j'ai trouvé une solution, cette technique fonctionne, mais il ne semble pas optimale en termes d'efficacité:

function matchesSelector(selector, element) { 
    var nodeList = document.querySelectorAll(selector); 
    for ( var e in nodeList ) {
        return nodeList[e] === element; 
    }
    return false; 
}

Fondamentalement, la fonction des requêtes de l'ensemble du document avec le sélecteur de donnée, puis il parcourt la nodeList. Si l'élément est dans le nodeList, puis elle retourne true, et si elle n'est pas elle retourne la valeur false.

Si quelqu'un peut venir avec une réponse plus efficace, je serais heureux de marquer leur réponse la réponse.

MODIFIER: Flavius Stef m'a orienté vers un navigateur spécifique solution pour Firefox 3.6+, mozMatchesSelector. J'ai aussi trouvé l'équivalent pour google Chrome (version de compatibilité inconnu, et il peut ou peut ne pas fonctionner sur Safari ou d'autres navigateurs webkit): webkitMatchesSelector, qui est essentiellement la même que celle de Firefox mise en œuvre. Je n'ai pas trouvé d'implémentation native pour les navigateurs IE encore.

Pour l'exemple ci-dessus, l'utilisation serait:

element.(moz|webkit)MatchesSelector("input[name=el]")

Il semble que le W3C a également été abordé dans l'API de Sélecteurs de Niveau 2 (encore un projet en ce moment) de la spécification. matchesSelector d'une méthode sur les Éléments DOM, une fois approuvées.

W3C Utilisation: element.matchesSelector(selector)

Depuis cette spécification est encore qu'un projet et il y a un décalage de temps avant que les navigateurs populaires de mettre en œuvre les méthodes une fois qu'il devient la norme, il peut être un certain temps jusqu'à ce que réellement utilisable. La bonne nouvelle est que si vous utilisez l'un des populaires cadres, les chances sont qu'ils probablement mettre en œuvre cette fonctionnalité pour vous, sans avoir à vous soucier de la compatibilité du navigateur. Bien que cela n'aide pas ceux d'entre nous qui ne peuvent pas inclure des bibliothèques tierces.

Des cadres ou des bibliothèques de mise en œuvre de cette fonctionnalité:

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.De l'élément.matchesSelector

http://wiki.github.com/jeresig/sizzle/

  • Je ne peux pas imaginer comment vous pouvez le faire - en supposant que vous souhaitez prendre en charge une large gamme de sélecteurs, ou tous les CSS2 ou 3 sélecteurs - sans la terrible proximité de réimplanter le Grésillement de toute façon. Parce que c'est déjà optimisé et débogué, pourquoi ne pas l'utiliser?
  • J'espérais qu'il y a un moyen de le faire "nativement" avec la construction dans le sélecteur de moteur dans les navigateurs modernes (via querySelector et querySelectorAll). Si non, comme je l'ai dit, je vais recourir à l'aide d'une bibliothèque, mais de déléguer cette fonction à un plugin Grésillement n'est pas nécessaire pour mon "cœur" de la bibliothèque.
  • Firefox 3.6 a Noeud.mozMatchesSelector(): developer.mozilla.org/en/DOM/Node.mozMatchesSelector
  • Stef: Il ne ressemble pas à n'importe quel navigateur croix de chemin à faire encore, mais merci pour le lien, je l'ai suivi du W3C niveau 2 cahier des charges qu'ils ont abordé, de sorte qu'il est seulement une question de la spécification en cours de finalisation et les navigateurs de la mettre en œuvre. Si vous ajoutez plus d'informations à propos de l'inclusion de la matchesSelector méthode dans les "Sélecteurs W3C API de Niveau 2 (Première version)" dans votre réponse, je vais le marquer comme réponse. Si non, je vais le monter dans mon post.
  • À l'aide de Modernizr, vous pouvez le faire Modernizr.prefixed('MatchesSelector,element) pour obtenir une fonction (si elle existe) avec les bonnes (ou pas) vendeur préfixe, qui peut ensuite être utilisé comme fn && fn(selector).
  • (moz|webkit|o|ms)matchesSelector désormais pris en charge sur tous les principaux navigateurs de bureau, comme par developer.mozilla.org/en-US/docs/Web/API/...