Как изменить положение всплывающего окна элемента управления jQuery DatePicker - PullRequest
101 голосов
/ 19 марта 2009

Есть идеи, как заставить DatePicker появляться в конце соответствующего текстового поля, а не непосредственно под ним? Как правило, текстовое поле находится внизу страницы, а DatePicker перемещается вверх, чтобы учесть это, и полностью покрывает текстовое поле. Если пользователь хочет ввести дату, а не выбрать ее, он не может. Я бы предпочел, чтобы он появился сразу после текстового поля, поэтому не имеет значения, как он регулируется по вертикали.

Есть идеи, как управлять позиционированием? Я не видел никаких настроек для виджета, и мне не повезло с настройкой CSS, но я мог легко что-то упустить.

Ответы [ 21 ]

1 голос
/ 13 мая 2015

Я взял это у (( Как управлять позиционированием jQueryUI datepicker ))

$. Extend ($. Datepicker, {_checkOffset: функция (inst, offset, isFixed) {возвращаемое смещение}});

это работает !!!

1 голос
/ 28 июня 2012

исправить проблему с отображением позиции daterangepicker.jQuery.js

//Original Code
//show, hide, or toggle rangepicker
    function showRP() {
        if (rp.data('state') == 'closed') {
            rp.data('state', 'open');
            rp.fadeIn(300);
            options.onOpen();
        }
    }


//Fixed
//show, hide, or toggle rangepicker
    function showRP() {
        rp.parent().css('left', rangeInput.offset().left);
        rp.parent().css('top', rangeInput.offset().top + rangeInput.outerHeight());
        if (rp.data('state') == 'closed') {
            rp.data('state', 'open');
            rp.fadeIn(300);
            options.onOpen();
        }
    }
1 голос
/ 22 марта 2015

Они изменили имя класса на ui-datepicker-trigger

Так что это работает в jquery 1.11.x

.ui-datepicker-trigger { 
margin-top:7px;
  margin-left: -30px;
  margin-bottom:0px;
  position:absolute;
  z-index:1000;
}
1 голос
/ 19 декабря 2014

Я потратил смехотворное количество времени, пытаясь выяснить эту проблему на нескольких страницах нового сайта, который я разрабатываю, и, похоже, ничего не работает (включая любое из представленных выше решений, которые я реализовал. Я предполагаю, что jQuery Я просто достаточно изменил ситуацию, так как им было предложено, чтобы решения больше не работали. Я не знаю. Честно говоря, я не понимаю, почему в интерфейсе jQuery нет чего-то простого, чтобы это настроить, так как Кажется, это довольно большая проблема с календарем, постоянно всплывающим в какой-то позиции на значительном расстоянии от страницы, к которой он прикреплен.

Во всяком случае, я хотел получить конечное решение, которое было бы достаточно универсальным, чтобы я мог использовать его где угодно, и оно будет работать. Кажется, я наконец пришел к выводу, что избегаю некоторых из более сложных и специфичных для 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());
});

По сути, я прикрепляю новый тег стиля к заголовку перед каждым событием showpicker «show» (удаляя предыдущий, если имеется). Этот метод работы позволяет обойти большинство проблем, с которыми я столкнулся во время разработки.

Протестировано на Chrome, Firefox, Safari и IE> 8 (поскольку IE8 плохо работает с jsFiddle, и я теряю удовольствие от заботы о

Я знаю, что это сочетание контекстов jQuery и javascript, но на данный момент я просто не хочу прилагать усилия для его преобразования в jQuery. Было бы просто, я знаю. Я так закончил с этой штукой прямо сейчас. Надеюсь, кто-то еще может извлечь выгоду из этого решения.

1 голос
/ 07 августа 2014

Очень простая функция jquery.

$(".datepicker").focus(function(event){
                var dim = $(this).offset();
                $("#ui-datepicker-div").offset({
                    top     :   dim.top - 180,
                    left    :   dim.left + 150
                });
            });
0 голосов
/ 30 июля 2013

Стоит также отметить, что если IE перейдет в режим причуд, компоненты jQuery UI и другие элементы будут расположены неправильно.

Чтобы убедиться, что вы не попадаете в режим причуд, убедитесь, что вы правильно установили тип документа на новейший HTML5.

<!DOCTYPE html>

Использование переходного делает беспорядок вещей. Надеюсь, это сэкономит кому-то время в будущем.

0 голосов
/ 08 января 2015
.ui-datepicker {-ms-transform: translate(100px,100px); -webkit-transform: translate(100px,100px); transform: translate(100px,100px);}
0 голосов
/ 11 июля 2014

В Jquery.UI просто обновите функцию _checkOffset, чтобы viewHeight добавлялся в offset.top, прежде чем будет возвращено offset

_checkOffset: function(inst, offset, isFixed) {
    var dpWidth = inst.dpDiv.outerWidth(),
    dpHeight = inst.dpDiv.outerHeight(),
    inputWidth = inst.input ? inst.input.outerWidth() : 0,
    inputHeight = inst.input ? inst.input.outerHeight() : 0,
    viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
            viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : ($(document).scrollTop()||document.body.scrollTop));
        offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
        offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
        offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? ($(document).scrollTop()||document.body.scrollTop) : 0;

        // now check if datepicker is showing outside window viewport - move to a better place if so.
        offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
            Math.abs(offset.left + dpWidth - viewWidth) : 0);
        offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
            Math.abs(dpHeight + inputHeight) : 0);
**offset.top = offset.top + viewHeight;**
        return offset;
    },
0 голосов
/ 09 октября 2018

Или вы можете использовать событие focus на вашем объекте dateSelect и позиционировать api вместе. Вы можете поменять местами верхний и нижний и левый угол вправо или в центр (или на самом деле все, что вы хотите от позиции API). Таким образом, вам не нужен интервал или какое-либо безумно сложное решение, и вы можете настроить макет в соответствии со своими потребностями в зависимости от того, где находится ввод.

dateSelect.focus(function () {
    $("#ui-datepicker-div").position({
        my: "left top",
        at: "left bottom",
        of: $(this)
    });
});
0 голосов
/ 15 мая 2019
$('.PDatePicker').MdPersianDateTimePicker({
                Placement: 'top',          
            });
...