当我event.path[n].id
在 Firefox 中运行时,出现此错误。它适用于其他浏览器。
event.path 未定义
当我event.path[n].id
在 Firefox 中运行时,出现此错误。它适用于其他浏览器。
event.path 未定义
对象的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>
在我的测试中(2018 年 5 月更新),IE11 和 Legacy Edge(v44 或更早版本,在从 v79 开始的 Chromium 更新之前)都不支持path
或composedPath
. 火狐支持composedPath
. Chrome 支持path
(这是 Google 的最初想法)和composedPath
. 根据 MDNcomposedPath
,截至 2020 年 1 月,除 IE11 支持外,所有主要浏览器的最新版本。
所以我不认为你可以直接在IE11(或Legacy Edge)上获取路径信息。显然,您可以通过e.target.parentNode
和每个后续获取路径parentNode
,这通常是相同的,但当然path
/ 的重点composedPath
是它并不总是相同的(如果在触发事件之后但在您的处理程序被调用之前修改了 DOM )。
如果浏览器中没有实现,您可以创建自己的 compositionPath 函数:
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。
例子:
document.getElementById('target').addEventListener('click', function(event) {
var path = event.path || (event.composedPath && event.composedPath()) || composedPath(event.target);
});
此函数用作Event.composedPath()
或的 polyfillEvent.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);
}
使用 composePath() 并为 IE 使用 polyfill: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());
我遇到过同样的问题。我需要 HTML 元素的名称。在 Chrome 中,我得到了带有路径的名称。在 Firefox 中,我尝试使用compositionPath,但它返回不同的值。
为了解决我的问题,我使用了e.target.nodeName。使用目标函数,您可以在 Chrome、Firefox 和 Safari 中检索 HTML 元素。
这是我在Vue.js 中的函数:
selectFile(e) {
this.nodeNameClicked = e.target.nodeName
if (this.nodeNameClicked === 'FORM' || this.nodeNameClicked === 'INPUT' || this.nodeNameClicked === 'SPAN') {
this.$refs.singlefile.click()
}
}