Làm cách nào để xóa / đặt lại các ngày đã chọn trên lịch Người chọn ngày giao diện người dùng jQuery?


85

Làm cách nào để đặt lại các giá trị lịch của trình chọn ngày? .. Giới hạn ngày tối thiểu và tối đa?

Vấn đề là khi tôi xóa ngày (bằng cách xóa các giá trị hộp văn bản), các giới hạn ngày trước đó vẫn được áp dụng.

Tôi đã phân loại tài liệu và không có giải pháp nào được đưa ra. Tôi cũng không thể tìm thấy cách khắc phục nhanh chóng trên tìm kiếm SO / google

http://jsfiddle.net/CoryDanielson/tF5MH/


Giải pháp:

// from & to input textboxes with datepicker enabled
var dates = $("input[id$='dpFrom'], input[id$='dpTo']");

// #clearDates is a button to clear the datepickers
$('#clearDates').on('click', function(){
    dates.attr('value', '');
    dates.each(function(){
        $.datepicker._clearDate(this);
    });
});​​

_.clearDate () là một phương thức riêng của đối tượng DatePicker. Bạn sẽ không tìm thấy nó trong API công khai trên trang web của jQuery UI, nhưng nó hoạt động như một sự quyến rũ.

Câu trả lời:


86

Tôi đã cố gắng hoàn thành điều này, đó là làm trống bộ chọn ngày để các bộ lọc do người dùng nhập vào có thể bị xóa. Tìm kiếm trên Google một chút, tôi tìm thấy đoạn mã thú vị này:

Bạn có thể thêm tính năng rõ ràng ngay cả trên các trường chỉ đọc. Chỉ cần thêm mã sau vào trình chọn ngày của bạn:

}).keyup(function(e) {
    if(e.keyCode == 8 || e.keyCode == 46) {
        $.datepicker._clearDate(this);
    }
});

Mọi người sẽ có thể đánh dấu (ngay cả các trường Chỉ đọc) và sau đó sử dụng phím xóa lùi hoặc xóa để xóa ngày sử dụng _clearDatechức năng.

Nguồn


9
Chà. Tại sao điều đó không được công khai ?! Nó cũng bị loại khỏi API trên giao diện người dùng jQuery .... không có ý nghĩa gì. ---- Tôi đã chỉnh sửa bài đăng của bạn để giải pháp phù hợp hơn với câu hỏi của tôi. Rất đẹp find
Cory Danielson

chấp nhận chỉnh sửa của tôi, tôi tinh chỉnh câu trả lời của bạn để phù hợp với câu hỏi của tôi thay vì trở thành một sao chép / dán bãi mã đầy đủ
Cory Danielson

Chỉnh sửa của bạn chưa hoạt động? Tôi không thể nhìn thấy một tùy chọn để chấp nhận chỉnh sửa của bạn ... :)
Leniel Maccaferri

3
Không sao đâu. Tôi nghĩ rằng cả giải pháp được bao gồm trong bài đăng gốc của tôi và của bạn sẽ giúp hầu hết mọi người tìm thấy đường đến trang này. Có lẽ một số ý kiến về những gì keyCode 8 và 46 là hoặc những gì thislà chính xác bên trong _clearDates ()
Cory Danielson

1
chính xác thì bạn đặt cái này ở đâu?
w0051977 14/09/17

63

Bạn đã thử chưa:

$('selector').datepicker('setDate', null);

Điều đó sẽ hoạt động theo tài liệu API


Tôi có một biểu mẫu với một số đầu vào trình chọn ngày mà tôi sử dụng để chỉnh sửa một số ngày mà tôi muốn điền theo ngày hiện tại. Tôi tìm thấy giải pháp này để đặt lại biểu mẫu chỉnh sửa của mình trước khi sử dụng "setDate" với ngày hiện tại, nhưng tôi gặp sự cố về định dạng: không ('setDate', null)có định dạng tôi muốn (DD / MM / YYYY) , nhưng khi sử dụng, tôi có MM / DD / YYYY ... sự khác biệt duy nhất là việc sử dụng ('setDate', null), bất kỳ ý tưởng tại sao?
Mickaël Leger

Xin lỗi Mickael - tôi không biết về điều đó. Bạn đã thử đặt lại định dạng sau khi đặt ngày thành rỗng theo stackoverflow.com/questions/1328025/… chưa?
DavidWainwright,

