我想在文本字段中列出名称,然后能够单击每个名称
I want to make a list of names in a textfield and then be able to click on each name
我正在尝试为 Firebase 上的项目创建一个管理站点。大多数站点的页面都有一个大文本字段,应该包含所有可以修改的当前项目。
例如:
用户管理页面左侧有文本字段以显示用户的所有信息,右侧是一个大文本字段,我希望能够将用户名加载到其中然后能够 select一个并将该用户的信息从 Firebase 用户数据库加载到左侧字段中。然后我希望能够更改并保存这些值。
我目前的困境是我不明白如何实现右侧。我了解写入文本字段的基本过程,但是,我不知道如何才能使它们 select 可用。由于这在 Windows windows 中很常见,我知道有办法做到这一点,但我不知道怎么做。我对如何将名称分成单个对象也有点模糊。
我尝试创建的示例类似于 windows 卸载程序 window[或此 window 在属性中显示用户列表 window
https://i.stack.imgur.com/iGOjr.png
哪些命令可以帮助我实现我想要做的事情?
根据我对你的问题和你发布的图片的最佳理解,我创建了一个工作原型。这只是使用原版 JavaScript、HTML 和 CSS。我敢肯定它在实施中看起来会有些不同,但希望它足够接近,可以为您提供一个起点。
更新:
我根据 Sensoray 的评论更新了我的答案。
//create an object of users
let Users = [
{
"name": " Fro Doe",
"id": "user1",
"snack": "Chips"
},
{
"name": " Mare Ree",
"id": "user2",
"snack": "Bananas"
},
{
"name": " Sam Wise",
"id": "user3",
"snack": "Candy"
},
]
//identify our list element
let list = document.querySelector('#user-list');
//loop through users in out Users object and add them to the list
for (var i = 0; i < Users.length; i ++) {
let newItem = document.createElement('option');
newItem.innerHTML = Users[i].name;
newItem.id = Users[i].id;
if (i == 0) {
newItem.className = "active";
}
list.appendChild(newItem);
}
list.size = Users.length;
updateResponse(list.firstChild);
//collect all the list items
let listItems = list.querySelectorAll('option');
//loop through the list itmes and add a click listener to each that toggles the 'active' state
for (var i = 0; i < listItems.length; i ++) {
listItems[i].addEventListener('click', function(e) {
if (!e.target.classList.contains('active')) {
for (var i = 0; i < listItems.length; i ++) {
listItems[i].classList.remove('active');
}
e.target.classList.add('active');
updateResponse(e.target);
}
})
}
function updateResponse(element) {
//collect the response element
let response = document.querySelector('#response');
//collect each input from the response element
responseId = response.querySelector('.response-id');
responseName = response.querySelector('.response-name');
responseSnack = response.querySelector('.response-snack');
//find the matching user in the users object and update the inputs to match
for (var i = 0; i < Users.length; i ++) {
if (Users[i].id == element.id) {
responseId.value = Users[i].id;
responseName.value = Users[i].name;
responseSnack.value = Users[i].snack;
}
}
}
function updateUser() {
//collect the response element
let response = document.querySelector('#response');
//collect each input from the response element
responseId = response.querySelector('.response-id');
responseName = response.querySelector('.response-name');
responseSnack = response.querySelector('.response-snack');
//update the js object values
for (var i = 0; i < Users.length; i ++) {
if (Users[i].id == responseId.value) {
Users[i].name = responseName.value;
Users[i].snack = responseSnack.value;
}
}
//update the list
//find current list item
let curItem = list.querySelector('#'+responseId.value);
//update the text on the item
curItem.innerText = responseName.value;
//keep the page from redirecting
return false;
}
body {
font-family: "Segoe UI Variable Text", system-ui, ui-rounded, sans-serif;
}
.parent {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
}
h1 {
font-family: "Segoe UI Variable Display", system-ui, ui-rounded, sans-serif;
font-weight: 500;
}
@media only screen and (max-width: 500px) {
.parent {
grid-template-columns: auto;
}
}
select {
list-style: none;
margin: 0;
padding: 0;
border: 1px solid #ABABAB;
border-radius: 8px;
overflow: auto;
width: 100%;
}
option {
padding: 8px 4px;
}
form {
display: grid;
grid-template-columns: auto 1fr;
gap: 16px;
}
<div class="parent">
<div class="right">
<h1>Users:</h1>
<select name="user-list" size="3" id="user-list"></select>
</div>
<div class="left">
<h1>User Info:</h1>
<form id="response" onsubmit="return updateUser()">
<label for="id">User ID:</label><input type="text" name="id" class="response-id" disabled></input>
<label for="name">User Name:</label><input type="text" name="name" class="response-name"></input>
<label for="snack">User's Favorite Snack:</label><input type="text" name="snack" class="response-snack"></input>
<input type="submit" value="Save">
</form>
</div>
</div>
我正在尝试为 Firebase 上的项目创建一个管理站点。大多数站点的页面都有一个大文本字段,应该包含所有可以修改的当前项目。
例如: 用户管理页面左侧有文本字段以显示用户的所有信息,右侧是一个大文本字段,我希望能够将用户名加载到其中然后能够 select一个并将该用户的信息从 Firebase 用户数据库加载到左侧字段中。然后我希望能够更改并保存这些值。
我目前的困境是我不明白如何实现右侧。我了解写入文本字段的基本过程,但是,我不知道如何才能使它们 select 可用。由于这在 Windows windows 中很常见,我知道有办法做到这一点,但我不知道怎么做。我对如何将名称分成单个对象也有点模糊。
我尝试创建的示例类似于 windows 卸载程序 window[或此 window 在属性中显示用户列表 window
https://i.stack.imgur.com/iGOjr.png
哪些命令可以帮助我实现我想要做的事情?
根据我对你的问题和你发布的图片的最佳理解,我创建了一个工作原型。这只是使用原版 JavaScript、HTML 和 CSS。我敢肯定它在实施中看起来会有些不同,但希望它足够接近,可以为您提供一个起点。
更新:
我根据 Sensoray 的评论更新了我的答案。
//create an object of users
let Users = [
{
"name": " Fro Doe",
"id": "user1",
"snack": "Chips"
},
{
"name": " Mare Ree",
"id": "user2",
"snack": "Bananas"
},
{
"name": " Sam Wise",
"id": "user3",
"snack": "Candy"
},
]
//identify our list element
let list = document.querySelector('#user-list');
//loop through users in out Users object and add them to the list
for (var i = 0; i < Users.length; i ++) {
let newItem = document.createElement('option');
newItem.innerHTML = Users[i].name;
newItem.id = Users[i].id;
if (i == 0) {
newItem.className = "active";
}
list.appendChild(newItem);
}
list.size = Users.length;
updateResponse(list.firstChild);
//collect all the list items
let listItems = list.querySelectorAll('option');
//loop through the list itmes and add a click listener to each that toggles the 'active' state
for (var i = 0; i < listItems.length; i ++) {
listItems[i].addEventListener('click', function(e) {
if (!e.target.classList.contains('active')) {
for (var i = 0; i < listItems.length; i ++) {
listItems[i].classList.remove('active');
}
e.target.classList.add('active');
updateResponse(e.target);
}
})
}
function updateResponse(element) {
//collect the response element
let response = document.querySelector('#response');
//collect each input from the response element
responseId = response.querySelector('.response-id');
responseName = response.querySelector('.response-name');
responseSnack = response.querySelector('.response-snack');
//find the matching user in the users object and update the inputs to match
for (var i = 0; i < Users.length; i ++) {
if (Users[i].id == element.id) {
responseId.value = Users[i].id;
responseName.value = Users[i].name;
responseSnack.value = Users[i].snack;
}
}
}
function updateUser() {
//collect the response element
let response = document.querySelector('#response');
//collect each input from the response element
responseId = response.querySelector('.response-id');
responseName = response.querySelector('.response-name');
responseSnack = response.querySelector('.response-snack');
//update the js object values
for (var i = 0; i < Users.length; i ++) {
if (Users[i].id == responseId.value) {
Users[i].name = responseName.value;
Users[i].snack = responseSnack.value;
}
}
//update the list
//find current list item
let curItem = list.querySelector('#'+responseId.value);
//update the text on the item
curItem.innerText = responseName.value;
//keep the page from redirecting
return false;
}
body {
font-family: "Segoe UI Variable Text", system-ui, ui-rounded, sans-serif;
}
.parent {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
}
h1 {
font-family: "Segoe UI Variable Display", system-ui, ui-rounded, sans-serif;
font-weight: 500;
}
@media only screen and (max-width: 500px) {
.parent {
grid-template-columns: auto;
}
}
select {
list-style: none;
margin: 0;
padding: 0;
border: 1px solid #ABABAB;
border-radius: 8px;
overflow: auto;
width: 100%;
}
option {
padding: 8px 4px;
}
form {
display: grid;
grid-template-columns: auto 1fr;
gap: 16px;
}
<div class="parent">
<div class="right">
<h1>Users:</h1>
<select name="user-list" size="3" id="user-list"></select>
</div>
<div class="left">
<h1>User Info:</h1>
<form id="response" onsubmit="return updateUser()">
<label for="id">User ID:</label><input type="text" name="id" class="response-id" disabled></input>
<label for="name">User Name:</label><input type="text" name="name" class="response-name"></input>
<label for="snack">User's Favorite Snack:</label><input type="text" name="snack" class="response-snack"></input>
<input type="submit" value="Save">
</form>
</div>
</div>