滚动模式时,bootstrap-datepicker 不滚动

Posted

技术标签:

【中文标题】滚动模式时,bootstrap-datepicker 不滚动【英文标题】:bootstrap-datepicker does not scroll when scrolling the modal 【发布时间】:2013-12-27 15:09:11 【问题描述】:

我正在使用bootstrap-datepicker 并希望在引导程序 2 的模式上显示日期选择器。我遇到的问题是日期选择器在滚动模式时没有相应地滚动,它仍然存在。

代码:

<button class="btn btn-primary" data-toggle="modal" data-target="#myModal">Launch Modal</button>
<div id="myModal" class="modal hide fade" style="height: 400px; overflow: scroll">
    <div style="height:300px"></div>
    <div>Choose Date:
        <input class="calendar" />
    </div>
    <div style="height:300px"></div>
</div>

javascript

var datePicker = $(".calendar").datepicker();

jsfiddler:http://jsfiddle.net/csrA5/

有什么办法可以让它在模态滚动的时候滚动吗?

【问题讨论】:

【参考方案1】:

有选项datepicker('place') 来更新位置。我更新了jsfiddle

var datePicker = $(".calendar").datepicker();
var t ;
$( document ).on(
    'DOMMouseScroll mousewheel scroll',
    '#myModal', 
    function()       
        window.clearTimeout( t );
        t = window.setTimeout( function()            
            $('.calendar').datepicker('place')
        , 100 );        
    
);

【讨论】:

这在有滚动条时有效。例如,如果我有引导模式,它在最后一行占据整个屏幕和日期选择器。这种情况怎么处理。日期选择器位于屏幕下方。 我只是将滚动绑定添加到模态而不是文档。但它工作得很好。谢谢!! 请看这个小提琴。我用这个解决了类似的问题***.com/questions/12351871/…jsfiddle.net/jbK6a/15【参考方案2】:

这是使用 jQuery 的另一种方式

var checkout = $(".calendar").datepicker();
$( "#myModal" ).scroll(function() 
    $('.calendar').datepicker('place')
);

【讨论】:

checkout 变量现在使用了吗?【参考方案3】:

尝试在bootstrap-datepicker.js,函数“Datepicker.prototype”中添加事件滚动

[$(window), 
                resize: $.proxy(this.place, this),
                scroll: $.proxy(this.place, this)
            ]

【讨论】:

【参考方案4】:

我不知道为什么,但是定位是基于滚动的,所以你需要在 bootstrap-datepicker.js 中找到这段代码

scrollTop = $(this.o.container).scrollTop();

并将其重写为

scrollTop = 0;

这对我有帮助,我希望它可以帮助其他人。

【讨论】:

【参考方案5】:

rab 提供的解决方案有效,但仍不完美,因为日期选择器在引导模式滚动时闪烁。所以我使用jquery的滚动事件来实现datepicker的平滑位置变化。 这是我的代码:

    $( document ).scroll(function()
        $('#modal .datepicker').datepicker('place'); //#modal is the id of the modal
    );

【讨论】:

【参考方案6】:

在我的项目中使用引导日期选择器时,我也遇到了同样的问题。我使用了另一种方法,在 bootstrap-datepicker.js 内的 datepicker 模板内创建了一个隐藏的透明层(使用类名 'hidden-layer-datepicker')并给出固定位置并占据html的全部高度和宽度。

    DPGlobal.template = '<div class="datepicker">'+ '<span class="hidden-layer-datepicker"></span><div class="datepicker-days">

现在当 datepicker modal 弹出时,新创建的 layer 将占据整个页面的宽度和高度,当用户滚动时,因为 modal 附加到 body,datepicker modal 也随之滚动。随着新层的引入,存在日期选择器输入字段的容器的内部滚动将在模式打开时被否定。

要做的另一件事是在单击隐藏层时更新 datepicker 模式关闭事件,这是使用 bootstrap-datepicker.js 中的以下代码完成的。

    // Clicked outside the datepicker, hide it
                    if (!(
                        this.element.is(e.target) ||
                        (this.picker.find(e.target).length && e.target.className != "hidden-layer-datepicker") ||
                        this.picker.is(e.target) ||
                        this.picker.find(e.target).length
                    ))
                        this.hide();
                    

【讨论】:

【参考方案7】:

我在使用 Stefan Petre 版本的 Bootstrap-datepicker (https://www.eyecon.ro/bootstrap-datepicker) 时也遇到了这个问题,问题是 Datepicker 元素附加到主体上,这意味着它会随着主体滚动,在大多数情况下很好,但是当你有一个可滚动的模式,您需要将 Datepicker 附加到可滚动模式的 div,所以我的解决方法是更改​​ Stefan 的 bootstrap-datepicker.js 如下 -

第 28 行,更改

  .appendTo('body')

  .appendTo(element.offsetParent)

和第 153 行,更改

  var offset = this.component ? this.component.offset() : this.element.offset();

  var offset = this.component ? this.component.position() : this.element.position();

早期测试表明它可以完美滚动。

此外,您可能需要更改 Datepicker 元素的 z 顺序以使其位于模式上方(这是我最初的修复,不处理滚动,我尚未支持此更改,所以不知道是否它仍然需要)

我还没有检查过,但我怀疑 Github 版本的 Bootstrap-datepicker.js 正在做同样的事情(虽然源代码与我从 Stefan 那里得到的有很大不同)

【讨论】:

以上是关于滚动模式时,bootstrap-datepicker 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

在更改时验证 bootstrap-datepicker 字段

bootstrap-datepicker 在点击时没有响应

使用 bootstrap-datepicker 时如何不显示移动键盘?

清除 bootstrap-datepicker 的值

Bootstrap-datepicker 位于页面的左上角

使用带有 HTMX 的 bootstrap-datepicker