jQuery - seletor mais rápido saber os 2 primeiros pais

votos
1

Eu tenho a seguinte configuração:

 var el = $(#overParent);
 // Do whatever with el here.
 var cls = $(.valueElement, #parent); // Get elements with class valueElement inside element with id parent
 // Do whatever

Isso está funcionando mas eu queria saber se eu posso fazer isso mais rápido. Eu sei que #parenté um elemento dentro do #overParentque já está selecionado. Posso de alguma forma usar isso para verificar somente o el #overparentpara #parent, em seguida, obter os elementos com a classe especificada?

Algo como: $(.valueElement, #parent, el)mas de acordo com a documentação $leva apenas 2 parâmetros.

Publicado 23/01/2013 em 06:47
usuário
Em outras línguas...                            


5 respostas

votos
2

Se você está encontrando um elemento por ID, em seguida, usando apenas:

var $element = $('#id');

sem fornecer qualquer contexto de pesquisa será sempre o caminho mais rápido.

Da mesma forma aqui, onde você está fornecendo um ID como um contexto para a sua pesquisa, então "#parent"é o seletor mais rápido. Você poderia, teoricamente, usar "#overParent > #parent"para conseguir o que você quer dizer, mas seria realmente significa mais trabalho a fazer e seria mais lento.

Respondeu 23/01/2013 em 06:49
fonte usuário

votos
1

Seletores gostar '#theId'não fazem jQuery digitalizar o documento, uma vez que utiliza document.getElementById.

Se você quer olhar para um elemento conhecer sua id, mesmo se você sabe o seu pai, sempre usar $('#theid').

Na verdade, se você fornecer o pai como contexto, jQuery vai chamar document.getElementById e verificar depois disso que o pai contém o elemento encontrado. Este é, portanto, muito mais lento.

A partir do código fonte:

    // Speed-up: Sizzle("#ID")
    if ( (m = match[1]) ) {
        if ( nodeType === 9 ) {
            elem = context.getElementById( m );
            // Check parentNode to catch when Blackberry 4.6 returns
            // nodes that are no longer in the document #6963
            if ( elem && elem.parentNode ) {
                // Handle the case where IE, Opera, and Webkit return items
                // by name instead of ID
                if ( elem.id === m ) {
                    results.push( elem );
                    return results;
                }
            } else {
                return results;
            }
        } else {
            // Context is not a document
            if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
                contains( context, elem ) && elem.id === m ) {
                results.push( elem );
                return results;
            }
        }

Da mesma forma, se você quiser selecionar todos os elementos com uma classe, não especifique o pai, isso não ajuda.

No seu caso, como você parece querer usar o pai para restringir o conjunto, basta usar

$(".valueElement", "#parent");
Respondeu 23/01/2013 em 06:49
fonte usuário

votos
1

Basta ficar com o selector de ID normal:

$('#element');

Ainda é o mais rápido, mesmo se você já tem o elemento pai selecionado: http://jsperf.com/id-test-123

Eu estou apenas supondo aqui, mas acho que navegadores usam uma tabela de pesquisa para encontrar elementos por seu atributo id.

Respondeu 23/01/2013 em 06:53
fonte usuário

votos
1

de acordo com os docs ...

var el = $("#overParent");

esta é muito gentil eficiente thn ter outro selector ligado a ele ....

Para seletores id, jQuery usa a função document.getElementById JavaScript (), que é extremamente eficiente. Quando outro seletor está ligado ao seletor id, tais como h2 # pageTitle, jQuery executa uma verificação adicional antes de identificar o elemento como um jogo.

Respondeu 23/01/2013 em 06:55
fonte usuário

votos
1

@Blender

Se você estiver usando as classes e cache o elemento contexto, é mais rápido fornecendo o contexto:

http://jsperf.com/id-test-123/3

Respondeu 07/02/2013 em 12:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more