【问题标题】:How to dynamically create bootstrap datepicker?如何动态创建引导日期选择器?
【发布时间】:2017-02-25 07:24:49
【问题描述】:

我需要使用 jQuery 动态创建一个日期选择器。在我的表单中,我将有按钮来创建日期选择器。

以下是我目前尝试的代码:

<div id="examDatesContainer">
    <div class="form-group">
        <label for="examDate" class="col-sm-2 caption">
            <fmt:message key="exam.date"/>:<strong style="font-size:14px;" class="asterisk">*</strong>
        </label>
        <div class="col-sm-4">
            <div class="input-group date">
                <input type="datetime" class="form-control examDate" id="examDate" name="examDate" value="" readonly >
                <div class="input-group-addon" class="examDateCalendarIcon">
                    <i class="fa fa-calendar"></i>
                </div>
            </div>
            <div class="help-block with-errors"></div>
        </div>
    </div>

    <div class="form-group examDateTemplate" style="display: none;">
        <label for="examDate" class="col-sm-2 caption"></label>
        <div class="col-sm-4">
            <div class="input-group date">
                <input type="datetime" class="form-control examDate" name="examDate" value="" readonly >
                <div class="input-group-addon" class="examDateCalendarIcon">
                    <i class="fa fa-calendar"></i>
                </div>
                <div class="input-group-addon">
                    <i class="fa fa-minus-circle"></i>
                </div>
            </div>
        </div>
    </div>

</div>

<div class="form-group">
    <label for="examDate" class="col-sm-2 caption">
    </label>
    <div class="col-sm-4">
        <button id="addExamDateBtn" type="button" class="btn btn-sm btn-primary">
            <span class="fa fa-plus"> &nbsp;</span>
            <fmt:message key="add"/>
        </button>
    </div>
</div>

JavaScript 代码如下:

$("#addExamDateBtn").click(function(){
    var examDateClonedObj = $(".examDateTemplate").clone();
    $(examDateClonedObj).removeClass("examDateTemplate");
    $(examDateClonedObj).appendTo("#examDatesContainer");
    $(examDateClonedObj).show();
    $('.datepicker').datetimepicker('update');
});

$('.examDate').datetimepicker({
    format: 'DD/MM/YYYY',
    ignoreReadonly: true,
    showTodayButton: true
});

基本上我最初只显示一个日期选择器。然后我有一个按钮来添加更多的日期选择器。日期选择器的模板是隐藏的,点击“添加更多”按钮我只是克隆它并将其添加到 DOM。

【问题讨论】:

    标签: twitter-bootstrap bootstrap-datetimepicker


    【解决方案1】:

    使用下面的代码

    $('body').on('focus',".examDate", function(){
      $(this).datetimepicker({
       format: 'DD/MM/YYYY',
       ignoreReadonly: true,
       showTodayButton: true
     });
    });
    

    这样动态创建的元素也可以初始化datetimepicker。

    发布了一个工作示例:Jsfiddle

    【讨论】:

    • 这行得通。但是,在您单击文本字段之前,第一次单击图标不起作用。单击文本字段后,只有单击日历图标有效。
    【解决方案2】:
    $('body').on('DOMNodeInserted', function (e) {
        if (e.target.classList.contains('datepicker-container')) {
            $('.datepicker').datepicker({
                format: 'DD/MM/YYYY',
                ignoreReadonly: true,
                showTodayButton: true
            });
        }
    })
    

    每次将 datepicker-container(显然包含 datepicker)添加到 DOM 时,都会初始化 datepicker。这就是我解决这个问题的方法,希望这对将来有所帮助。

    更新

    现在不推荐使用 DOMInsertedNode 一段时间。相反,您可以使用 MutationObservers 尝试基于以下内容。

    new MutationObserver(function (mutations) {
        var selector = ".datepicker";
        // look through all mutations that just occured
        for (var i = 0; i < mutations.length; ++i) {
            // look through all added nodes of this mutation
            for (var j = 0; j < mutations[i].addedNodes.length; ++j) {
                var target = mutations[i].addedNodes[j];
    
                if (target && target.nodeType === Node.ELEMENT_NODE) {
                    var children = $(target).find(selector);
    
                    if (target.matches(selector)) {
                        $(target).datepicker({
                            format: 'DD/MM/YYYY',
                            ignoreReadonly: true,
                            showTodayButton: true
                        });
                    }
                    else if (children.length > 0) {
                        children.each(function () {
                            $(this).datepicker({
                                format: 'DD/MM/YYYY',
                                ignoreReadonly: true,
                                showTodayButton: true
                            });
                        });
                    }
                }
            }
        }
    }).observe(document.querySelector("body"), {
        childList: true,
        subtree: true
    });
    

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 2021-06-16
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多