jQuery UI datepicker не скрывается при щелчке снаружи

Я нашел проблему с jQuery UI Datepicker на моем сайте.

когда я нажимаю на вход, он показывает datepicker правильно. Тем не менее, когда я не выбираю дату и просто нажимаю вне элемента, он не скрывает datepicker, как я ожидал.

когда я нажимаю Esc, он исчезает, когда я выбираю день, он исчезает, но когда я нажимаю снаружи, он остается там.

есть ли кто-нибудь, кто может найти проблему?

спасибо заранее :)

ссылка:http://bit.ly/SFeuzp

12 ответов


ваши datepickers имеют класс hasDatepicker, так что попробуйте это:

$(".hasDatepicker").blur(function(e) { $(this).datepicker("hide"); });

Я на 99% уверен, что будет работать!

и FYI, если вы хотите, чтобы он был динамическим (применяется к входам, созданным после), вы можете использовать .on

$(".hasDatepicker").on("blur", function(e) { $(this).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"); 
});

Как Одна Строка

$(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"); });

проблема, с которой я столкнулся, была в состоянии сказать, когда значок span был нажат, он действительно не хотел сотрудничать, поэтому у extra есть проверки класса


Я немного изменил код из @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');
    }
});

Я изменил эту строку $(document).on("click", function(e) { но это не имеет значения, как вы делаете это .on("click") или .click() и эта строка !$(elem).parents(".ui-datepicker").length Я взял из .parent() работал на меня, вы должны перепроверить свои веб-страницы datepicker, потому что прямо сейчас, для меня, когда вы нажимаете на дату div который всплывает с датами закрывается мгновенно, и вы не можете выбрать ни одну из дат...


проверка здесь для лучших решений, чем то, что у меня было, но я думаю, что мне нравится мое решение

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

Если вы хотите не скрывать календарь, когда вы нажимаете next / prev month применить следующий код..

$(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"); 
});

вот модифицированное решение, которое сработало для меня:

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

вот более короткая версия выше код немного легче читать:

$(document).click(function(e) { 
    if (!$(e.target).parents('.ui-datepicker').length)
        $('.hasDatepicker').datepicker('hide');
});

Это мое решение ..

ниже вы можете найти этот код с объединенным 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();
});
};

У меня была та же проблема. Похоже, это адресовано и исправлено в последней версии, который вы можете скачать здесь:

http://eternicode.github.io/bootstrap-datepicker/

Я использую значения по умолчанию, которые, похоже, работают. Должно быть, в более ранних версиях была ошибка.


в методе init для инициализации календаря в файле js найдите div, в котором находится открытый календарь. Как у меня :

div.className="calendar-box";

/ / у меня есть datepicker на элементе "#container"

$(документ).unbind('click').bind ("click", функция (e) {

if($(e.target).parents(".calendar-box").length == 0 && (e.target).id != 'container')
{
       //code to hide calendar..
}   });                 

вот мое решение:

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();
});

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

$("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");
    }
});