如何仅使用 JavaScript 来切换输入的焦点?
How to toggle the focus of an input using only JavaScript?
我一直在尝试制作这个东西,当它的外部 div 被点击时,它会将输入集中在它里面。我真的希望这不是重复的,因为我到处搜索但没有找到答案。我有被屏蔽的风险,所以我希望没有人将其标记为重复。
这是下面的代码,它适用于聚焦输入,但当它必须取消聚焦时它似乎不起作用。
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
for (x = 0; x < drops; x++) {
var input = document.getElementById(drop[x].getAttribute("input"));
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if (this == document.activeElement) {
input.blur();
} else {
input.focus();
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" input="scales" class="datadrop">
<input type="text" id="scales" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
我希望有人只使用 JavaScript 就可以回答这个问题,我希望没有人将其标记为重复,因为我尽量不重复。
试试这个,
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
var focus_array = []; // lets log each focus and blur in this array
for (x = 0; x < drops; x++) {
var input = document.getElementById(drop[x].getAttribute("input"));
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if (focus_array[x]) { // just check focus array
input.blur();
focus_array[x]=0; //update focus array for blur
} else {
input.focus();
focus_array[x]=1; //update focus array for focus
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" input="scales" class="datadrop">
<input type="text" id="scales" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
我编辑了您的代码段。
你使用了一个循环,所以我假设你想要多个输入。
顺便说一句,请注意该元素没有“输入”属性。我试图遵循您代码的逻辑,所以我用 data-input 属性替换了“输入”-错误-属性。
我使用了两个标志来检查输入是否被选中:“inputIsSelected”和“selectedDrop”
如果 inputIsSelected 并点击相同的 parent 模糊
如果 inputnotSelected 和相同的 parent 焦点
如果 parent 发生变化,则将 inputIsSelected 设置为 false
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
let selectedDrop = null // a flag the clicked drop
let inputIsSelected = false;
console.log({drops})
var x;
for (x = 0; x < drops; x++) {
//var input = document.getElementById(drop[x].getAttribute("input"));
let inputId = drop[x].dataset.input; //select inputId using a data-* attribute
let input = document.getElementById(inputId);
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if(this!==selectedDrop){
selectedDrop = this;
inputIsSelected = false;
}
if(!inputIsSelected){
input.focus();
inputIsSelected=true;
}else{
inputIsSelected=false;
input.blur()
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" data-input="scales-1" class="datadrop">
<input type="text" id="scales-1" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<div datadrop="scale" data-input="scales-2" class="datadrop">
<input type="text" id="scales-2" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
如果你想根据键盘输入的值改变输入的值而不给输入焦点,你可以这样做。
let element = document.getElementById("scales");
window.addEventListener("keydown", function () {
element.value = String.fromCharCode(event.keyCode);
})
我一直在尝试制作这个东西,当它的外部 div 被点击时,它会将输入集中在它里面。我真的希望这不是重复的,因为我到处搜索但没有找到答案。我有被屏蔽的风险,所以我希望没有人将其标记为重复。
这是下面的代码,它适用于聚焦输入,但当它必须取消聚焦时它似乎不起作用。
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
for (x = 0; x < drops; x++) {
var input = document.getElementById(drop[x].getAttribute("input"));
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if (this == document.activeElement) {
input.blur();
} else {
input.focus();
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" input="scales" class="datadrop">
<input type="text" id="scales" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
我希望有人只使用 JavaScript 就可以回答这个问题,我希望没有人将其标记为重复,因为我尽量不重复。
试试这个,
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
var focus_array = []; // lets log each focus and blur in this array
for (x = 0; x < drops; x++) {
var input = document.getElementById(drop[x].getAttribute("input"));
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if (focus_array[x]) { // just check focus array
input.blur();
focus_array[x]=0; //update focus array for blur
} else {
input.focus();
focus_array[x]=1; //update focus array for focus
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" input="scales" class="datadrop">
<input type="text" id="scales" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
我编辑了您的代码段。 你使用了一个循环,所以我假设你想要多个输入。 顺便说一句,请注意该元素没有“输入”属性。我试图遵循您代码的逻辑,所以我用 data-input 属性替换了“输入”-错误-属性。
我使用了两个标志来检查输入是否被选中:“inputIsSelected”和“selectedDrop”
如果 inputIsSelected 并点击相同的 parent 模糊 如果 inputnotSelected 和相同的 parent 焦点 如果 parent 发生变化,则将 inputIsSelected 设置为 false
window.onload = function() {
var drop = document.getElementsByClassName("datadrop");
var drops = document.getElementsByClassName("datadrop").length;
let selectedDrop = null // a flag the clicked drop
let inputIsSelected = false;
console.log({drops})
var x;
for (x = 0; x < drops; x++) {
//var input = document.getElementById(drop[x].getAttribute("input"));
let inputId = drop[x].dataset.input; //select inputId using a data-* attribute
let input = document.getElementById(inputId);
drop[x].onclick = function(e) {
e.preventDefault();
clicked = 0
if(this!==selectedDrop){
selectedDrop = this;
inputIsSelected = false;
}
if(!inputIsSelected){
input.focus();
inputIsSelected=true;
}else{
inputIsSelected=false;
input.blur()
}
}
}
}
.datadrop {
padding: 7.5px;
width: 85px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.datadrop .drop {
width: 150px;
position: fixed;
display: none;
}
.datadrop .item {
padding: 10px;
}
.datadrop .item:hover {
background-color: #F1F3F4;
}
.datadrop .divider {
padding: 5px;
color: grey;
}
.datadrop .divider:hover {
background-color: #ffffff;
}
.datadrop input {
width: 60px;
color: black;
}
.datadrop:hover {
background-color: #F1F3F4;
color: #5F6368;
}
.datadrop .click {
color: #5F6368;
}
.datadrop input {
background-color: transparent;
border: 1px solid transparent;
outline: none;
padding: 5px;
}
.datadrop input:focus {
background-color: white;
border: 1px solid black;
border-radius: 2.5px;
}
<div datadrop="scale" data-input="scales-1" class="datadrop">
<input type="text" id="scales-1" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<div datadrop="scale" data-input="scales-2" class="datadrop">
<input type="text" id="scales-2" value="100%"> | <i class="fa-solid fa-caret-down click"></i>
<div class="drop" id="scale">
<div class="item">Fit</div>
<div class="item divider">
<hr>
</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
<div class="item">Fit</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
如果你想根据键盘输入的值改变输入的值而不给输入焦点,你可以这样做。
let element = document.getElementById("scales");
window.addEventListener("keydown", function () {
element.value = String.fromCharCode(event.keyCode);
})