jquery - 通过 Bootstrap 日期选择器的下拉菜单更改 View 的问题

标签 jquery twitter-bootstrap bootstrap-datepicker

当我尝试根据下拉列表中选择的模式更改日期选择器的 View 时,我遇到了 Bootstrap 日期选择器的问题。

以下是 HTML 代码:

Mode : <select id="mode">
    <option value="1">Day</option>
    <option value="2">Month</option>
    <option value="3">Year</option>
</select>
<br><br>
From : <input type="text" id="from" /> 
&nbsp;To : <input type="text" id="to" />

jQuery 代码:

$("#from").datepicker({
            autoclose: true,
            startDate: '+1d',
            endDate: '+1y',
            clearBtn: true,
            todayHighlight: true,
});
$("#to").datepicker({
    autoclose: true,
    startDate: '+1d',
    endDate: '+1y',
    clearBtn: true,
    todayHighlight: true,
    orientation: "top right"
});

$("#mode").change(function(){
    jQuery("#to").removeAttr('disabled');
    $("#from").val('');
    $("#to").val('');
    $("#from").datepicker('update');
    $("#to").datepicker('update');
    $("#from").datepicker("remove");
    $("#to").datepicker("remove");
    if ($(this).val() == 2){
        $("#from").datepicker({
            autoclose: true,
            startDate: '0',
            endDate:'+1y',
            startView: 1,
            minViewMode: 1,
            clearBtn: true,
        });
        $("#to").datepicker({
            autoclose: true,
            startDate: '0',
            startView: 1,
            endDate:'+1y',
            minViewMode: 1,
            clearBtn: true,
            orientation: "top right"
        });
        $("#from").datepicker().on("clearDate", function(){
            $("#to").val('');
            $("#to").datepicker('update');
        });
        $("#to").datepicker().on("clearDate", function(){
            $("#from").val('');
            $("#from").datepicker('update');
        });

        $("#from").datepicker().on("changeDate", function(){
            var fromDate    = $("#from").datepicker("getDate");
            if (fromDate != "Invalid Date" && fromDate != '' ) {
                fromDate.setMonth(fromDate.getMonth() + 1, 1);
                $("#to").datepicker("setDate", fromDate);
                $("#to").datepicker("setStartDate", fromDate);
                $("#to").datepicker("update");
            }
        });
        $("#to").datepicker().on("changeDate", function(){
            var toDate  = $("#to").datepicker("getDate");
            if (toDate != "Invalid Date") {
                $("#from").datepicker("setEndDate", toDate);
                $("#from").datepicker("update");
            }
        });
    }else if($(this).val() == 3){
        jQuery("#to").attr('disabled', 'disabled');
        $("#from").datepicker({
            autoclose: true,
            startDate: '0',
            endDate:'+1y',
            startView: 0,
            minViewMode: 0,
            clearBtn: true,
        });

        //clear event for the datepicker
        $("#from").datepicker().on("clearDate", function(){
            $("#to").val('');
            $("#to").datepicker('update');
        });
        $("#to").datepicker().on("clearDate", function(){
            $("#from").val('');
            $("#from").datepicker('update');
        });

        //set startdate event for the datepicker
        $("#from").datepicker().on("changeDate", function(){
            var fromDate    = $("#from").datepicker("getDate");
            if (fromDate != "Invalid Date") {
                fromDate.setDate(fromDate.getDate() + 365);
                $("#to").datepicker("setDate", fromDate);
                $("#to").datepicker("setStartDate", fromDate);
            }
        });
        $("#to").datepicker().on("changeDate", function(){
            var toDate  = $("#to").datepicker("getDate");
            if (toDate != "Invalid Date") {
                $("#from").datepicker("setEndDate", toDate);
            }
        });
    }else{
        $("#from").datepicker({
            autoclose: true,
            startDate: '+1d',
            endDate: '+1y',
            clearBtn: true,
            todayHighlight: true,
        });
        $("#to").datepicker({
            autoclose: true,
            startDate: '+1d',
            endDate: '+1y',
            clearBtn: true,
            todayHighlight: true,
            orientation: "top right"
        });
    }
});

我想做的是,我有三种类型的模式:日、月和年。当我在下拉列表中选择月份时,在其更改事件上,我需要删除与日期选择器绑定(bind)的所有先前事件,并将新事件与日期选择器绑定(bind)。

但是,多次更改模式后,事件不再绑定(bind),并且停止在输入框中设置值。

我不确定这是否是正确的方法,如果有任何其他方法可以做到这一点,那么它将非常有帮助。

如有任何帮助,我们将不胜感激。提前致谢。

这是代码的jsfiddle链接:http://jsfiddle.net/tejashsoni111/aL9vB/2/

这是文档的链接:http://bootstrap-datepicker.readthedocs.org/en/release/

最佳答案

只有一种方法,为您的日期/时间选择器创建一个原型(prototype),如下所示

<div id="fake_from_container" style="display:none">
<input type="text" class="fake_text" /> 
</div>
<div id="from_container>
</div>

然后每当您想初始化日期/时间选择器时,请尝试

$('#from_container').html($('#fake_from_container').html());
$('.fake_text', $('#from_container')).attr('id', 'from');

$("#from").datepicker().....

想法是:首先,fake_from_container只是存储输入的html代码, 每次您想要重新初始化日期/时间选择器时,您都将从头开始创建输入,方法是将 html 代码从 $('#fake_from_container') 复制到 $('#from_container'),之后,#from_container 将是

<div id="from_container>
    <input type="text" class="fake_text" /> 
</div>

然后,在#from_container中设置输入项的id

$('.fake_text', $('#from_container')).attr('id', 'from');

你将会拥有

<div id="from_container>
    <input type="text" class="fake_text" id='from' /> 
</div>

然后,您可以使用任何选项来初始化日期/时间选择器以获取新输入#from

关于jquery - 通过 Bootstrap 日期选择器的下拉菜单更改 View 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23956152/

相关文章:

javascript - 在不同的span元素上触发类似的JQuery元素

html - Bootstrap 导航栏列表下拉列表扩展得太宽

css - Bootstrap 工具提示被切断

jquery - 在日期选择后将 Bootstrap DatePicker 设置为只读

javascript - 调用初始函数后访问 jQuery 对象

javascript - 使用 jQuery deferred、javascript 确定循环中触发的可变数量异步进程的分辨率

javascript - 更改 Bootstrap Datepicker 日期范围的可选范围

javascript - bootstrap-datepicker 双插件和 stopPropagation

jquery - 像按钮变化有过渡效果

jquery - 悬停时如何为 Bootstrap 卡制作动画?