Encontrei dois ótimos artigos falando sobre a nova função .on()
: jquery4u.com , elijahmanor.com .
Existe alguma maneira .bind()
de usar o still ainda melhor .on()
?
Por exemplo, eu tenho um código de exemplo que se parece com isso:
$("#container").click( function( e ) {} )
Você pode observar que apenas tenho um item recuperado pelo seletor e, no meu caso, o <div>
nome #container
já existe quando minha página foi carregada; não adicionado dinamicamente. É importante mencionar que eu uso a versão mais recente do jQuery: 1.7.2.
Para esse exemplo, deve .on()
ser usado em vez de, .bind()
mesmo que eu não use os outros recursos fornecidos pela .on()
função?
javascript
jquery
jquery-selectors
Samuel
fonte
fonte
.bind()
é ruim a ligação de vários elementos, mas não menciona como,.on()
quando usado no modo de ligação, faz exatamente a mesma coisa.Respostas:
Internamente,
.bind
mapeia diretamente para.on
a versão atual do jQuery. (O mesmo vale para isso.live
.) Portanto, há um desempenho pequeno, mas praticamente insignificante, se você o usar.bind
.No entanto,
.bind
pode ser removido de versões futuras a qualquer momento. Não há razão para continuar usando.bind
e todas as razões para preferir.on
.fonte
.bind
e.on
são idênticos para eventos não delegados;.bind
não fornece qualquer tipo de atalho, como$.getJSON
fazTodos esses trechos executam exatamente a mesma coisa:
No entanto, eles são muito diferentes destes, que executam a mesma coisa:
O segundo conjunto de manipuladores de eventos usa a delegação de eventos e funcionará para elementos adicionados dinamicamente. Manipuladores de eventos que usam delegação também têm muito mais desempenho. O primeiro conjunto não funcionará para elementos adicionados dinamicamente e é muito pior para o desempenho.
A
on()
função do jQuery não introduz nenhuma nova funcionalidade que ainda não existia, é apenas uma tentativa de padronizar a manipulação de eventos no jQuery (você não precisa mais decidir entre viver, vincular ou delegar).fonte
$('selector').live('click', function () { ... });
para manter o resultado o mais próximo possível.Os métodos diretos e
.delegate
são APIs superiores.on
e não há intenção de depreciá-los.Os métodos diretos são preferíveis, porque seu código será menos digitado. Você receberá um erro imediato ao digitar incorretamente o nome de um evento, em vez de um bug silencioso. Na minha opinião, também é mais fácil escrever e ler do
click
queon("click"
O
.delegate
é superior a.on
por causa da ordem do argumento:Você sabe imediatamente que é delegado porque, bem, diz delegado. Você também vê instantaneamente o seletor.
Com
.on
isso, não está claro imediatamente se ele é delegado e você deve procurar no final o seletor:Agora, a nomeação de
.bind
é realmente terrível e tem um valor nominal pior que.on
. Mas.delegate
não é possível realizar eventos não delegados e há eventos que não possuem um método direto; portanto, em um caso raro como esse, ele poderia ser usado, mas apenas porque você deseja fazer uma separação limpa entre eventos delegados e não delegados.fonte
Se você procurar no código-fonte,
$.fn.bind
verá que é apenas uma função de reescrita paraon
:http://james.padolsey.com/jquery/#v=1.7.2&fn=$.fn.bind
fonte
Na documentação do jQuery:
http://api.jquery.com/bind/
fonte
A partir do Jquery 3.0 e posterior, o .bind foi descontinuado e eles preferem usar .on. Como o @Blazemonger respondeu anteriormente, ele pode ser removido e é certo que será removido. Para as versões mais antigas, o .bind também chamaria .on internamente e não há diferença entre elas. Consulte também a API para obter mais detalhes.
Documentação da API jQuery para .bind ()
fonte