event.path не определен с помощью Firefox и Vue.js

Сначала я использую Vue.js и Node.js

У меня проблема с Firefox.

Я использую event.path[n].id и с Firefox я получаю ошибку

путь события не определен

Но он отлично работает в других браузерах.

У тебя есть идеи почему?

Ответы

Ответ 1

Свойство path объектов Event является стандартным. Стандартным эквивалентом является composedPath, который является методом. Но это новое.

Таким образом, вы можете попробовать вернуться к этому, например:

var path = event.path || (event.composedPath && event.composedPath());
if (path) {
    // You got some path information
} else {
    // This browser doesn't supply path information
}

Очевидно, что это не даст вам информацию о пути, если браузер не предоставит ее, но она учитывает как старый, так и новый, стандартный путь, и поэтому сделает все возможное для кросс-браузера.

Пример:

document.getElementById("target").addEventListener("click", function(e) {
  // Just for demonstration purposes
  if (e.path) {
    if (e.composedPath) {
      console.log("Supports 'path' and 'composedPath'");
    } else {
      console.log("Supports 'path' but not 'composedPath'");
    }
  } else if (e.composedPath) {
    console.log("Supports 'composedPath' (but not 'path')");
  } else {
    console.log("Supports neither 'path' nor 'composedPath'");
  }
  
  // Per the above, get the path if we can
  var path = e.path || (e.composedPath && e.composedPath());
  
  // Show it if we got it
  if (path) {
    console.log("Path (" + path.length + ")");
    Array.prototype.forEach.call(
      path,
      function(entry) {
        console.log(entry.nodeName);
      }
    );
  }
}, false);
<div id="target">Click me</div>

Ответ 2

Вы можете создать свою собственную функцию builtPath, если она не реализована в браузере:

function composedPath (el) {

    var path = [];

    while (el) {

        path.push(el);

        if (el.tagName === 'HTML') {

            path.push(document);
            path.push(window);

            return path;
       }

       el = el.parentElement;
    }
}

Возвращаемое значение эквивалентно event.path из Google Chrome.

Пример:

document.getElementById('target').addEventListener('click', function(event) {

    var path = event.path || (event.composedPath && event.composedPath()) || composedPath(event.target);
});

Ответ 3

Эта функция служит для polyfill для Event.composedPath() или Event.Path

function eventPath(evt) {
    var path = (evt.composedPath && evt.composedPath()) || evt.path,
        target = evt.target;

    if (path != null) {
        // Safari doesn't include Window, but it should.
        return (path.indexOf(window) < 0) ? path.concat(window) : path;
    }

    if (target === window) {
        return [window];
    }

    function getParents(node, memo) {
        memo = memo || [];
        var parentNode = node.parentNode;

        if (!parentNode) {
            return memo;
        }
        else {
            return getParents(parentNode, memo.concat(parentNode));
        }
    }

    return [target].concat(getParents(target), window);
}

Ответ 4

Я была такая же проблема. Мне нужно имя элемента HTML. В Chrome я получаю имя с путем. В Firefox я пытался использовать составленный путь, но он возвращает другое значение.

Для решения моей проблемы я использовал этот e.target.nodeName. С помощью целевой функции вы можете получить HTML-элемент в Chrome, Firefox и Safari.

Это моя функция в Vue:

selectFile(e) {
        this.nodeNameClicked = e.target.nodeName
        if (this.nodeNameClicked === 'FORM' || this.nodeNameClicked === 'INPUT' || this.nodeNameClicked === 'SPAN') {
          this.$refs.singlefile.click()
      }
    }

Ответ 5

Используйте composePath() и используйте polyfill для IE: https://gist.github.com/rockinghelvetica/00b9f7b5c97a16d3de75ba99192ff05c

включите указанный выше файл или вставьте код:

// Event.composedPath
(function(e, d, w) {
  if(!e.composedPath) {
    e.composedPath = function() {
      if (this.path) {
        return this.path;
      } 
    var target = this.target;

    this.path = [];
    while (target.parentNode !== null) {
      this.path.push(target);
      target = target.parentNode;
    }
    this.path.push(d, w);
    return this.path;
    }
  }
})(Event.prototype, document, window);

а затем используйте:

var path = event.path || (event.composedPath && event.composedPath());

Ответ 6

попробуй это:

let scroll = event.path == не определено? event.pageY: event.path [1].scrollY;

В Chrome event.path работает нормально, но не в Firefox. В Firefox используйте "event.pageY" вместо