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

单击div的OUTSIDE时不确定如何隐藏div

林涵映
2023-03-14
问题内容

这是该问题的后续问题:具有焦点的AngularJS输入会杀死list的ng-repeat过滤器
基本上,我的代码是使用AngularJS在右侧弹出一个div(抽屉)以过滤事物列表。大多数情况下使用此功能时,UI会被阻止,因此单击该阻止div会关闭抽屉。但是在某些情况下,我们不会阻止用户界面,需要允许用户在抽屉外部单击以取消搜索或选择页面上的其他内容。

我最初的想法是在抽屉打开时附加一个window.onclick处理程序,如果单击除抽屉以外的任何内容,则应关闭抽屉。这就是我将在纯JavaScript应用程序中执行的操作。但是在Angular中,这会有点困难。

这是一个jsfiddle,其中有一个基于@Yoshi的jsBin示例的示例: http
//jsfiddle.net/tpeiffer/kDmn8/

下面是此示例中的相关代码。基本上,如果用户在抽屉外单击,我将调用$ scope.toggleSearch,以便将$ scope.open设置回false。

代码可以正常工作,即使$ scope.open从true变为false,它也不会修改DOM。我确定这与事件的生命周期有关,或者当我修改$
scope(因为它是来自单独的事件)时,它是副本而不是原始副本…

最终的目标将是成为最终可重用性的指令。如果有人能指出正确的方向,那我将不胜感激。

$scope.toggleSearch = function () {

    $scope.open = !$scope.open;

    if ($scope.open) {
        $scope.$window.onclick = function (event) {
            closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
        };
    } else {
        $scope.$window.onclick = null;
    }
};

function closeSearchWhenClickingElsewhere(event, callbackOnClose) {

    var clickedElement = event.target;
    if (!clickedElement) return;

    var elementClasses = clickedElement.classList;
    var clickedOnSearchDrawer = elementClasses.contains('handle-right') 
        || elementClasses.contains('drawer-right') 
        || (clickedElement.parentElement !== null 
            && clickedElement.parentElement.classList.contains('drawer-right'));
    if (!clickedOnSearchDrawer) {
        callbackOnClose();
    }

}

问题答案:

抽屉未关闭,因为click事件发生在摘要周期之外,并且Angular不知道$scope.open已更改。要修复它,您可以在$scope.open设置为false后调用$ scope。$apply(),这将触发摘要周期。

$scope.toggleSearch = function () {
    $scope.open = !$scope.open;
    if ($scope.open) {
        $scope.$window.onclick = function (event) {
            closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
        };
    } else {
        $scope.open = false;
        $scope.$window.onclick = null;
        $scope.$apply(); //--> trigger digest cycle and make angular aware. 
    }
};

这是你的小提琴。

我还尝试为搜索抽屉创建一个指令(如果有帮助的话(它需要一些修复:))。这是一个JSBin。



 类似资料:
  • 我正在尝试隐藏按钮div和显示一个隐藏的div后,一个表单按钮已经被点击,加上延迟提交/重定向。下面是我想出的办法,但似乎没有100%奏效。 null null 任何建议都非常感谢

  • 我创建了一个包含三个项目的菜单:menu1、menu2、Menu3。 我希望能够单击菜单内的每个按钮,并显示相关的容器。 这已经管用了。 我似乎无法使相关的在再次单击按钮时隐藏起来。 我的代码: null null

  • 问题内容: 我有一个菜单和三个隐藏的div,这些div取决于用户选择的选项。我只想使用CSS来显示/隐藏它们。我现在正在使用jquery,但我希望禁用js即可访问它。此处有人为其他人提供了此代码,但仅在div:hover或div:active时有效,当我将其更改为div:visited时它不起作用。我是否需要添加某些内容,或者这不是正确的方法?感谢您的帮助:) 问题是我的客户希望菜单被选中时此di

  • 问题内容: 我正在使用Angular.js应用程序,该应用程序通过医疗程序的json文件进行过滤。当使用ng- click单击(在同一页面上)过程名称时,我想显示每个过程的详细信息。这是我到目前为止的内容,.procedure-details div设置为显示:无: 我在角度上很新。有什么建议? 问题答案: 删除,然后改用: 这是小提琴:http : //jsfiddle.net/asmKj/ 您

  • 问题内容: 我在页面上存在一个,我需要进行设置,以便当用户在该元素之外单击时它将被隐藏,但是如果用户在该元素内的某个位置单击,则它应该保留。 我尝试使用 和 将其添加到该特定DIV的click事件中,但这没有用。 谢谢! 问题答案: 在弹出式鼠标悬停时切换 标志 : 注: 如果页面上的某个地方,你有一个元素 阻止 的冒泡DOM树达(以注册),您可能希望 创建一个全屏幕 (就像一个页面叠加) 弹出包

  • 问题内容: 我正在使用此代码: 和这个 HTML : 问题是我的链接位于内,单击时它们不再起作用。 问题答案: 遇到同样的问题,想出了这个简单的解决方案。它甚至可以递归工作: