Eu tenho alguma função semelhante ao jquery:
function(elem) {
return $('> someselector', elem);
};
A questão é como posso fazer o mesmo com querySelector()
?
O problema é que o >
seletor em querySelector()
requer que o pai seja especificado explicitamente. Existe alguma solução alternativa?
javascript
css-selectors
selectors-api
desfatado
fonte
fonte
Respostas:
Embora não seja uma resposta completa, você deve ficar de olho no W3C Selector API v.2, que já está disponível na maioria dos navegadores, tanto desktop quanto móvel, exceto IE (Edge parece suportar): veja a lista completa de suporte .
fonte
:scope
ainda está especificado em drafts.csswg.org/selectors-4/#the-scope-pseudo . Até agora, apenas o<style scoped>
atributo foi removido; não está claro se isso também levará à:scope
remoção (já que<style scoped>
era um caso de uso importante para:scope
).Você não pode. Não há um seletor que simule seu ponto de partida.
A maneira como o jQuery faz isso (mais por causa de uma forma que
qsa
não é do seu agrado) é que eles verificam seelem
tem um ID e, se não, eles temporariamente adicionam um ID e, em seguida, criam uma string de seletor completa.Basicamente, você faria:
Certamente não é um código jQuery, mas pelo que me lembro, é basicamente o que eles fazem. Não apenas nesta situação, mas em qualquer situação em que você esteja executando um seletor a partir do contexto de um elemento aninhado.
Código fonte para Sizzle
fonte
Completo: escopo polyfill
Como avetisk foi mencionado selectores API 2 usos
:scope
pseudo-selector.Para fazer isso funcionar em todos os navegadores (que suportam
querySelector
) aqui está o polyfillUso
Por razões históricas, minha solução anterior
Com base em todas as respostas
Uso
fonte
Date.now()
não é suportado por navegadores mais antigos e pode ser substituído pornew Date().getTime()
Se você souber o nome da tag do elemento que está procurando, poderá usá-lo no seletor para obter o que deseja.
Por exemplo, se você tem um
<select>
que tem<option>
s e<optgroups>
, e deseja apenas os<option>
s que são seus filhos imediatos, não os internos<optgoups>
:Portanto, tendo uma referência ao elemento select, você pode - surpreendentemente - obter seus filhos imediatos assim:
Parece funcionar no Chrome, Safari e Firefox, mas não testou em IEs. = /
fonte
<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');
-> Todos os 4 elementos li serão selecionados!<select>
elementos no mesmo pai.Se você quiser eventualmente encontrar filhos diretos (e não por exemplo
> div > span
), você pode tentar Element.matches () :fonte
AFIRMAÇÃO
Pessoalmente, eu pegaria a resposta de patrick dw e +1 sua resposta, minha resposta é para buscar uma solução alternativa. Não acho que mereça um voto negativo.
Aqui está minha tentativa:
consulte http://jsfiddle.net/Lgaw5/8/
fonte
querySelector
, o que significa que:eq()
não pode ser usado. Mesmo se pudesse, seu seletor retornaria o elemento que está:eq()
com sua aparência na página, não:eq()
para o índice de seu pai (que é de onde você está obtendo oidx
).elem
está no índice 4, mas há um irmão anterior que tem um diferentetagName
, mas aninhado dentro dele um elemento com a correspondênciatagName
, esse elemento aninhado será incluído nos resultados antes daquele que você está almejando, novamente descartando o índice. Aqui está um exemplo$('> someselector', elem);
; o)Isso funcionou para mim:
você terá que passar o @this keywork antes do> quando quiser pesquisar os filhos imediatos.
fonte
O seguinte é um método simplificado e genérico para executar qualquer consulta do seletor CSS apenas em filhos diretos - ele também leva em consideração consultas combinadas, como
"foo[bar], baz.boo"
:fonte
Existe uma biblioteca relativa à consulta , que é um substituto bastante útil para o seletor de consulta . Ele polyfills seletor de crianças
'> *'
e:scope
(inc. IE8), bem como:root
seletor normaliza . Também fornece algumas pseudos relativos especiais, como:closest
,:parent
,:prev
,:next
, apenas no caso.fonte
verifique se o elemento tem id, então adicione um id aleatório e faça uma pesquisa com base nele
fará a mesma coisa que
fonte