nazar-pc / PickMeUp

Really simple, powerful, customizable and lightweight standalone datepicker
BSD Zero Clause License
616 stars 190 forks source link

Event pickmeup-change #199

Closed promo360 closed 6 years ago

promo360 commented 6 years ago

Привет! Спасибо за данный модуль, лучший из datepicker'ов.

Столкнулся с ситуацией, когда нужно, чтобы при set_date срабатывало событие pickmeup-change, либо нужен доп. метод, чтобы принудительно вызывать это событие.

На данный момент все сработает хорошо, если убрать эту проверку: https://github.com/nazar-pc/PickMeUp/blob/7c82388c8eadc0c6660037f67b794a09f50a1b13/js/pickmeup.js#L1160

Зачем вообще она нужна?

promo360 commented 6 years ago

Пример: https://jsfiddle.net/7hr6n23h/1/

На 114 строке в JS вызываю метод установки периода: setDate('month');

Он устанавливается в pickmeup через: pickmeup('.jsPickmeupInit').set_date(date); на 109 строке,

но не срабатывает inputEl.addEventListener('pickmeup-change', function(e) { на 21 строке,

поэтому в кнопке остается надпись "Выбрать период", хотя должно быть "21 апр - 22 мая 2018".

promo360 commented 6 years ago

Понял зачем нужна эта проверка, чтобы событие change не срабатывало каждый раз при фокусировке на инпуте. Нужно что-то другое придумать..

promo360 commented 6 years ago

Сделал вот такой костыль https://jsfiddle.net/7hr6n23h/3/

Добавил функцию (почти копия той, что используется в pickmeup.js)

function dom_dispatch_event(element, detail) {
    var e = document.createEvent('Event');
    e.detail = detail;
    e.initEvent('pickmeup-change', false, true);
    return element.dispatchEvent(e);
  }

И вызываю эту функцию сразу после set_date, получается так:

pickmeup('.jsPickmeupInit').set_date(date);

dom_dispatch_event($('.jsPickmeupInit')[0], {
    date: date,
    formatted_date: []
});

Если есть решение лучше - буду благодарен.

nazar-pc commented 6 years ago

Если вы ловите pickmeup-change, то у вас есть функция обработчик этого события. Вынесите её отдельно и дайте имя. После этого вызывайте не dom_dispatch_event, а эту новую функцию напрямую. Это и проще и чище в плане кода.

promo360 commented 6 years ago

Спасибо, хорошая идея.

nazar-pc commented 6 years ago

Пока закрываю issue, но не стесняйтесь комментировать дальше если необходимо. Для новых вопросов/багов создавайте новые issue.