22

bạn chỉ cần đặt lại các tùy chọn thành null:

dates.datepicker( "option" , {
    minDate: null,
    maxDate: null} );

Tôi đã thay đổi jsfiddle của bạn: http://jsfiddle.net/tF5MH/9/


vâng, cảm ơn. bạn hoàn toàn đúng. Thật buồn cười, vấn đề này thậm chí còn tồn tại trên trang Demo của jQuery UI Datepicker. jqueryui.com/demos/datepicker/#date-range Đặt cho đến nay, sau đó trống textbox và vấn đề tồn tại
Cory Danielson

1
Đây là cách sạch nhất, chắc chắn. date.datepicker( "option" , {setDate: null, minDate: null, maxDate: null} );
AL3X


10

Thử thay đổi mã thanh toán bù trừ thành:

$('#clearDates').on('click', function(){
    dates.attr('value', '');
    $("input[id$='dpFrom'], input[id$='dpTo']").datepicker( "option", "maxDate", null );
    $("input[id$='dpFrom'], input[id$='dpTo']").datepicker( "option", "minDate", null );
});

8

Hãy thử cái này, cái này sẽ thêm nút xóa trên lịch truy vấn sẽ xóa ngày.

$("#DateField").datepicker({
    showButtonPanel: true,
    closeText: 'Clear',
         onClose: function (dateText, inst) {
        if ($(window.event.srcElement).hasClass('ui-datepicker-close'))
        {
            document.getElementById(this.id).value = '';
        }
    }
});

1
Câu trả lời này có lẽ tốt hơn những câu khác mặc dù nó không hoạt động trên Firefox. Và thay thế document.getElementById(this.id).value = '';bằng $(this).val('').change();làm cho nó thậm chí còn tốt hơn vì sau đó bất kỳ trình xử lý thay đổi đã thiết lập nào cũng được gọi.
Ryan

3

Đặt lại thuộc tính ngày tối đa trên bộ chọn ngày của bạn khi bạn nhấp vào xóa.

Từ trang web jquery

Get or set the maxDate option, after init.

    //getter
    var maxDate = $( ".selector" ).datepicker( "option", "maxDate" );
    //setter
    $( ".selector" ).datepicker( "option", "maxDate", '+1m +1w' );

Vâng, bạn chính xác. Tôi đã đánh dấu j08691's là câu trả lời hay nhất vì anh ấy đã cho tôi một số mã mà tôi có thể áp dụng vào trò chơi đã hoạt động. Thật không may, tôi không thể đánh dấu cả hai là tốt nhất: /
Cory Danielson

Vâng, tôi biết, tôi đã định giải thích nó tốt hơn một chút với một số mã liên quan đến vấn đề của bạn, nhưng anh ấy đã đánh bại tôi. :)
Mark W

3

Tôi biết là hơi muộn, nhưng đây là một đoạn mã đơn giản đã làm được điều đó cho tôi:

$('#datepicker-input').val('').datepicker("refresh");

Tôi không thể thấy rằng làm mới có thêm bất kỳ điều gì. Bạn chỉ có thể xóa giá trị.
omarjebari

1
Tôi thích rằng bạn đang sử dụng chức năng gọi công khai so với chức năng riêng tư để xóa kiểm soát.
snowYetis

1
@Miguel BinPar, tôi biết bài đăng này đã cũ nhưng câu trả lời của bạn là câu trả lời duy nhất phù hợp với tôi sau 3 ngày cố gắng tìm ra điều này. Cảm ơn!
kejo

3

Câu trả lời rõ ràng là câu trả lời phù hợp với tôi.

$('#datepicker').val('');

trong đó $ ('# datepicker') là id của phần tử đầu vào.


Tôi đã thử giải pháp đó trong JSFiddle và nó không hoạt động. jsfiddle.net/tF5MH/407 Xem các bước tái tạo bên dưới các đầu vào. Việc sử dụng .val('')sẽ làm trống các đầu vào, nhưng không xóa các hạn chế của bộ chọn ngày trong lịch.
Cory Danielson

Tôi cũng đã thử với phiên bản mới nhất của jQuery UI (v1.12.0) và nó không hoạt động.
Cory Danielson

