Pasé una cantidad ridícula de tiempo tratando de resolver este problema para varias páginas de un nuevo sitio que estoy desarrollando y nada parecía funcionar (incluida cualquiera de las diversas soluciones presentadas anteriormente que implementé. Supongo que jQuery acaba de cambiar las cosas han subido lo suficiente ya que se sugirió que las soluciones ya no funcionan. No lo sé. Honestamente, no entiendo por qué no hay algo simple implementado en la interfaz de usuario de jQuery para configurar esto, como parece ser un problema bastante grande con el calendario siempre apareciendo en alguna posición considerablemente más abajo en la página de la entrada a la que está adjunto.
De todos modos, quería una solución final que fuera lo suficientemente genérica como para poder usarla en cualquier lugar y funcionaría. Parece que finalmente he llegado a una conclusión que evita algunas de las respuestas más complicadas y específicas del código jQuery anteriores:
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());
});
Esencialmente adjunto una nueva etiqueta de estilo al encabezado antes de cada evento "show" del selector de fechas (eliminando la anterior, si está presente). Este método de hacer las cosas soluciona la gran mayoría de los problemas que encontré durante el desarrollo.
Probado en Chrome, Firefox, Safari e IE> 8 (ya que IE8 no funciona bien con jsFiddle y estoy perdiendo el gusto por preocuparme
Sé que esta es una mezcla de contextos jQuery y javascript, pero en este punto simplemente no quiero esforzarme en convertirlo a jQuery. Sería simple, lo sé. Estoy tan harto de esto ahora mismo. Espero que alguien más pueda beneficiarse de esta solución.