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" вместо