当div失去焦点时如何关闭div?

时间:2014-09-10 15:26:48

标签: javascript css angularjs blur focusout

我在这里做了一个简单的plunkr http://plnkr.co/edit/zNb65ErYH5HXgAQPOSM0?p=preview

我创建了一个小日期选择器,我希望当你将注意力集中在它上面时(自动选择聚焦),如果我在输入上设置模糊我无法使用datepicker,如果我将focusout事件放在datepicker上它不起作用

我也尝试过:

angular.element(theCalendar).bind('blur', function () {
    $scope.hideCalendar();
});

但它没有用。

有任何线索吗?

3 个答案:

答案 0 :(得分:1)

这是因为你在有机会做任何事情之前删除了这个项目,这是一个有效的例子:

http://plnkr.co/edit/mDfV9NLAQCP4l7wHdlfi?p=preview

只需添加超时:

thisInput.bind('blur', function () {
  $timeout(function(){
    $scope.hideCalendar();
  }, 200);
});
你考虑过使用现有的datepickers吗?比如angularUI或angular-strap:http://mgcrea.github.io/angular-strap/##datepickers

更新

不是一个完整的解决方案,但应该让你更接近:

    angular.element($document[0].body).bind('click', function(e){
      console.log(angular.element(e.target), e.target.nodeName)
      var classNamed =  angular.element(e.target).attr('class');
      var inThing = (classNamed.indexOf('datepicker-calendar') > -1);
      if (inThing || e.target.nodeName === "INPUT") {
        console.log('in');
      } else {
        console.log('out');
          $timeout(function(){
            $scope.hideCalendar();
          }, 200);
      }
    });

http://plnkr.co/edit/EbQl5xsCnG837rAEhBZh?p=preview

您要做的是听取页面上的点击,如果点击在日历之外,则关闭它,否则什么都不做。以上只考虑到您点击了包含类名称包含datepicker-calendar的内容,您需要对其进行调整,以便在日历中单击也不会关闭它。

答案 1 :(得分:1)

关闭鼠标输出怎么样?

如果你移动到日历中的另一个div,你需要取消关闭:

    //get the calendar as element
    theCalendar = element[0].children[1];

    // hide the calendar on mouseout
    var closeCalendarTimeout = null;
    angular.element(theCalendar).bind('mouseout', function () {
      if ( closeCalendarTimeout !== null )
        $timeout.cancel(closeCalendarTimeout);
      closeCalendarTimeout = $timeout(function () {
        $scope.hideCalendar();
      },250)
    });
    angular.element(theCalendar).bind('mouseover', function () {
      if ( closeCalendarTimeout === null ) return
      $timeout.cancel(closeCalendarTimeout);
      closeCalendarTimeout = null;
    });

修改

向div添加tabindex属性会导致它触发焦点并模糊事件。

, htmlTemplate = '<div class="datepicker-calendar" tabindex="0">' +

angular.element(theCalendar).bind('blur', function () {
  $scope.hideCalendar();
});

答案 2 :(得分:0)

所以,我知道这可能不是最好的做法或最好的方法,但最后我修好并得到了我需要的东西:

thisInput.bind('focus click', function bindingFunction() {

          isMouseOnInput = true;
          $scope.showCalendar();
          angular.element(theCalendar).triggerHandler('focus');
        });
        thisInput.bind('blur focusout', function bindingFunction() {

          isMouseOnInput = false;
        });

        angular.element(theCalendar).bind('mouseenter', function () {

          isMouseOn = true;
        });

        angular.element(theCalendar).bind('mouseleave', function () {

          isMouseOn = false;
        });

        angular.element($window).bind('click', function () {

          if (!isMouseOn && !isMouseOnInput) {

            $scope.hideCalendar();
          }
        });

我设置了一些布尔变量来检查单击页面时鼠标的位置,如果你有一些更好的解决方案,它会像魅力一样工作,请告诉我,但这实际上解决了所有问题。

我接受这个作为答案,但我感谢本页面上的所有人!