заставить jQuery UI datepicker всегда открываться в определенном направлении?

Я использую элемент управления datepicker jQuery UI на position: fixed панели инструментов внизу моей страницы. Иногда на случайных компьютерах указатель даты появляется под панелью инструментов, что означает, что он находится за пределами страницы и его невозможно просмотреть или взаимодействовать с ним.

Есть ли способ заставить положение элемента управления datepicker всегда быть выше и правее его <input>?


person ceejayoz    schedule 06.10.2009    source источник
comment
Можете ли вы лучше обрезать случайность ошибки? В некоторых версиях Firebug возникают проблемы с элементами смещения высоты страницы, и теоретически они могут нести ответственность за результат. Или мы говорим об Internet Explorer?   -  person Frankie    schedule 02.11.2009
comment
Бывает в IE, Safari и Firefox.   -  person ceejayoz    schedule 02.11.2009


Ответы (6)


Вы можете изменить строки:

offset.left -= (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? Math.abs(offset.left + dpWidth - viewWidth) : 0;
offset.top -= (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? Math.abs(offset.top + dpHeight + inputHeight*2 - viewHeight) : 0;

...читать:

offset.left = $(inst.input).position().left + dpWidth;
offset.top = $(inst.input).position().top - dpHeight;

Однако это теряет гибкость. Если ваш ввод находится в верхней части страницы, у вас возникнет проблема, противоположная предыдущей.

person Kev    schedule 27.10.2009
comment
Спасибо. Средство выбора даты никогда не находится в верхней части страницы, и это очень ограниченная система, поэтому я могу с разумной уверенностью сказать, что так и останется. Я попробую это сделать, но если у кого-то есть решение, которое не требует редактирования основного кода пользовательского интерфейса jQuery, это тоже было бы здорово. - person ceejayoz; 27.10.2009
comment
Есть способ сделать это, не редактируя основные исходные файлы, см. Ответ ниже. IMO должна быть возможность отключить функцию автоматического позиционирования. - person Purrell; 01.12.2009
comment
Я думаю, что часть _checkOffset: функция в code.jquery.com/ui/ 1.9.1 / jquery-ui.js, но с момента публикации он немного изменился. - person Kev; 29.10.2012

Единственный способ быть уверенным (для jQueryUI-версии datepicker) - это отключить функцию datepicker, которая пытается отобразить внутри области просмотра. Вот способ сделать это без изменения файлов исходного кода:

$.extend(window.DP_jQuery.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}});

в более поздних версиях JQuery UI попробуйте:

$.extend($.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}});

Это просто сбивает с толку функцию _checkOffset внутри datepicker, что делает его быстрым. Затем вы можете использовать CSS-файл .ui-datepicker, чтобы убедиться, что он остается исправленным, если это то, что вам нужно. Дополнительная информация на how-to-control-positioning-of-jqueryui-datepicker .

person Purrell    schedule 30.11.2009
comment
Большое спасибо за это. Какая боль! - person ; 18.06.2010
comment
@Purell, ты звезда! Я искал это целую вечность, пробовал множество различных подходов, и на данный момент это единственное наиболее надежное решение. Спасибо, куча. - person Philzen; 10.08.2016

Проблема в том, что элемент в позиции: фиксировано показывает верхнюю позицию 0 пикселей (проверьте с помощью: alert $ ('# datepicker2'). Position ()).

Решение:

$('#datepicker').datepicker( {beforeShow: function(input) {
    var x = 100; //add offset
    var y = 20; 
    field = $(input);
    left = field.position().left + x;
    bottom = y;
    setTimeout(function(){
        $('#ui-datepicker-div').css({'top':'', 'bottom':bottom + 'px', 'left': left + 'px'});      
    },1);                    
}}

Тестовый HTML:

<form style="position:fixed; bottom:0; width:100%" name="form1" method="post" action="">
  <label>
    <input style="left:300px; position:absolute; bottom:0" type="text" name="textfield" id="datepicker">
  </label>
</form>
person jmav    schedule 30.10.2009
comment
Я знаю, что это более старый пост, но это единственное, что у меня сработало из всех опубликованных решений. jmav, спасибо. - person Travis; 28.07.2010

http://www.mindfiresolutions.com/Make-jQuery-datepicker-to-popup-in-different-positions-995.php

Проверь это. Я использовал это и смог разместить элемент управления datepicker во всех браузерах.

person Aseem    schedule 01.08.2011

У меня была аналогичная проблема. У меня есть страница с элементами выбора даты, которые потенциально могут использоваться в различных местах на странице, а также с фиксированным заголовком, где пользователь может прокручивать страницу как по горизонтали, так и по вертикали, при этом фиксированный заголовок остается на месте. В заголовке также есть указатель даты. Поэтому я не могу глобально изменить datepicker.

Вот что я сделал. По общему признанию, это клудж, но он работает, поэтому я подумал, что это может помочь кому-то другому. Надеюсь, в будущем jquery datepicker добавит параметр позиции.

beforeShow: function(input, inst) {
    $("#ui-datepicker-div").css({ "visibility": "hidden", "display": "none" );

    window.setTimeout(function() { 
        var leftPosition = parseInt($(window).width() / 2);
        $("#ui-datepicker-div").css({ "position": "fixed", "top": 0, "left": leftPosition });
        $("#ui-datepicker-div").css({ "visibility": "visible", "display": "inherit" );
    }, 500);
}
person SemanticZen    schedule 06.05.2012

Из документации похоже, что вы могли бы использовать метод 'dialog' плагина datepicker для достижения желаемого результата. Однако использование этого, скорее всего, означает, что вам придется реализовать часть клея, которую вы в противном случае получили бы из коробки с помощью datepicker, например, обработчик обратного вызова для извлечения даты и т. Д.

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

person Joe Holloway    schedule 28.10.2009