JQuery UI datepicker не скрывает, когда клик снаружи
Я обнаружил проблему с JQuery UI Datepicker на моем сайте.
Когда я нажимаю на ввод, он действительно показывает средство datepicker
. Тем не менее, когда я не выбираю какую-либо дату и просто щелкаю вне элемента, она не скрывает средство выбора даты, как я ожидал.
Когда я нажимаю Esc, он исчезает, когда я выбираю день, он исчезает, но когда я щелкаю снаружи, он остается там.
Кто-нибудь может найти проблему?
Ссылка: http://pec.solarismedia.net/index.html#content
Ответы
Ответ 1
У ваших датапикеров класс hasDatepicker
, поэтому попробуйте следующее:
$(".hasDatepicker").blur(function(e) { $(this).datepicker("hide"); });
Я на 99% уверен, что сработает!
И FYI, если вы хотите, чтобы он был динамическим (применительно к входам, созданным после), вы можете использовать .on
$(".hasDatepicker").on("blur", function(e) { $(this).datepicker("hide"); });
ОБНОВЛЕНИЕ (PS, чтобы использовать следующее, полностью удалите вышеуказанное из своего кода)
Чтобы ответить на ваш комментарий, следующее может быть не лучшим решением, но с помощью проб и ошибок (на вашем сайте, используя консоль) это работает! И это относительно коротко по сравнению с альтернативными способами, о которых я думал.
$(document).click(function(e) {
var ele = $(e.toElement);
if (!ele.hasClass("hasDatepicker") && !ele.hasClass("ui-datepicker") && !ele.hasClass("ui-icon") && !$(ele).parent().parents(".ui-datepicker").length)
$(".hasDatepicker").datepicker("hide");
});
Как одна строка
$(document).click(function(e) { var ele = $(e.toElement); if (!ele.hasClass("hasDatepicker") && !ele.hasClass("ui-datepicker") && !ele.hasClass("ui-icon") && !$(ele).parent().parents(".ui-datepicker").length) $(".hasDatepicker").datepicker("hide"); });
проблема, с которой я столкнулся, была в состоянии сказать, когда был нажат значок диапазона, он действительно не желал сотрудничать, поэтому дополнительный имеет проверки класса
Ответ 2
Я немного изменил код из @SaraVanaN, и он выглядит так:
$(document).on("click", function(e) {
var elem = $(e.target);
if(!elem.hasClass("hasDatepicker") &&
!elem.hasClass("ui-datepicker") &&
!elem.hasClass("ui-icon") &&
!elem.hasClass("ui-datepicker-next") &&
!elem.hasClass("ui-datepicker-prev") &&
!$(elem).parents(".ui-datepicker").length){
$('.hasDatepicker').datepicker('hide');
}
});
i изменил эту строку $(document).on("click", function(e) {
, но неважно, как вы это делаете с помощью .on("click")
или .click()
и эта строка !$(elem).parents(".ui-datepicker").length
я взял .parent()
работал у меня, вы должны перепроверить свои веб-страницы datepicker, потому что прямо сейчас, для меня, когда вы нажимаете на дату, div
, которая появляется с датами, закрывается мгновенно, и вы не можете выбрать ни одну из дат...
Ответ 3
Проверка здесь лучших решений, чем у меня, но я думаю, что мне нравится мое решение
$(function() {
$(".datepicker").datepicker();
$(".hasDatepicker, .ui-datepicker, .ui-datepicker-trigger").click(function(event) {
event.stopPropagation();
});
$("body").bind("click touchstart", function(event) {
$('.ui-datepicker').hide();
$('.hasDatepicker').blur();
});
});
<link href="//code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<input type="text" class="datepicker"/>
Ответ 4
Если вы хотите, не скрывайте календарь, когда нажимаете следующий/предыдущий месяц, применяйте следующий код.
$(document).click(function(e) {
var ele = $(e.toElement);
if (!ele.hasClass("hasDatepicker") &&
!ele.hasClass("ui-datepicker") &&
!ele.hasClass("ui-icon") &&
!ele.hasClass("ui-datepicker-next") &&
!ele.hasClass("ui-datepicker-prev") &&
!$(ele).parent().parents(".ui-datepicker").length)
$(".hasDatepicker").datepicker("hide");
});
Ответ 5
Здесь измененное решение, которое сработало для меня:
$(".hasDatepicker").each(function (index, element) {
var context = $(this);
context.on("blur", function (e) {
// The setTimeout is the key here.
setTimeout(function () {
if (!context.is(':focus')) {
$(context).datepicker("hide");
}
}, 250);
});
});
Ответ 6
Вот более короткая версия вышеприведенного кода, бит легче читать:
$(document).click(function(e) {
if (!$(e.target).parents('.ui-datepicker').length)
$('.hasDatepicker').datepicker('hide');
});
Ответ 7
Это мое решение.
Ниже вы можете найти этот код с объединенным if() s
var datepickerHideFix = function() {
$(document).on("click", function (e) {
var elee = $(e.target);
if (!elee.hasClass('hasDatepicker')) {
if (elee.isChildOf('.ui-datepicker') === false) {
if (elee.parent().hasClass('ui-datepicker-header') === false) {
$('.hasDatepicker').datepicker('hide');
}
}
}
e.stopPropagation();
});
};
Слияние, если() s
var datepickerHideFix = function() {
$(document).on("click", function (e) {
var elee = $(e.target);
if (!elee.hasClass('hasDatepicker') &&
elee.isChildOf('.ui-datepicker') === false &&
elee.parent().hasClass('ui-datepicker-header') === false) {
$('.hasDatepicker').datepicker('hide');
}
e.stopPropagation();
});
};
Ответ 8
У меня была такая же проблема. Похоже, что это исправлено и исправлено в последней версии разработки, которую вы можете получить отсюда:
http://eternicode.github.io/bootstrap-datepicker/
Я использую настройки по умолчанию, которые, похоже, работают. Должна была ошибка в более ранних версиях.
Ответ 9
в методе init для инициализации календаря в js файле найдите div, в котором находится ваш открытый календарь.
Как и у меня:
div.className="calendar-box";
//У меня есть datepicker на элементе #container
$(document).unbind('click'). bind ("click", function (e) {
if($(e.target).parents(".calendar-box").length == 0 && (e.target).id != 'container')
{
//code to hide calendar..
} });
Ответ 10
Вот мое решение:
var datePickerHover = false;
$(document).on({
mouseenter: function (e)
{
datePickerHover = true;
},
mouseleave: function ()
{
datePickerHover = false;
}
}, ".datepicker");
$(document).on('mouseup','html',function()
{
if(datePickerHover == false) $('.datepicker').hide();
});
Ответ 11
$(function() {
$(".datepicker").datepicker();
$(".hasDatepicker, .ui-datepicker, .ui-datepicker-trigger").click(function(event) {
event.stopPropagation();
});
$("body").bind("click touchstart", function(event) {
$('.ui-datepicker').hide();
$('.hasDatepicker').blur();
});
});
<link href="//code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<input type="text" class="datepicker"/>
Ответ 12
$("body").on("click", function (e) {
var elem = e.target.offsetParent;
if (elem &&
!elem.classList.contains("ui-datepicker") &&
!elem.classList.contains("ui-datepicker-calendar") &&
!elem.classList.contains("ui-datepicker-header") &&
!elem.hasAttribute("scope") &&
!elem.classList.contains("ui-datepicker-week-end") &&
!elem.classList.contains("input-cal-wrapper") &&
!elem.classList.contains("picto-cal")
) {
$(".hasDatepicker").datepicker("hide");
}
});