单击 div 外部 - 当 div 具有触发事件的按钮时 - angularjs

2024-01-14

我使用以下指令来检测何时在 div 外部进行点击:

app.directive('clickOut', function ($window, $parse) {
return {
    restrict: 'A',
    link: function (scope, element, attrs) {
        var clickOutHandler = $parse(attrs.clickOut);

        angular.element($window).on('click', function (event) {
            if (element[0].contains(event.target)) return;
            clickOutHandler(scope, {$event: event});
            scope.$apply();
        });
    }
  };
});

在这个div中:

             <div class="panel-body" click-out="closeMyPopup()">                 
                <div class="row clearfix">
                    <div class="col-md-12">
                        <div class="form-inline pull-right">
                            <button type="button" class="form-control btn"  ng-click="onCancelAnnouncement()">Cancel</button>
                            <button type="submit" class="form-control btn" ng-click="onSaveAnnouncement()">Save</button>
                        </div>

                    </div>
                </div>

            </div>

它工作得很好,当你点击 div 外部时,函数 closeMyPopup() 被触发,问题是 div 有触发其他函数的按钮。由于某种原因,当调用其他函数时(例如单击按钮时),调用 closeMyPopup() 会触发外部单击事件,按钮位于 div 内部,因此不应调用外部单击事件。我可以使用另一个指令,它具有正确的行为,并且当您触发另一个函数时不会触发外部点击?或者我该如何解决这个问题?

我还使用了另一个指令,也遇到了同样的问题:

app.directive("outsideClick", ['$document', '$parse', function      ($document, $parse) {
    return {
           link: function ($scope, $element, $attributes) {
        var scopeExpression = $attributes.outsideClick,
            onDocumentClick = function (event) {
                var isChild = $element.find(event.target).length > 0;

                if (!isChild) {
                    $scope.$apply(scopeExpression);
                }
            };

        $document.on("click", onDocumentClick);

        $element.on('$destroy', function () {
            $document.off("click", onDocumentClick);
        });
    }
  }
}]);

这是因为事件正在传播到Window object.

- Window
    - document
        - dialog
           - button

在上面的层次结构中,如果点击事件发生在最后一个button元素,事件将传播到父元素,直到到达 Window,然后关闭对话框。

解决方案一:

通过将事件作为参数传递并调用来停止每个控制器函数中的事件传播event.stopPropagation()功能:

<button type="button" class="form-control btn"  ng-click="onCancelAnnouncement($event)">Cancel</button>

...

$scope.onCancelAnnouncement($event) {
    $event.stopPropagation();
}

解决方案2:

让事件传播并检查目标元素:

