Vou te explicar:
Quando você faz assim: $(’.teste’).click(function(e){});
Você está usando o BIND… Isso é a mesma coisa que isso: $(’.teste’).on(‘click’, function(e){});
O bind tem o seguinte funcionamento:
O momento em que você executa esse comando $(’.teste’), o jQuery vai varrer o DOM procurando todos os elementos que atendem à esse selector.
Depois de trazer esses elementos ele vai atribuir o evento à eles, que no caso é o evento de click.
Se você fizer o seguinte teste:
$(document).ready(function() {
console.log($('.teste'));
});
Você vai ver que ele vai te trazer um objeto do jQuery mas que não tem nenhum elemento dentro (olhe a propriedade length, vai estar zerada)
Ou seja, no momento em que esse comando é executado, você não tem nenhum elemento ‘.teste’… O jQuery não consegue atribuir o evento à ninguém e fica por isso mesmo.
Quando você faz assim: $(document).on(‘click’, ‘.teste’, function (e) {});
Você está usando o LIVE…
O live tem o seguinte funcionamento:
O evento é atachado ao document. O document é o pai de todos os elementos, então ele existe quando você faz essa atribuição à ele.
Quando um evento acontece (um click, por exemplo) ele é propagado para os pais desse elemento, por exemplo, faça o seguinte teste:
// HTML
<div id="primeiraDiv">
<div id="segundaDiv">
<div id="terceiraDiv">
texto para você clicar.
</div>
</div>
</div>
// JS
$(document).ready(function(){
$('#primeiraDiv').click(function(){
console.log('Clicou na primeira div');
});
$('#segundaDiv').click(function(){
console.log('Clicou na segunda div');
});
$('#terceiraDiv').click(function(){
console.log('Clicou na terceira div');
});
});
Depois disso, clique no TEXTO e veja o console.
O resultado vai ser:
Clicou na terceira div
Clicou na segunda div
Clicou na primeira div
Ou seja, o evento de CLICK é PROPAGADO para os pais desse elemento (e vai indo até chegar no document)
Assim, o click acontece em um elemento, mas quem captura esse evento é o document (e o jQuery tem como saber quem iniciou o evento, sendo assim, ele chama a função implementada no live)
Para você parar esse acontecimento, existe o método stopPropagation() dentro do evento. Ele impede que o evento continue subindo.
Coloque o stopPropagation no teste acima e veja que ele não vai continuar.
Enfim, esse problema de position ou left é bem provável que seja ligado ao fato de você ter alguma hidden e ele não conseguir montar o datepicker… Dê uma analisada melhor nisso.