J'ai une fonction de type jquery:
function(elem) {
return $('> someselector', elem);
};
La question est de savoir comment puis-je faire la même chose avec querySelector()
?
Le problème est que le >
sélecteur dans querySelector()
nécessite que le parent soit explicitement spécifié. Y a-t-il une solution de contournement?
Réponses:
Bien que ce ne soit pas une réponse complète, vous devriez garder un œil sur l' API du sélecteur W3C v.2 qui est déjà disponible dans la plupart des navigateurs, à la fois de bureau et mobiles, sauf IE (Edge semble prendre en charge): voir la liste complète du support .
la source
:scope
est toujours spécifié à drafts.csswg.org/selectors-4/#the-scope-pseudo . Jusqu'à présent, seul l'<style scoped>
attribut a été supprimé; on ne sait pas si cela conduira également à:scope
être supprimé (car<style scoped>
c'était un cas d'utilisation important pour:scope
).Vous ne pouvez pas. Il n'y a pas de sélecteur qui simulera votre point de départ.
La façon dont jQuery le fait (plus à cause d'une manière qui
qsa
ne leur convient pas), c'est qu'ils vérifient sielem
a un ID, et sinon, ils ajoutent temporairement un ID, puis créent une chaîne de sélection complète.En gros, vous feriez:
Ce n'est certainement pas du code jQuery, mais d'après ce dont je me souviens, c'est essentiellement ce qu'ils font. Pas seulement dans cette situation, mais dans toute situation où vous exécutez un sélecteur à partir du contexte d'un élément imbriqué.
Code source pour Sizzle
la source
Complet: portée polyfill
Comme avetisk l' a mentionné, Selectors API 2 utilise un
:scope
pseudo-sélecteur.Pour que cela fonctionne dans tous les navigateurs (qui prennent en charge
querySelector
) voici le polyfillUsage
Pour des raisons historiques, ma solution précédente
Basé sur toutes les réponses
Usage
la source
Date.now()
n'est pas pris en charge par les navigateurs plus anciens, et pourrait être remplacé parnew Date().getTime()
Si vous connaissez le nom de balise de l'élément que vous recherchez, vous pouvez l'utiliser dans le sélecteur pour obtenir ce que vous voulez.
Par exemple, si vous avez un
<select>
qui a<option>
s et<optgroups>
, et que vous ne voulez que les<option>
s qui sont ses enfants immédiats, pas ceux à l'intérieur<optgoups>
:Ainsi, ayant une référence à l'élément select, vous pouvez - étonnamment - obtenir ses enfants immédiats comme ceci:
Il semble fonctionner dans Chrome, Safari et Firefox, mais n'a pas été testé dans les IE. = /
la source
<ul id="start"> <li>A</li> <li> <ul> <li>b</li> <li>c</li> </ul> </li> </ul> var result = document.getElementById('start').querySelectorAll('ul>li');
-> Les 4 éléments li seront sélectionnés!<select>
éléments dans le même parent.Si vous voulez finalement trouver des enfants directs (et pas par exemple
> div > span
), vous pouvez essayer Element.matches () :la source
PRÉTENDRE
Personnellement, je prendrais la réponse de patrick dw, et +1 sa réponse, ma réponse est de chercher une solution alternative. Je ne pense pas que cela mérite un vote défavorable.
Voici ma tentative:
voir http://jsfiddle.net/Lgaw5/8/
la source
querySelector
, ce qui signifie qu'il:eq()
ne peut pas être utilisé. Même s'il le pouvait, votre sélecteur renverrait l'élément qui est:eq()
à son apparence sur la page, pas:eq()
à l'index de son parent (où vous obtenez leidx
).elem
est à l'index 4, mais il y a un frère précédent qui a un autretagName
, mais il a imbriqué à l'intérieur un élément avec la correspondancetagName
, cet élément imbriqué sera inclus dans les résultats avant celui que vous ciblez, encore une fois l'index. Voici un exemple$('> someselector', elem);
; o)Cela a fonctionné pour moi:
vous devrez passer le @this keywork avant le> lorsque vous voulez rechercher des enfants immédiats.
la source
Ce qui suit est une méthode générique simplifiée pour exécuter une requête de sélecteur CSS uniquement sur des enfants directs - elle tient également compte des requêtes combinées, telles que
"foo[bar], baz.boo"
:la source
Il existe une bibliothèque relative à la requête , qui remplace assez facilement le sélecteur de requête . Il polyfills les sélecteurs enfants
'> *'
et:scope
(inc. IE8), ainsi que normalise le:root
sélecteur. En outre , il fournit des pseudos spéciaux relatifs comme:closest
,:parent
,:prev
,:next
, juste au cas où.la source
vérifier si l'élément a un identifiant sinon ajouter un identifiant aléatoire et effectuer une recherche en fonction de celui-ci
fera la même chose que
la source