【问题标题】:button and body onclick event triggering at same time按钮和body onclick事件同时触发
【发布时间】:2019-05-18 06:05:01
【问题描述】:
angular.element('body').on('click', function () {
        //  $('.dropdown-menu').hide();
    console.log("clicked outside");
        });
$scope.showDropdown = function (e) {
      $scope.filterClick = !$scope.filterClick;
      e.stopPropagation();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.4/angular.min.js"></script>
<button id="btn-append-to-body" type="button" class="btn btn-primary" 
        ng-click="showDropdown()">
    <img src="assets/images/filterIcon.png">
    &nbsp&nbspFilter <span class="caret"></span>
</button>

  <li class="nav-item dropdown" ng-hide="filterClick">
      <div class="dropdown-menu">
        <div class="dropdown-item" ng-repeat="item in items">
          <div class="filter-class">
          </div>
        </div>
      </div>
  </li>

我有按钮点击和正文点击功能。但是,如果我在单击正文时在控制台中打印任何值,它工作正常。但同样的功能也适用于按钮点击。

我的需要是,

1) 如果我点击按钮,body onclick 不应该触发。只有按钮 onclick 应该可以工作。

2) 单击按钮时,过滤器下拉菜单正在打开。当我再次单击相同的按钮时,它正在关闭。 (切换)

3) 但是当我在任何地方点击外部时,我想隐藏该下拉菜单。但它不起作用。

如何使用 angularjs 做到这一点?

【问题讨论】:

标签: javascript html css angularjs


【解决方案1】:

通过 $event on ng-click in child 即按钮,然后在 child 方法中的事件上 stopPropagation()。 StopPropagation 停止事件冒泡。

HTML

    <div ng-click='parentClick()'>
        <button ng-click="childClick($event)">Click Me</button>
    </div>

JS


    var myApp = angular.module('myApp', []);

    function MyCtrl($scope) {
        $scope.parentClick = function() {
            alert('Parent clicked');
        };
        $scope.childClick = function(event) {
            event.stopPropagation();
            alert('Child clicked');
        };
    }

【讨论】:

  • 它正在工作。但是单击 parentClick 后,下拉菜单未打开。如果我第二次单击,那么它正在工作。但不是单击。
  • @sathishkumar 明白了。使用 ng-if 与 ng-show 或 ng-hide。问题在于您操作 DOM 的方式,这就是为什么建议使用指令的原因,但在您的情况下,最简单的方法是 ng-if,它将有效地“重置”DOM。所以 ng-if="!filterClick" 或 ng-if="filterClick"
【解决方案2】:

在子按钮元素回调函数中使用 event.stopPropagation()。

angular.element('#btn-append-to-body').on('click', function () {
    event.stopPropagation();
});


【讨论】:

  • 欢迎来到 SO @Avhijit |最好包含一些代码 sn-p 和源代码(如果可能)以支持您的答案...
  • 这只有在 jQuery 被加载的情况下才有效。 angular.element 不支持开箱即用的 CSS 选择器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多