Passei uma quantidade absurda de tempo tentando descobrir esse problema em várias páginas de um novo site que estou desenvolvendo e nada parecia funcionar (incluindo qualquer uma das várias soluções apresentadas acima que implementei. Acho que o jQuery acabou de mudar as coisas já começaram a crescer o suficiente desde que foram sugeridas que as soluções não funcionam mais. Não sei. Honestamente, não entendo por que não há algo simples implementado na interface do usuário do jQuery para configurar isso, como parece ser um problema bastante grande com o calendário sempre aparecendo em alguma posição consideravelmente distante na página da entrada à qual está anexado.
De qualquer forma, eu queria uma solução final genérica o suficiente para que pudesse ser usada em qualquer lugar e funcionasse. Parece que finalmente cheguei a uma conclusão que evita algumas das respostas mais complicadas e específicas do código jQuery acima:
jsFiddle: http://jsfiddle.net/mu27tLen/
HTML:
<input type="text" class="datePicker" />
JS:
positionDatePicker= function(cssToAdd) {
/* Remove previous positioner */
var oldScript= document.getElementById('datePickerPosition');
if(oldScript) oldScript.parentNode.removeChild(oldScript);
/* Create new positioner */
var newStyle= document.createElement("style");
newStyle.type= 'text/css';
newStyle.setAttribute('id', 'datePickerPostion');
if(newStyle.styleSheet) newStyle.styleSheet.cssText= cssToAdd;
else newStyle.appendChild(document.createTextNode(cssToAdd));
document.getElementsByTagName("head")[0].appendChild(newStyle);
}
jQuery(document).ready(function() {
/* Initialize date picker elements */
var dateInputs= jQuery('input.datePicker');
dateInputs.datepicker();
dateInputs.datepicker('option', {
'dateFormat' : 'mm/dd/yy',
'beforeShow' : function(input, inst) {
var bodyRect= document.body.getBoundingClientRect();
var rect= input.getBoundingClientRect();
positionDatePicker('.page #ui-datepicker-div{z-index:100 !important;top:' + (rect.top - bodyRect.top + input.offsetHeight + 2) + 'px !important;}');
}
}).datepicker('setDate', new Date());
});
Essencialmente, anexei uma nova tag de estilo ao cabeçalho antes de cada evento de "show" do selecionador de data (excluindo o anterior, se houver). Esse método de fazer as coisas contorna a grande maioria dos problemas que encontrei durante o desenvolvimento.
Testado no Chrome, Firefox, Safari e IE> 8 (como o IE8 não funciona bem com jsFiddle e estou perdendo o gosto por me preocupar com
Eu sei que isso é uma mistura de contextos jQuery e javascript, mas neste ponto eu simplesmente não quero me esforçar para convertê-lo para jQuery. Seria simples, eu sei. Eu cansei dessa coisa agora. Espero que outra pessoa possa se beneficiar com esta solução.