<ul> 个元素的树和点击行为
Trees of <ul> elements and on-click behaviour
我们有一些内部代码使用嵌套的 <ul>
元素以 HTML 形式显示数据树。有一些 jQuery UI 代码使用 slideToggle()
方法切换子树可见性,我们用小加号和减号框覆盖了项目符号字符。这个想法是你点击小加号,相关的子树就会很好地展开。为了在正确的位置呈现框,我们使用 list-style-position: inside
.
使用最新版本的 Chromium(版本 76.0.3809.62-1),Javascript 代码不再正常工作。单击要点实际上将事件传递给封闭的 <ul>
(而不是列表项本身)。我添加了一个最小的示例来显示下面的行为,但您需要最近的 Chrome/Chromium 才能看到它。这不是切换子树,而是切换列表项是否显示为红色。使用最新版本的 Chromium,
我的问题是是否有正确的方法来捕捉这些点击事件。特别是,我想使用显示的布局,但我想确保单击项目符号点会导致项目符号点的项目切换(而不是周围的树)。我们只是以错误的方式做这件事吗?如果是这样,我们应该怎么做?
<!DOCTYPE html>
<html>
<head>
<title>List item test</title>
<style>
.red { color: red; }
ul { list-style-position: inside; }
ul ul li { background-color: lightgrey; }
</style>
<script>
function on_click (event) {
tgt = event.target;
// tgt might be a child of the <li> element. Walk up until
// we find one. Give up early if we hit a <ul>.
while (tgt.tagName != "LI") {
tgt = tgt.parentElement
if (tgt === null) {
return;
}
}
tgt.classList.toggle("red");
event.stopPropagation();
}
window.onload = function() {
for (ul of document.querySelectorAll("ul")) {
ul.addEventListener('click', on_click);
}
}
</script>
</head>
<body>
<ul>
<li>
<ul>
<li>AAA</li>
<li class="red">BBB</li>
<li>CCC</li>
</ul>
</li>
</ul>
</body>
</html>
这是 Chromium 的一个错误,看起来会在下一个稳定版本中修复。有关所有详细信息,请参阅 https://bugs.chromium.org/p/chromium/issues/detail?id=988414。
我们有一些内部代码使用嵌套的 <ul>
元素以 HTML 形式显示数据树。有一些 jQuery UI 代码使用 slideToggle()
方法切换子树可见性,我们用小加号和减号框覆盖了项目符号字符。这个想法是你点击小加号,相关的子树就会很好地展开。为了在正确的位置呈现框,我们使用 list-style-position: inside
.
使用最新版本的 Chromium(版本 76.0.3809.62-1),Javascript 代码不再正常工作。单击要点实际上将事件传递给封闭的 <ul>
(而不是列表项本身)。我添加了一个最小的示例来显示下面的行为,但您需要最近的 Chrome/Chromium 才能看到它。这不是切换子树,而是切换列表项是否显示为红色。使用最新版本的 Chromium,
我的问题是是否有正确的方法来捕捉这些点击事件。特别是,我想使用显示的布局,但我想确保单击项目符号点会导致项目符号点的项目切换(而不是周围的树)。我们只是以错误的方式做这件事吗?如果是这样,我们应该怎么做?
<!DOCTYPE html>
<html>
<head>
<title>List item test</title>
<style>
.red { color: red; }
ul { list-style-position: inside; }
ul ul li { background-color: lightgrey; }
</style>
<script>
function on_click (event) {
tgt = event.target;
// tgt might be a child of the <li> element. Walk up until
// we find one. Give up early if we hit a <ul>.
while (tgt.tagName != "LI") {
tgt = tgt.parentElement
if (tgt === null) {
return;
}
}
tgt.classList.toggle("red");
event.stopPropagation();
}
window.onload = function() {
for (ul of document.querySelectorAll("ul")) {
ul.addEventListener('click', on_click);
}
}
</script>
</head>
<body>
<ul>
<li>
<ul>
<li>AAA</li>
<li class="red">BBB</li>
<li>CCC</li>
</ul>
</li>
</ul>
</body>
</html>
这是 Chromium 的一个错误,看起来会在下一个稳定版本中修复。有关所有详细信息,请参阅 https://bugs.chromium.org/p/chromium/issues/detail?id=988414。