javascript - 如何在每次点击后清除按钮点击的内容并生成新的
问题描述
我做了很多研究,似乎找不到答案,或者我的搜索词不好。
我正在构建一个应用程序,该应用程序在使用方法生成的主体API
内获取和显示数据。我有一个文本框和表单按钮,当输入文本并单击按钮时,它会检索数据并将其构建到.HTML
document.createElement
HTML
这在一个阶段进展顺利,当我输入文本并多次单击按钮时,HTML
每次都会替换内容。但是现在当我输入文本并多次单击按钮HTML
时,每次生成并且每个HTML
内容显示在彼此下方,而不是清除当前HTML
并重新生成它。
如果有人可以请看我的代码,看看我哪里出错了,我们将不胜感激。
JSFiddle:https ://jsfiddle.net/4d01Lo85/ 。(在文本框中使用“Accio”和/或“Apparate”作为示例)
const spells = 'https://www.potterapi.com/v1/spells/?key=$2a$10$ETe09n075yUIX1L.Rd0Yx.lkB9svshYSg76BhZxIjrfrvp9/my5YG';
const spellBtn = document.querySelector('.spell-btn');
const spellTextBox = document.querySelector('#spell-text');
let spellContainer = document.querySelector('.spell-container');
function getJson(url, callback) {
const xhr = new XMLHttpRequest;
xhr.open('GET', url);
xhr.onload = () => {
if (xhr.status === 200) {
let data = JSON.parse(xhr.responseText);
return callback(data);
}
};
xhr.send();
}
function createElements(type, parent, elementClass, elementID) {
let element = document.createElement(type);
parent.appendChild(element);
element.className = elementClass;
element.id = elementID;
return element;
}
function generateSpellBody(data) {
let spellBody = createElements('div', spellContainer, 'spell-cast', 'spell-cast');
let spanclass = '';
let error = 'Sorry, this is not a spell, or try again.';
let spellName = '';
let spellEffect = '';
let spellType = '';
for (let i = 0; i < data.length; i++) {
if (data[i].spell === spellTextBox.value) {
spellName = data[i].spell;
spellEffect = `Type: ${data[i].effect}`;
spellType = `Effect: ${data[i].type}`;
spanclass += spellType;
error = '';
break;
}
}
if (spellName === spellTextBox.value) {
let spellRes = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-res');
let spellTypeDiv = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-type');
let spellEffPar = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-info');
spellRes.innerHTML = spellName;
spellTypeDiv.innerHTML = spellType;
spellEffPar.innerHTML = spellEffect;
}
let errorMsg = createElements('h3', spellBody, 'spell-error-message', 'error');
errorMsg.innerHTML = error;
}
spellBtn.addEventListener('click', (e) => {
e.preventDefault();
let numbers = /^([^0-9]*)$/;
let filledIn = true;
if (!filledIn) {
return;
}
if (!spellTextBox.value.match(numbers)) {
filledIn = false;
}
if (!filledIn) {
console.log('number alert');
} else {
getJson(spells, generateSpellBody);
}
});
<div class="col-md-12 col-sm-12 spell-container">
<form method='get'>
<div class="form-group">
<input type="text" class="form-control" id="spell-text" aria-describedby="emailHelp" placeholder="Enter spell">
</div>
<button type="submit" class="spell-btn btn btn-default btn-light">Do spell</button>
</form>
</div>
解决方案
在这种情况下,您重用了太多代码。尝试这个
我将表单移到容器外并清空容器(如果它是拼写容器)
const spells = 'https://www.potterapi.com/v1/spells/?key=$2a$10$ETe09n075yUIX1L.Rd0Yx.lkB9svshYSg76BhZxIjrfrvp9/my5YG';
const spellBtn = document.querySelector('.spell-btn');
const spellTextBox = document.querySelector('#spell-text');
let spellContainer = document.querySelector('.spell-container');
function getJson(url, callback) {
const xhr = new XMLHttpRequest;
xhr.open('GET', url);
xhr.onload = () => {
if (xhr.status === 200) {
let data = JSON.parse(xhr.responseText);
return callback(data);
}
};
xhr.send();
}
function createElements(type, parent, elementClass, elementID) {
if (parent === spellContainer) parent.innerHTML="";
let element = document.createElement(type);
parent.appendChild(element);
element.className = elementClass;
element.id = elementID;
return element;
}
function generateSpellBody(data) {
let spellBody = createElements('div', spellContainer, 'spell-cast', 'spell-cast');
let spanclass = '';
let error = 'Sorry, this is not a spell, or try again.';
let spellName = '';
let spellEffect = '';
let spellType = '';
for (let i = 0; i < data.length; i++) {
if (data[i].spell === spellTextBox.value) {
spellName = data[i].spell;
spellEffect = `Type: ${data[i].effect}`;
spellType = `Effect: ${data[i].type}`;
spanclass += spellType;
error = '';
break;
}
}
if (spellName === spellTextBox.value) {
let spellRes = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-res');
let spellTypeDiv = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-type');
let spellEffPar = createElements('p', spellBody, spanclass.toLowerCase(), 'spell-info');
spellRes.innerHTML = spellName;
spellTypeDiv.innerHTML = spellType;
spellEffPar.innerHTML = spellEffect;
}
let errorMsg = createElements('h3', spellBody, 'spell-error-message', 'error');
errorMsg.innerHTML = error;
}
spellBtn.addEventListener('click', (e) => {
e.preventDefault();
let numbers = /^([^0-9]*)$/;
let filledIn = true;
if (!filledIn) {
return;
}
if (!spellTextBox.value.match(numbers)) {
filledIn = false;
}
if (!filledIn) {
console.log('number alert');
} else {
getJson(spells, generateSpellBody);
}
});
<form method='get'>
<div class="form-group">
<input type="text" class="form-control" id="spell-text" aria-describedby="emailHelp" placeholder="Enter spell">
</div>
<button type="submit" class="spell-btn btn btn-default btn-light">Do spell</button>
</form>
<div class="col-md-12 col-sm-12 spell-container">
</div>
推荐阅读
- javascript - 如何清除ajax响应数据?
- sql - 在 Sybase SQL Server 中获取 yyyymmdd 日期的上周日期
- office365 - 是否可以从 power point web 插件获取登录用户的用户名?
- java - 即使我更改了条件的值,我的 do-while 循环似乎也一直在运行
- python - 如何将 cv2.imread 与 tkinter 连接?
- user-interface - Modelica:检查可替换包或模型的相等性
- vba - 使用 Workspace.openDatabase 上的 Jet 语句的 Visual Basic 语句出错
- javascript - 订购带有时间和点的帖子(如reddit)firestore
- python - 读取 Pcap 并将其写入 csv 文件 python
- visual-studio-2019 - windows 10中windbg Preview的位置是什么?以及如何在visual studio 2019中重命名项目名称?