angular.element($window).on('click', function (event) {
        var target = $(event.target);
        if(target.attr("id") === "anyid") { // or target.hasClass("someclass")
                                            // or target.closest(".some-selector")
            // just ignore
        } else {
            // Do whatever you need 
        }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击 div 外部 - 当 div 具有触发事件的按钮时 - angularjs 的相关文章

随机推荐

  • 重叠矩形的总面积

    假设我们有以下 4 个矩形 它们都是用x and y它们所有顶点的坐标 从左上角开始按顺时针方向 所有矩形的边均平行于 x 轴和 y 轴 Note 我愿意使用任何现有的库 如果存在 蓝色矩形示例 20 50 40 50 40 110 20
  • iOS 6 - 以编程方式触发 Unwind Segue 不执行任何操作

    在我的应用程序启动时 它使用 segue 以编程方式显示 LoginViewController 视图控制器以模态方式呈现 过渡设置为交叉溶解 身份验证成功后 我想通过以编程方式触发展开转场来关闭登录视图 所以我将其添加到我的头文件中 IB
  • 在 xml spring Batch 应用程序中复制标头标签

    我在用spring batch in spring boot应用 Spring Boot 版本是2 3 3 RELEASE 我想要达到的目标 我必须read a xml file包含数千个Transactions with header t
  • Yii2:活动记录列别名

    我正在使用 Yii2 框架和高级模板 我的控制器文件中的列别名出现问题 这是我的代码 models new ActiveDataProvider query gt User find gt select member gt fullname
  • 使用 Python 删除 json 文件中的新换行符。

    我正在从 firebase 下载数据 并将其导出为 json 之后 我尝试将其上传到bigquery 但我需要删除新的换行符以供大查询接受它 ConnectionTime 730669 644775033 objectId eHFvTUNq
  • Flex-direction:column 不允许子项在 Firefox 中滚动[重复]

    这个问题在这里已经有答案了 我正在对元素使用显示柔性 outer 应根据内容调整其高度 但不得超过特定高度 例如100px 一旦超过高度 我希望里面的内容开始垂直滚动 此行为在 Chrome 上按预期工作 但在 Firefox 中内容包装器
  • 带有服务帐户令牌的 Kubernetes kubeconfig

    我有一个调用的脚本kubectl server server certificate authority ca token token get pod all namespaces簇外 其中 token来自服务帐户my sa 在命名空间中m
  • 使用 Android APK 2.2 打开硬件加速(如果可用)(例如 Android 3+)

    我为Android 3 0开发了一个应用程序 它运行得很好 但客户端坚持兼容2 2设备 禁用硬件加速 使用 Android 兼容包 NIO 向后移植支持 对于任务和执行程序 以及 View 方法的一些重新实现 我能够将我的应用程序移植到 A
  • 如何使用其他端口在 Visual Studio Code 中离线调试无服务器?

    我有两个无服务器离线 服务器 我需要同时在本地运行 所以我需要更改其中一台服务器的端口 我使用 Visual Studio Code 调试器运行服务器 服务器的配置位于 launch json 文件中 如何更改无服务器离线应用程序的端口 以
  • android.app.Application 子类,onTerminate 未被调用

    从文档中android app Application 那些需要维护全局应用程序状态的基类 我正在使用自己的子类来维护一个用于查询服务器的对象 还来自文档 onTerminate 当应用程序停止时调用 然而 onTerminate 在我的班
  • Entity Framework Core 2.0 删除记录而不是更新记录

    我认为这可能是一个错误 但我认为我可能缺少一些可以解释该行为的东西 任何帮助 将不胜感激 Technical details EF Core version Microsoft EntityFrameworkCore 2 0 1 Datab
  • 工厂女孩什么时候在数据库中创建对象?

    我正在尝试使用模拟会话FactoryGirl shoulda 它可以与固定装置配合使用 但我在使用工厂时遇到问题 我有以下工厂 用户登录名和电子邮件都有unique验证 Factory define user do u u login qu
  • 将多种内容类型发布到 Web api

    我有一个 Web api 我想发布一个图像文件 一些数据 以便在服务器收到它时正确处理它 调用代码看起来像这样 using var client new HttpClient using var content new MultipartF
  • java nio 否定 glob 模式

    fileSystem getPathMatcher glob pattern matches path getFileName 我想匹配所有不匹配 ts 的内容 java 中 glob 的语法是什么 在有人建议我使用正则表达式之前 我需要使
  • 将现有私钥导入 BKS Keystore

    我有一个由 openssl 按以下方式生成的密钥对 openssl genrsa out private key pem 2048 我将其转换为 DER 格式如下 openssl pkcs8 topk8 inform PEM outform
  • 使用 BroadcastReceiver 关闭 Activity

    我的应用程序中有一个活动 Main java 打开 我想使用广播接收器关闭该活动 如何关闭该活动 首先 您的 Main java 需要注册为接收器 您可以在 Main java 的 onResume 中注册它 Override public
  • 将网站图标添加到网站[重复]

    这个问题在这里已经有答案了 可能的重复 HTML 标题图像 https stackoverflow com questions 3103490 html title image 有人可以告诉我如何让图标出现在 PHP 的浏览器选项卡上吗 我
  • 应用商店提交错误无效的捆绑结构

    当我尝试提交之前成功提交的应用程序版本升级时 我从 XCode 8 1 收到以下错误 错误 ITMS 90171 无效的捆绑包结构 不允许使用二进制文件 Particle app Particle armv7 除了受支持捆绑包的 CFBun
  • 如何在用户键入时获取 JTextField 内容的长度?

    JTextField 有一个 keyTyped 事件 但似乎在它触发时单元格的内容尚未更改 因此 如果在这里阅读 length 总是错误的 必须有一种简单的方法来获取用户在击键后显示的长度 这可能不是最佳方式 并且已经有一段时间了 但在过去
  • 单击 div 外部 - 当 div 具有触发事件的按钮时 - angularjs

    我使用以下指令来检测何时在 div 外部进行点击 app directive clickOut function window parse return restrict A link function scope element attr