2009-10-06 125 views
15

我在页面底部的position: fixed工具栏中使用jQuery UI的datepicker控件。偶尔,在随机电脑上,日期选择器出现在工具栏下方,这意味着它离开页面并且不可能查看或与之交互。让jQuery UI的datepicker总是在某个方向打开?

有没有办法强制datepicker控件的位置始终位于其<input>的右上方?

+0

Firebug中没有错误。 – ceejayoz 2009-10-27 18:45:31

+0

你能更好地修正错误的随机性吗?某些版本的Firebug弄乱了页面高度偏移元素,理论上可能会对结果负责。或者我们正在谈论Internet Explorer? – Frankie 2009-11-02 16:56:42

+0

适用于IE,Safari和Firefox。 – ceejayoz 2009-11-02 19:08:52

回答

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; 

这失去弹性,虽然。如果您的输入恰好位于页面的顶部,您将遇到与之前相反的问题。

+0

谢谢。日期选择器绝对不在页面的顶部,这是一个非常有限的系统,所以我可以合理确定地说它会保持这种状态。将尝试这一点,但如果任何人有一个解决方案,不需要编辑核心jQuery UI代码,这将是很好的。 – ceejayoz 2009-10-27 18:47:44

+0

没有问题。我希望那里*是一个更好的解决方案... – Kev 2009-10-27 19:08:08

+6

有一种方法可以在不编辑核心源文件的情况下完成,请参阅下面的答案。国际海事组织应该有一个选项来禁用自动定位功能。 – Purrell 2009-11-30 22:46:30

0

从文档看来,您可能可以使用datepicker插件的'dialog' method来实现预期的结果。然而,使用这个最有可能意味着你将不得不实现一些你会用datepicker获得开箱即用的粘合剂,例如提取日期的回调处理程序等。

我试过了去模拟一些代码来看看它是否在行动中,并且没有让日期选择器显示出来,但是我无法完成它的工作。无论如何,如果你比我有更好的运气,我想指出你的意见。

10

问题是该元素的位置:固定显示顶部位置0px(检查: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> 
+1

我知道这是一个较旧的帖子,但它是唯一对所有发布的解决方案都适用的解决方案。 jmav,谢谢。 – Travis 2010-07-27 20:33:51

19

只有这样,才能肯定(对日期选择器的jQueryUI的版本)是禁用,试图使里面的日期选择器的功能视口。这里有一个办法做到这一点无需修改源代码文件:

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

介绍jQuery UI尝试更高版本:

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

这只是核弹内的日期选择器功能_checkOffset,使得它疯狂的。然后,您可以使用.ui-datepicker css来确保它保持固定,如果这就是你所追求的。更多信息在how-to-control-positioning-of-jqueryui-datepicker

+0

请试试看,谢谢! – ceejayoz 2009-11-30 22:58:17

+0

非常感谢。多么痛苦! – 2010-06-17 23:30:57

+0

@Purell你是明星!一直在寻找这个年龄段,尝试了很多不同的方法,这是迄今为止唯一最稳固的解决方案。谢谢堆。 – Philzen 2016-08-10 09:40:08

1

我有类似的问题。我有一个包含日期选择器的页面,这些日期选择器可以用在页面上的各种日期选择器中,但也包含在固定标题中,用户可以在固定标题保持原位的情况下在水平和垂直方向上滚动页面。标题也有一个日期选择器。所以我不能做一个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); 
}