Як очистити / скинути вибрані дати в календарі jQuery UI Datepicker?


85

Як скинути значення календаря дати вибору дати? .. Обмеження мінімальної та максимальної дати?

Проблема полягає в тому, що коли я очищаю дати (видаляючи значення текстового поля), попередні обмеження дати все ще застосовуються.

Я перебирав документацію і нічого не вискочило як рішення. Я також не зміг знайти швидке виправлення для пошуку SO / google

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


Рішення:

// 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 () - це приватний метод об'єкта DatePicker. Ви не знайдете його в загальнодоступному API на веб-сайті jQuery UI, але він працює як шарм.

Відповіді:


86

Я намагався виконати саме це, тобто очистити датчик, щоб фільтри, введені користувачем, могли бути видалені. Погугливши трохи, я знайшов цей солодкий шматок коду:

Ви можете додати чітку функцію навіть у поля лише для читання. Просто додайте наступний код до вашого засобу вибору дат:

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

Люди зможуть виділити (навіть поля лише для читання), а потім використовувати клавішу Backspace або клавішу видалення, щоб видалити дату за допомогою _clearDateфункції.

Джерело


9
Ого. Чому б це не розголошувати ?! Він також виключається з API на інтерфейсі jQuery .... немає сенсу. ---- Я відредагував ваш допис, щоб рішення краще відповідало моєму питанню. Дуже приємна знахідка
Кори Даніелсон,

Прийміть мою редакцію, я змінив вашу відповідь, щоб вона відповідала моєму питанню, замість того, щоб бути копією / вставкою неповного коду
Cory Danielson,

Ваша редакція вже не активна? Я не бачу можливості прийняти ваше редагування ... :)
Леніель Маккаферрі,

3
Ні, це нормально. Я думаю, що рішення, включене в мою оригінальну публікацію, і ваше допоможуть майже кожному, хто знайде шлях до цієї сторінки. Можливо, деякі коментарі щодо того, що таке keyCode 8 і 46, або що thisсаме знаходиться всередині _clearDates ()
Кори Даніелсон,

1
де саме ви це ставите?
w0051977

63

Ви пробували:

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

Це має працювати відповідно до документації API


У мене є форма з певним введенням дати, яку я використовую для редагування якоїсь дати, яку хочу заповнити відповідно до поточної дати. Я знаходжу це рішення для скидання моєї форми редагування перед використанням "setDate" із поточною датою, але у мене проблема з форматом: без ('setDate', null)потрібного формату (DD / MM / YYYY) я маю MM, / ДД / РРРР ... єдина різниця полягає у використанні ('setDate', null), будь-яка ідея чому?
Міккаел Леже

Вибачте Мікаелю - я не знаю про це. Ви пробували скинути формат після встановлення дати як нульову відповідно до stackoverflow.com/questions/1328025/… ?
ДевідВейнрайт,

22

Вам просто потрібно знову встановити параметри в null:

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

Я змінив ваш jsfiddle: http://jsfiddle.net/tF5MH/9/


так, дякую. ти маєш рацію. Це смішно, це питання існує навіть на демонстраційній сторінці jQuery UI Datepicker Demo. jqueryui.com/demos/datepicker/#date-range Встановіть дату, потім спустіть текстове поле, і проблема існує
Кори Даніелсон,

1
Напевно, це найчистіший спосіб. date.datepicker( "option" , {setDate: null, minDate: null, maxDate: null} );
AL3X


10

Спробуйте змінити код очищення на:

$('#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

Спробуйте це, це додасть кнопку очищення на календарі Jquery, яка очистить дату.

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

1
Ця відповідь, мабуть, краща за інші, хоча вона не працює у Firefox. А заміна document.getElementById(this.id).value = '';на $(this).val('').change();робить це ще кращим, оскільки тоді також викликаються будь-які встановлені обробники змін.
Райан

3

Скиньте атрибути максимальної дати на вашому засобі вибору дати, коли ви натиснете кнопку очистити.

З веб-сайту jquery

Get or set the maxDate option, after init.

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

Так, ти маєш рацію. Я позначив j08691 як найкращу відповідь, тому що він дав мені якийсь код, який я міг би вдарити в скрипку, яка працювала. На жаль, я не міг позначити їх обох як найкращих: /
Кори Даніельсон

Так, я знаю, я збирався пояснити це трохи краще за допомогою коду щодо вашої проблеми, але він мене побив. :)
Mark W

3

Я знаю, що це вже пізно, але ось простий код коду, який зробив це за мене:

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

Я не бачу, що оновлення робить щось додаткове. Ви можете просто очистити значення.
omarjebari

1
Мені подобається, що ви використовуєте публічний дзвінок проти приватної функції, щоб очистити контроль.
snowYetis

1
@ Мігель БінПар, я знаю, що ця публікація застаріла, але ваша відповідь - це єдина відповідь, яка спрацювала для мене після 3 днів спроб з’ясувати це. Дякую!
kejo

3

Очевидною відповіддю була та, яка спрацювала на мене.

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

де $ ('# datepicker') - ідентифікатор вхідного елемента.


Я спробував це рішення в JSFiddle, і воно не спрацювало. jsfiddle.net/tF5MH/407 Див. кроки відтворення під входами. Використання .val('')призведе до спорожнення введених даних, але не очистить обмеження вибору дати в календарях.
Кори Даніельсон,

Я також спробував використовувати останню версію jQuery UI (v1.12.0), і це не спрацювало.
Cory Danielson

Дякую тоні омару. Я шукав це робоче рішення з останніх 20 хвилин. ти людина, яка рятує життя! ..
Махеш,

0

Модифікована версія рішення Леніеля Макафері з урахуванням того, що клавіша зворотного простору є ярликом "повернення сторінки" в IE8, коли текстове поле не має фокусу (що, здається, має місце у випадку, коли відкриття датчика).

Він також використовує val()для очищення поля, оскільки _clearDate(this)не працював у мене.

$("#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

Моя ініціалізація datepicker виглядає так:

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

Отже, кнопка "Готово" за замовчуванням матиме текст "Очистити" .

Тепер всередині datepicker.js знаходимо внутрішню функцію '_attachHandlers' Це виглядає так:

 _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 () {...}
                    ... 

І змініть функцію приховування, щоб виглядати так:

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

Рішення вийшло з цього * data-handler = "hide" *


0

Я використовую цей код, щоб очистити поле і всі шеннанігани. Мені потрібне було порожнє поле для мого випадку використання

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

З якихось причин .val('')мені не вдасться. Але в обхід jQuery це вдалося. На мій погляд, вадою є те, що немає опції .datepicker (`` ясно '').


0

Мій спосіб вирішити цю проблему

Змініть var 'control' на 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>" : "");

Потім додайте varText var

    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

І перед функцією шоу

$(".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

У Firefox він виконує для мене роботу у формі (програмно), де за замовчуванням контроль вибору дати вимкнений:

$("#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

Будь ласка, спробуйте це рішення, воно буде працювати належним чином, як і я

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

 $('selector').datepicker('setEndDate', 0);
$('selector').datepicker('update');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.