如何在每次调用JavaScript中的函数时创建具有用户定义属性的新对象?

ryoqjall  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(96)

如果这是一个愚蠢的问题,我很抱歉,我是一个初学者。
我运行一个D&D游戏,我认为一个练习编码的好东西将是一个简单的主动性跟踪器。
目前,我只是尝试创建一个新对象,它包含用户定义的name和initiative修饰符属性。将它推送到combatant数组,并在每次按下saveCombBtn时将其显示在其余内容的下面。以下是我目前为止为它获得的代码:
于飞:

<!DOCTYPE html>
<html>
<head>
    <title>Initiative Tracker</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Initiative Tracker</h1>
    <div id="canvas">
        <div class="CombInElCont">
            <input id="combNameInEl" placeholder="Combatant Name">
            <input id="combInitModInEl" placeholder="Initiative Modifier" type="Number">
            <button id="saveCombBtn">Save Combatant</button>
        </div>
    </div>
<script src="script.js"></script>
</body>
</html>

JavaScript语言:

// Gets initial elements
const canvas = document.querySelector('#canvas');
const combInElCont = document.querySelector('.combInElCont');
const combNameInEl = document.querySelector('#combNameInEl');
const combInitModInEl = document.querySelector('#combInitModInEl');
const saveCombBtn = document.querySelector('#saveCombBtn');
const combArray = [];

// Combatant Object Constructor
function Combatant(combName, combInitMod) {
    this.name = combName;
    this.initMod = combInitMod;
}    

// Reads user input, saves data to object, and pushes it to array 
saveCombBtn.addEventListener('click', saveCombatant);
function saveCombatant() {
    console.log('saveBtn pressed');
    let combName = combNameInEl.value;
    let combInitMod = combInitModInEl.value;

    let newComb = new Combatant(combName, combInitMod);
    combArray.push(newComb);
    combNameInEl.value = '';
    combInitModInEl.value = '';
    disCombInfo();
};

// Displays combatant info underneath inputs
function disCombInfo() {
    for (let i = 0; i < combArray.length; i++) {
        canvas.innerHTML += `
        <div class="combInfoDisp">
            <p>
                Combatant Name:<br>
                ${combArray[i].name}<br>
                Initiative Modifier:<br>
                ${combArray[i].initMod}
            </p>
        </div>
        `
        console.log(combArray[i]);
    };
};

代码在第一次按下按钮时工作得很好,但甚至不会记录第二次按下按钮。
我目前唯一的理论是,我不能创建多个同名的对象(尽管我不认为这能解释为什么按钮在第二次被按下时都没有注册)。有没有一种方法可以在每次调用函数时给予对象一个唯一的名称,还有什么其他可能会引起我的问题?

1mrurvl1

1mrurvl11#

试试这个:
第一个

已编辑

原始代码的问题是它直接追加到canvas元素的innerHTML,这会弄乱按钮的eventListener,因为它是在画布中定义的。所以我的解决方法主要包括保留画布的innerHTML不变,并直接追加一个新元素,该新元素是用javascript的createElement函数动态创建的。

相关问题