在Firefox中运行event.path[n].id
时,出现此错误。它可以在其他浏览器中使用。
最佳答案
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
。 Firefox支持composedPath
。 Chrome支持path
(这是Google的原始想法)和composedPath
。 According to MDN(截至2020年1月)除IE11之外,所有主要浏览器的最新版本均支持composedPath
。因此,我认为您无法直接在IE11(或Legacy Edge)上获取路径信息。显然,您可以通过
e.target.parentNode
和每个后续的parentNode
获取路径,它们通常是相同的,但是path
/composedPath
当然要指出的是,它并不总是相同的(如果在事件触发后但在之前修改了DOM,您的处理程序被致电)。