当前位置: 首页 > 面试题库 >

在外部单击时隐藏Angular UI Bootstrap弹出窗口

傅阿苏
2023-03-14
问题内容

我试图手动关闭引导程序弹出窗口,以在单击documentbody不是弹出窗口的任何位置时将其关闭。

我发现最接近完成此操作的方法是创建一个指令,但这是用于手动触发的,如果变量为_true_ 或 false

如果我单击非弹出窗口的任何内容,谁能帮助我找出如何关闭它?

我不介意使用jQuery,但$(document).click(function(e){});我不知道如何调用关闭。

<div id="new_button" popover-template="plusButtonURL" popover-placement="right" popover-append-to-body="true" popover-animation="false">+</div>

通常popover-trigger="focus"可以解决问题,但是我的弹出窗口包含需要单击的内容。我的ng-click弹出式窗口内部有一个_焦点,_ 如果使用 _焦点_触发器会被忽略,所以我正在寻找一种不太常规的方法来解决这个问题。


问题答案:

编辑:

这是它的工作方式(仍然漫长而详尽的解释):

  1. 创建一个自定义指令,使您可以定位触发元素。
  2. 创建一个添加到主体的自定义指令,它将找到触发元素,并在单击该事件时触发该自定义事件。

创建一个自定义指令以触发元素为目标:

您需要从打开弹出窗口的元素中触发自定义事件处理程序(在演示中,这是按钮)。面临的挑战是将弹出框作为同级元素添加到此元素中,并且我始终认为,当您遍历DOM并期望它具有特定的结构时,事情更有可能被打破。有几种方法可以将trigger元素作为目标,但是我的方法是在单击该元素时向该元素添加一个唯一的类名(我选择“
trigger”)。在这种情况下,一次只能打开一个弹出窗口,因此使用类名是安全的,但是您可以根据自己的喜好进行修改。

自定义指令

app.directive('popoverElem', function(){
  return{
    link: function(scope, element, attrs) {
      element.on('click', function(){
        element.addClass('trigger');
      });
    }
  }
});

应用于按钮

<button popover-template="dynamicPopover.templateUrl" popover-title="{{dynamicPopover.title}}" class="btn btn-default" popover-elem>Popover With Template</button>

为文档主体(或任何其他元素)创建自定义指令以触发弹出窗口关闭:

最后一步是创建一个自定义指令,该指令将定位触发元素并触发自定义事件,以在单击应用于该元素的元素时关闭弹出窗口。当然,您必须从“触发”元素中排除初始单击事件,并在弹出框内部排除所有要与之交互的元素。因此,我添加了一个名为exclude-class的属性,因此您可以定义一个可以添加到其click事件应忽略的元素上的类(不会导致弹出窗口关闭)。

为了清理问题,当触发事件处理程序时,我们将删除添加到trigger元素的trigger类。

app.directive('popoverClose', function($timeout){
  return{
    scope: {
      excludeClass: '@'
    },
    link: function(scope, element, attrs) {
      var trigger = document.getElementsByClassName('trigger');

      function closeTrigger(i) {
        $timeout(function(){ 
          angular.element(trigger[0]).triggerHandler('click').removeClass('trigger'); 
        });
      }

      element.on('click', function(event){
        var etarget = angular.element(event.target);
        var tlength = trigger.length;
        if(!etarget.hasClass('trigger') && !etarget.hasClass(scope.excludeClass)) {
          for(var i=0; i<tlength; i++) {
            closeTrigger(i)
          }
        }
      });
    }
  };
});

我将其添加到body标记中,以便整个页面*成为弹出窗口的可忽略背景:

<body popover-close exclude-class="exclude">

并且,我将排除类添加到了弹出框的输入中:

<input type="text" ng-model="dynamicPopover.title" class="form-control exclude">

因此,有一些调整和陷阱,但我将留给您:

  1. 如果未定义,则应在popover-close指令的链接函数中设置默认的排除类。
  2. 您需要注意popover-close指令是元素绑定的,因此,如果删除我在html和body元素上设置的样式以使其具有100%的高度,则如果内容不包含在视口中,则可能存在“死区”填补它。

在Chrome,Firefox和Safari中进行了测试。



 类似资料:
  • 问题内容: 我正在尝试使用复选框和过滤器选项创建多选下拉列表。我试图隐藏列表,但我在外面单击却无法弄清楚。感谢你的帮助。 http://plnkr.co/edit/tw0hLz68O8ueWj7uZ78c 问题答案: 请注意,打开第二个弹出窗口(在具有多个选择的页面上)时,您的解决方案(问题中提供的Plunker)不会关闭其他框的弹出窗口。 通过单击一个框打开一个新的弹出窗口,单击事件将始终停止。

  • 我正在尝试创建一个 Angular 4 自定义表单控件作为我的日期选择器。我正在使用ngx-bootstrap,到目前为止,我已经使用ngx-bootstrap的输入,日期选择器和弹出框组件设置了这个自定义表单控件。自定义控件打开一个焦点为日期选取器的弹出窗口,但是,我需要能够通过与弹出框内容交互来更改日期,并且在我不与弹出框或输入交互时它应该关闭。我试图跟踪ngx-bootstrap githu

  • 我有这段代码显示了一个按钮谁显示一个弹出窗口,我希望用户能够关闭弹出窗口点击它的外部时,它是打开的。

  • 嗨,我有javafx应用程序,它只有一个stage.On标签键按下文本字段的事件,一个弹出窗口显示在应用程序的主要阶段 我不点击弹出窗口,也不选择弹出窗口中的任何内容。我会点击它后面的舞台。我希望popup被关闭,但在执行popup的focusedProperty侦听器之前,它给了我IllegalArgumentException。 如果popup位于不同的阶段(应用程序的主阶段除外),根据阶段f

  • 我使用jQueryUI菜单作为上下文菜单,因此当用户单击表中的单元格时,它会显示相关选项。问题是,它不是真的被设计成这样使用的,所以当用户点击菜单外时它不会隐藏。 我尝试使用模糊方法: 由于某种原因,即使您滚动到菜单中的一个选项上,菜单也会隐藏。 有没有简单的解决办法? 编辑:要拉起我使用的菜单: 如果我尝试使用$('body'),它似乎总是首先被调用。单击()将其隐藏。您可以更改jQuery处理

  • 大多数情况下,表单会直接显示在页面上,但并非总是如此。比如,一些购物网站,允许用户把商品加入购物车,当提交订单时,再检测用户是否登录,如果没有登录,则弹出登录界面,供用户登录。 弹出表单的基本原理是,在页面上已经存在一个表单,并通过CSS将其隐藏,当用户点击某个按钮或链接,或满足一定触发条件时,再利用 Javascript 或 jQuery 将表单动态显示出来。当然,不局限于表单,页面上的任何元素