Cảm ơn rất nhiều omar. Tôi đã tìm kiếm giải pháp làm việc này từ 20 phút trước. bạn là một người đàn ông tiết kiệm cuộc sống! ..
Mahesh

0

Một phiên bản sửa đổi của giải pháp của Leniel Macaferi nhằm giải thích cho phím xóa lùi là phím tắt "quay lại trang" trong IE8 khi trường văn bản không có tiêu điểm (trường hợp này xảy ra khi trình chọn ngày đang mở).

Nó cũng sử dụng val()để xóa trường vì _clearDate(this)không hoạt động đối với tôi.

$("#clearDates").datepicker().keyup(function (e) {
    // allow delete key (46) to clear the field
    if (e.keyCode == 46)
        $(this).val("");

    // backspace key (8) causes 'page back' in IE8 when text field
    // does not have focus, Bad IE!!
    if (e.keyCode == 8)
        e.stopPropagation();
});

0

Quá trình khởi tạo trình chọn ngày của tôi trông giống như sau:

    dateOptions = {
                changeYear: true,
                changeMonth: true,
                dateFormat: 'dd/mm/yy',
                showButtonPanel: true,
                closeText: 'Clear',
            };

Vì vậy, nút 'Xong' mặc định sẽ có văn bản 'Xóa' .

Bây giờ, bên trong datepicker.js tìm thấy hàm nội bộ '_attachHandlers' Có vẻ như:

 _attachHandlers: function (inst) {
            var stepMonths = this._get(inst, "stepMonths"),
                id = "#" + inst.id.replace(/\\\\/g, "\\");
            inst.dpDiv.find("[data-handler]").map(function () {
                var handler = {
                    prev: function () {...},
                    next: function () {...},
                    hide: function () {
                        $.datepicker._hideDatepicker();
                    },
                    today: function () {...}
                    ... 

Và thay đổi chức năng ẩn để trông giống như:

                   ...
                   hide: function () {
                        $.datepicker._clearDate(id);
                        $.datepicker._hideDatepicker();
                    },
                    ...

Giải pháp đến từ * data-handler = "hide" * này


0

Tôi sử dụng mã này để xóa hiện trường và tất cả các trò tai quái. Tôi cần một trường trống cho trường hợp sử dụng của mình

jQuery.datepicker._clearDate(window.firstDay);
window.firstDay.datepicker('setDate',null);
window.firstDay[0].value = '';

Vì một số lý do .val('')không phù hợp với tôi. Nhưng bỏ qua jQuery đã làm được. Theo tôi, đó là một lỗ hổng khi không có tùy chọn .datepicker ('clear').


0

Cách của tôi để giải quyết vấn đề này

Thay đổi 'điều khiển' var trên ui.js

controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        this._get(inst, "closeText") + "</button>" + "<button type='button' class='ui-datepicker-close ui-datepicker-clear ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
        this._get(inst, "clearText") + "</button>" : "");

Sau đó, thêm một var clearText

    this.regional[""] = { // Default regional settings
    closeText: "Done", // Display text for close link
    clearText: "Clear", // Display text for close link
    prevText: "Prev", // Display text for previous month link

Và trước khi hiển thị chức năng

$(".i_date").datepicker
(
    {
        beforeShow: function (input, inst)
        {
            setTimeout
            (
                function () 
                { 
                    $('.ui-datepicker-clear').bind('click', function() { $(input).val(''); });
                }, 
                0
            );
        }
    }
);

0
$("#datepicker").datepicker({            
        showButtonPanel: true,
        closeText: 'Clear', 
        onClose: function () {
            var event = arguments.callee.caller.caller.arguments[0];                
            if ($(event.delegateTarget).hasClass('ui-datepicker-close')) {
                $(this).val('');
            }
        }
    });

0

Trong Firefox, nó thực hiện công việc đối với tôi ở dạng (theo lập trình), trong đó kiểm soát bộ chọn ngày bị tắt theo mặc định:

$("#txtDat2").prop('disabled', false); //temporary enable controls<br>
$("#txtDat2").val("YYYY-MM-DD"); //reset date to dd.mm.yyyyy
$("#txtDat2").prop('disabled', true); //back to default state

-1

Vui lòng thử giải pháp này, nó sẽ hoạt động bình thường như tôi đã thử

$('selector').datepicker('setStartDate', 0);

 $('selector').datepicker('setEndDate', 0);
$('selector').datepicker('update');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.