Я потратил невероятное количество времени, пытаясь понять эту проблему, на нескольких страницах нового сайта, который я разрабатываю, и ничего не работало (включая любое из различных решений, представленных выше, которые я реализовал. Я предполагаю, что jQuery только что изменился вещей достаточно, так как им было предложено, что решения больше не работают. Я не знаю. Честно говоря, я не понимаю, почему в jQuery ui не реализовано что-то простое, чтобы настроить это, как кажется довольно большая проблема с календарем, который всегда появляется в некоторой позиции значительно дальше по странице от входа, к которому он прикреплен.
Как бы то ни было, мне нужно было конечное решение, которое было бы достаточно общим, чтобы я мог использовать его где угодно, и оно работало бы. Кажется, я наконец пришел к выводу, что позволяет избежать некоторых из более сложных и специфичных для кода jQuery ответов, приведенных выше:
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());
});
По сути, я прикрепляю новый тег стиля к заголовку перед каждым событием "show" datepicker (удаляя предыдущий, если он есть). Такой метод работы позволяет обойти большинство проблем, с которыми я столкнулся во время разработки.
Протестировано в Chrome, Firefox, Safari и IE> 8 (поскольку IE8 плохо работает с jsFiddle, и я теряю желание заботиться о
Я знаю, что это смесь контекстов jQuery и javascript, но на данный момент я просто не хочу прикладывать усилия для преобразования его в jQuery. Я знаю, было бы просто. Я так покончил с этим прямо сейчас. Надеюсь, это решение поможет кому-то другому.