gpt4 book ai didi

javascript - “Autofocus”属性在输入元素上只起作用一次,但不会起作用两次

转载 作者:行者123 更新时间:2023-11-28 00:47:30 24 4
gpt4 key购买 nike

我在 d3.js 中编写代码,有时使用 input 元素来收集用户的输入,而无需使用 form。这很好用。

但我注意到我无法在动态页面上始终如一地应用 autofocus 属性;它仅在第一次应用时有效。

下面是一个示例,包含所有编码。请注意 autofocusinput 元素第一次出现时是如何完美工作的。第二次它根本不起作用,即使编码是相同的。

解决此问题将尤其改善智能手机上的用户体验。

注意 .focus() 方法不起作用,我认为那是因为它只能应用于input 元素是表单的一部分。

h1,
p,
input {
font-family: sans-serif;
}

h1 {
font-size: 1rem;
}

input {
padding: 0.5rem;
border-radius: 1rem;
color: gray;
opacity: 0;
}

input::placeholder {
font-weight: normal;
color: silver;
}

input:focus {
outline: none;
}
<script src="https://d3js.org/d3.v4.min.js"></script>

<div id="container">
<h1>Testing the autofocus</h1>
</div>

<script>
// wait 2 seconds, then create input element with autofocus
d3.timeout(function() {
createFirstInput();
}, 2000);

function createFirstInput() {
d3.select("h1")
.text("Creating first input field")
d3.select("#container")
.append("input")
.attr("type", "text")
.attr("placeholder", "input goes here")
.attr("autofocus", "autofocus")
.transition()
.duration(2000)
.style("opacity", 1);
d3.select("#container")
.append("p")
.text("autofocus works; cursor appears in input field");
// delete input field after 5 seconds
d3.timeout(function() {
d3.select("h1")
.text("Creating second input field");
d3.selectAll("input, p")
.remove();
// create second input field
createSecondInput();
}, 5000);
}

function createSecondInput() {
// wait 2 seconds, then create input element with autofocus
d3.timeout(function() {
d3.select("#container")
.append("input")
.attr("type", "text")
.attr("placeholder", "input goes here")
.attr("autofocus", "autofocus")
.transition()
.duration(2000)
.style("opacity", 1);
d3.select("#container")
.append("p")
.text("autofocus doesn't work; no cursor in input field");
}, 2000);
}
</script>

最佳答案

focus()方法确实有效:

input.node().focus();

此处,input 是附加输入的 D3 选择(顺便说一下,为您的选择命名!这是一个很好的做法)。通过在该选择上使用 node(),我们得到实际的 DOM 元素,我们使用 focus() 方法。

这是演示:

h1,
p,
input {
font-family: sans-serif;
}

h1 {
font-size: 1rem;
}

input {
padding: 0.5rem;
border-radius: 1rem;
color: gray;
opacity: 0;
}

input::placeholder {
font-weight: normal;
color: silver;
}

input:focus {
outline: none;
}
<script src="https://d3js.org/d3.v4.min.js"></script>

<div id="container">
<h1>Testing the autofocus</h1>
</div>

<script>
// wait 2 seconds, then create input element with autofocus
d3.timeout(function() {
createFirstInput();
}, 2000);

function createFirstInput() {
d3.select("h1")
.text("Creating first input field")
d3.select("#container")
.append("input")
.attr("type", "text")
.attr("placeholder", "input goes here")
.attr("autofocus", "autofocus")
.transition()
.duration(2000)
.style("opacity", 1);
d3.select("#container")
.append("p")
.text("autofocus works; cursor appears in input field");
// delete input field after 5 seconds
d3.timeout(function() {
d3.select("h1")
.text("Creating second input field");
d3.selectAll("input, p")
.remove();
// create second input field
createSecondInput();
}, 5000);
}

function createSecondInput() {
// wait 2 seconds, then create input element with autofocus
d3.timeout(function() {
var input = d3.select("#container")
.append("input")
.attr("type", "text")
.attr("placeholder", "input goes here")
.attr("autofocus", "autofocus")
.transition()
.duration(2000)
.style("opacity", 1);
input.node().focus();
d3.select("#container")
.append("p")
.text("autofocus with focus() method does work");
}, 2000);
}
</script>

关于javascript - “Autofocus”属性在输入元素上只起作用一次,但不会起作用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49594197/

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