jQuery UI DatePicker 没有出现在通过 Ajax 加载的 Bootbox 模式中

Posted

技术标签:

【中文标题】jQuery UI DatePicker 没有出现在通过 Ajax 加载的 Bootbox 模式中【英文标题】:jQuery UI DatePicker not appearing inside Bootbox modal loaded through Ajax 【发布时间】:2015-12-25 19:50:35 【问题描述】:

我需要将表单动态加载到 Bootbox 模式窗口中。我正在通过 Ajax 加载表单。表单中有一个 jQuery UI datepicker 字段。

使用浏览器的调试器,当通过 Ajax 加载表单时,我可以看到添加到 DOM 的 datepicker 元素。但是,单击该字段不会执行任何操作。日历没有出现,更重要的是,日期选择器 DOM 元素不会像我直接在页面上加载日期选择器字段时那样发生变化。

这是我在索引页面中的 Ajax 调用:

$.ajax(
    type: "post",
    timeout: "100000",
    url: "/cfc/site_functions.cfc",
    beforeSend: function () 
        bootbox.dialog(
            message: "Loading...",
            title: modal_title,
            onEscape:false,
            backdrop:true,
            closeButton:true,
            buttons: 
                "Cancel": 
            
        );
    ,
    data: 
        method: "buildMyForm"
    ,
    success: function(objResponse)
        $(".bootbox-body").html(objResponse);
    ,
    error: function(xhr, ajaxOptions, thrownError)
        $(".bootbox-body").html("Error loading form.");
    
);

这是由 Ajax 调用调用的 Coldfusion 函数,它构建表单并初始化 datepicker 字段:

<cffunction name="buildMyForm" access="remote" returntype="any" returnformat="plain">

    <cfsavecontent variable="local.buildMyForm">

        <script type="text/javascript">
            $(document).ready(function(e) 
                $("#date_posted").datepicker(
                    showAnim: "slide"
                );
            );
        </script>

        <cfoutput>

            <form method="post" id="edit_form" name="edit_form">

                <div class="form-group">
                    <label for="date_posted" class="required">Date</label>
                    <input type="text" class="form-control" id="date_posted" name="date_posted" required autocomplete="off">
                </div>

            </form>

        </cfoutput>
    </cfsavecontent>

    <cfreturn local.buildMyForm>
</cffunction>

有什么想法为什么 datepicker 元素会初始化,但是当您单击日期字段时却不起作用?有一个类似的问题,但它的解决方案是更新 CSS,因为 datepicker 日历显示的 z-index 低于 Bootbox 模式。但是,就我而言,当您单击日期字段时,根本不会填充 datepicker 元素,因此这不仅仅是隐藏它的问题。

【问题讨论】:

也许尝试将.datepicker() 调用移到.html() 之后的成功函数中,而不是在ColdFusion 函数中。由于ajax 负载,不能触发$(document).ready(function(e) ); 不走运。我首先将其从功能中删除并刷新。然后我尝试在模式中打开表单,并且 datepicker 元素从未出现在 DOM 中 - 正如预期的那样。然后我在.html() 之后添加了datepicker() 调用,再次,datepicker 元素被初始化并出现在 DOM 中,但单击该字段没有任何作用。 控制台有错误吗? 不,没有错误。 你能在 Fiddle/Codepen 中重现这个吗?我试过了,但一切正常:codepen.io/anon/pen/gaLBwp 【参考方案1】:

感谢 @EdenSource 帮助缩小问题范围。

似乎在触发日期选择器代码时可能存在一些竞争。我更新了 CFC 中的 javascript(由 ajax 函数调用以构建表单的代码)并且它起作用了:

<script type="text/javascript">
    $(document).ready(function(e) 
        $("#date_posted").on("focus",function()
            if(!$(this).hasClass("hasDatepicker"))
                $(this).datepicker(
                    showAnim: "slide"
                );
                $(this).addClass("hasDatepicker");
                $(this).datepicker("show");
            
        );
    );
</script>

【讨论】:

以上是关于jQuery UI DatePicker 没有出现在通过 Ajax 加载的 Bootbox 模式中的主要内容,如果未能解决你的问题,请参考以下文章

Jquery-ui Datepicker 未显示在 Rails 视图中,出现错误 Uncaught TypeError: $(...).datepicker is not a function

jQuery datepicker 没有出现在 asp.net 文本框控制器中

如何在 jquery-ui datepicker 中禁用动画?

jquery UI datepicker 月份和年份只有 css 定位问题

jQuery UI Datepicker 没有正确选择选项

使用 jquery 验证和 jquery-ui datepicker