gpt4 book ai didi

javascript - 为什么 D3 对输入的关注仅在第一次起作用?

转载 作者:行者123 更新时间:2023-12-01 03:33:50 25 4
gpt4 key购买 nike

可以focus on an input field使用D3,甚至不需要to go through setTimeout (我不知道为什么,但我没有提示)。

但这仅在第一次有效。第二次按Set(即:SetResetSet)后,输入字段不接收焦点。为什么?

设置焦点回调 after the transition is complete给我一个错误。

<!DOCTYPE HTML>
<head>
<style>
div { width: 300px; }
div#outerdiv { height: 500px; background-color: #ccc; }
div#topdiv { height: 400px; background-color: #dff; }
div#bottomdiv { height: 0px; background-color: #ffd; display: 'none' }
input:focus { background-color: pink; }
</style>
</head>
<body>
<div id="outerdiv">
<div id="topdiv">
<button onclick=open_form();>Set</button>
<button onclick=close_form();>Reset</button>
</div>

<div id="bottomdiv">
<form action="javascript:close_form()">
Name:
<input type="text" id="myTextField" name="name">
<input type="submit" name="submit" value="Submit">
</form>
</div>
</div>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>

<script>
function open_form() {
d3.select('#topdiv').transition().duration(500)
.style('height', '100px');
d3.select('#bottomdiv').transition().duration(500)
.style('height', '300px').style('display', 'inline-block');

d3.select("#myTextField").node().focus();
}
function close_form() {
d3.select('#topdiv').transition().duration(500)
.style('height', '390px');
d3.select('#bottomdiv').transition().duration(500)
.style('height', '10px').style('display', 'none');
}
</script>
</body>

最佳答案

每次点击重置按钮时,即调用close_form()时,您的#bottomdiv都会转换为显示:无:

d3.select('#bottomdiv').transition().duration(500)
.style('height', '10px').style('display', 'none');

不过,这有一些副作用。查看 focus management 上的 HTML5 规范表明未渲染的元素也不可聚焦:

7.4.2 Focus management

An element is focusable if all of the following conditions are met:

因此,下次您点击 Set 从而调用 open_form() 时,输入将无法聚焦,因为到 inline-block 的转换已还没有结束。解决这个问题最简单的方法是 listen用于转换的 end 事件,该事件在转换结束后触发。

   d3.select('#bottomdiv').transition().duration(500)
.style('height', '300px').style('display', 'inline-block')
.on("end", () => d3.select("#myTextField").node().focus());

看看下面的代码片段,了解一个有效的演示:

function open_form() {
d3.select('#topdiv').transition().duration(500)
.style('height', '100px');
d3.select('#bottomdiv').transition().duration(500)
.style('height', '300px').style('display', 'inline-block')
.on("end", () => d3.select("#myTextField").node().focus());

}
function close_form() {
d3.select('#topdiv').transition().duration(500)
.style('height', '390px');
d3.select('#bottomdiv').transition().duration(500)
.style('height', '10px').style('display', 'none');
}
div { width: 300px; }
div#outerdiv { height: 500px; background-color: #ccc; }
div#topdiv { height: 400px; background-color: #dff; }
div#bottomdiv { height: 0px; background-color: #ffd; display: 'none' }
input:focus { background-color: pink; }
<body>
<div id="outerdiv">
<div id="topdiv">
<button onclick=open_form();>Set</button>
<button onclick=close_form();>Reset</button>
</div>

<div id="bottomdiv">
<form action="javascript:close_form()">
Name:
<input type="text" id="myTextField" name="name">
<input type="submit" name="submit" value="Submit">
</form>
</div>
</div>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>

</body>

关于javascript - 为什么 D3 对输入的关注仅在第一次起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com