javascript - 无法在 AngularJS 的 Internet Explorer 11 中获取事件目标的父级

标签 javascript jquery angularjs internet-explorer-11 jquery-events

const findClosestParent = (startElement, fn) => {
  const parent = startElement.parentElement;
  if (!parent) return undefined;
  return fn(parent) ? parent : findClosestParent(parent, fn);
};

$document.on('click', event => {
  let target = event.target;
  if (findClosestParent(target, parent => parent.classList.contains('.calendar')) {
    // do some things
  }

});

我正在尝试查找一个元素是否在另一个元素内。我无法在 Internet Explorer 11 中使用最接近的方法来做到这一点。因此,我采用了创建递归搜索 DOM 树函数的方法。但是,我也无法简单地使用 jQuery 的 event.target 属性 在 Angular js Controller 中获取 Internet Explorer 11 中目标事件元素的父元素。此代码片段不起作用,因为无论我单击什么,findClosestParent 中的 startElement.parentElement 始终为 null。另外,startElement.parentNode 为 null。 event.currentTarget.parentNode 为空。我已经尝试了很多事情。什么都不起作用。我尝试的另一件事是,我不能简单地向我尝试选择的 div 添加 id 并使用纯 vanilla js getElementById 查询选择器,因为这些元素在第 3 方库中被抽象出来。我非常希望能够使用事件目标或类似的东西来获取 IE11 中的 dang 元素。

我认为这可以归结为一个事实,根据 https://developer.mozilla.org/en-US/docs/Web/API/Node/parentElement ,对于 IE,parentElement 是“仅在 Element 上受支持”。这就是它所说的...这意味着我认为 Internet Explorer 不认为 event.target 是一个“Element”。

最佳答案

这是一个使用 angularjs 和 jQuery Core 的简单解决方案。

尝试使用 calendar 类单击元素内部和外部的某个位置。

(function () {
    'use strict';

    angular.module('app', []);

    angular.
        module('app')
        .controller('myController', ['$scope', function ($scope) {
            $(document).on('click', function ($event) {
                var nativeElement = $event.target;
                if ($(nativeElement).closest('.calendar').length) {
                    console.log('Inside a calendar');
                }
                else {
                    console.log('Outside a calendar');
                }
            });
        }])

})();
.calendar {
  margin: 20px;
  padding: 20px;
  border: 2px solid blue;
}

.widget {
  margin: 20px;
  padding: 20px;
  border: 2px solid green;
}
<!DOCTYPE html>

<html lang="en" ng-app="app">
  <head>
    <meta charset="utf-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="module.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body ng-controller="myController">
    <div class="calendar">
      <div class="ancestor-2">
        <div class="ancestor-1">
          Calendar
        </div>
      </div>
    </div>
    <div class="widget">
      <div class="ancestor-2">
        <div class="ancestor-1">
          Not a calendar
        </div>
      </div>
    </div>
  </body>
</html>

JSFiddle demo

关于javascript - 无法在 AngularJS 的 Internet Explorer 11 中获取事件目标的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60893664/

相关文章:

javascript - 根据不同的文化设置获取格式化日期

angularjs - Angular 数据表未正确应用

java - 使用 Google Maps API v3 的更多批量地理编码问题

javascript - 添加来自 js 中输入的值

javascript - 从 Reddit 搜索 API 获取 JSON

javascript - Jquery 可拖动列表项被隐藏

jquery - Div 元素未展开以容纳 HTML 文本

javascript - AngularJs $scope 变量没有改变

javascript - ngStorage 在 Chrome iframe 中崩溃

javascript - 什么时候应该使用 util.inherits() 而不是 Node.js 中的原型(prototype)来进行继承?