【问题标题】:Cannot set innerHTML on one, of two, identical functions无法在两个相同功能中的一个或两个上设置 innerHTML
【发布时间】:2021-03-10 21:22:41
【问题描述】:

我有两个基本相同的功能。 negIndex 函数像宣传的那样工作,没有问题,但 posIndex 函数给我错误“无法将 enterTable.innerHTML 设置为 'null'”。

我对 Javascript 还很陌生,所以它可能是显而易见的,但如果它是我迷路了。我尝试了一些不同的事情,但没有积极的结果。任何帮助将不胜感激。

HTML

<ul id="exitTable" style="list-style-type: none; display: flex; flex-direction: column; vertical-align: center"></ul>
<br>
<ul id="enterTable" style="list-style-type: none; display: flex; flex-direction: column; vertical-align: center"></ul>

Javascript

// Put DOM elements into variables
const myForm = document.querySelector('#my-form');
const price = document.querySelector('#stockPrice');
const shares = document.querySelector('#sharesAmount');
const commission = document.querySelector('#commissionAmount');
const fee = document.querySelector('#feeAmount');
const max = document.querySelector('#maxGain');
const msg = document.querySelector('.msg');
const exitTable = document.querySelector('#exitTable');
const enterTable = document.querySelector('#enterTable');

// Listen for form submit
myForm.addEventListener('submit', onSubmit);

function onSubmit(e) {
    e.preventDefault();

    if (price.value === '' || shares.value === '') {
        // alert
        msg.classList.add('error');
        msg.innerHTML = 'Please enter required fields';

        // Remove error after 3 seconds
        setTimeout(() => msg.remove(), 3000);
    } else {
        let subTotal = price.value * shares.value;
        subTotal = subTotal.toFixed(2)
        let total = subTotal + parseFloat(commission.value);

        function popList(name) {
            let li = document.createElement('li');
            li.textContent = name;
            li.style.cssText = 'text-align: center'
            return li;
        }

        //finds the 5%-50% loss amounts based on subTotal
        function negIndex(num) {
            let negPer = -0.05;
            let negArray = [];
            let i = 0;
            exitTable.innerHTML = "";
            while (negPer >= -0.50) {
                negArray[i] = parseFloat(num * negPer).toFixed(2);
                let s = parseFloat(negPer * 100).toFixed(1) + "% " + negArray[i];
                let x = popList(s); //creating list elements
                exitTable.appendChild(x);
                i++;
                negPer += -0.05;
            }
        }

        function posIndex(num) {
            let posPer = 0.05;
            let posArray = [];
            let i = 0;
            enterTable.innerHTML = "";
            while (posPer <= 1.00) {
                posArray[i] = parseFloat(num * posPer).toFixed(2);
                let s = parseFloat(posPer * 100).toFixed(1) + "% ->" + posArray[i];
                let x = popList(s);
                enterTable.appendChild(x);
                i++;
                posPer += 0.05;
            }
        }

        posIndex(subTotal);
        negIndex(subTotal);
}

//Listen for form clear
myForm.addEventListener('reset', onReset);

function onReset() {
    price.innerHTML = "";
    shares.innerHTML = "";
    commission.innerHTML = "";
    fee.innerHTML = "";
}

【问题讨论】:

  • 这并不能回答你的问题,但是由于你是一个新的贡献者,我想说:保持发布的代码简短,以便其他人能够更好地帮助你。长代码可以使人们甚至不阅读就离开您的问题。见this SO help page
  • msg.remove() 从 DOM 中删除元素,在尝试显示之前,我看不到您将元素重新附加到 DOM 的位置。
  • 您的 JavaScript 包含一些错误。 onSubmit 永远不会关闭,并且 subTotal 似乎是在 onSubmit 内部声明的,但它在该函数之外不可用。 html 与脚本不匹配。

标签: javascript innerhtml


【解决方案1】:

我只是在猜测你的 html 会是什么样子

// Put DOM elements into variables
const myForm = document.querySelector('#my-form');
const price = document.querySelector('#stockPrice');
const shares = document.querySelector('#sharesAmount');
const commission = document.querySelector('#commissionAmount');
const fee = document.querySelector('#feeAmount');
const max = document.querySelector('#maxGain');
const msg = document.querySelector('.msg');
const exitTable = document.querySelector('#exitTable');
const enterTable = document.querySelector('#enterTable');
let subTotal = 0;

// Listen for form submit
myForm.addEventListener('submit', onSubmit);

function onSubmit(e) {
    e.preventDefault();

    if (price.value === '' || shares.value === '') {
        // alert
        msg.classList.add('error');
        msg.innerHTML = 'Please enter required fields';

        // Remove error after 3 seconds
        setTimeout(() => {
            msg.classList.remove('error');
            msg.innerHTML = '';
        }, 3000);
    } else {
        subTotal = price.value * shares.value;
        subTotal = subTotal.toFixed(2)
    }

    posIndex(subTotal);
    negIndex(subTotal);
}

function popList(name) {
    let li = document.createElement('li');
    li.textContent = name;
    li.style.cssText = 'text-align: center'
    return li;
}

//finds the 5%-50% loss amounts based on subTotal
function negIndex(num) {
    let negPer = -0.05;
    let negArray = [];
    let i = 0;
    exitTable.innerHTML = "";
    while (negPer >= -0.50) {
        negArray[i] = parseFloat(num * negPer).toFixed(2);
        let s = parseFloat(negPer * 100).toFixed(1) + "% " + negArray[i];
        let x = popList(s); //creating list elements
        exitTable.appendChild(x);
        i++;
        negPer += -0.05;
    }
}

function posIndex(num) {
    let posPer = 0.05;
    let posArray = [];
    let i = 0;
    enterTable.innerHTML = "";
    while (posPer <= 1.00) {
        posArray[i] = parseFloat(num * posPer).toFixed(2);
        let s = parseFloat(posPer * 100).toFixed(1) + "% ->" + posArray[i];
        let x = popList(s);
        enterTable.appendChild(x);
        i++;
        posPer += 0.05;
    }
}

//Listen for form clear
myForm.addEventListener('reset', onReset);

function onReset() {
    price.innerHTML = "";
    shares.innerHTML = "";
    commission.innerHTML = "";
    fee.innerHTML = "";
}
<form id="my-form">
    <div>
        <label for="stockPrice">Stock price</label>
        <input type="number" id="stockPrice" />
    </div>
    <div>
        <label for="sharesAmount">Shares amount</label>
        <input type="number" id="sharesAmount" />
    </div>
    <div>
        <label for="commissionAmount">Commission amount</label>
        <input type="number" id="commissionAmount" />
    </div>
    <div>
        <label for="feeAmount">Fee amount</label>
        <input type="number" id="feeAmount" />
    </div>
    <div>
        <label for="maxGain">Max gain</label>
        <input type="number" id="maxGain" />
    </div>
    <div class="msg"></div>
    <button type="submit">Submit</button>
</form>
<ul id="exitTable" style="list-style-type: none; display: flex; flex-direction: column; vertical-align: middle"></ul>
<br>
<ul id="enterTable" style="list-style-type: none; display: flex; flex-direction: column; vertical-align: middle"></ul>

【讨论】:

  • 基本上,是的,这就是它的样子。因此,您将 neg/posIndex 函数移到了 onSubmit 之外,并从内部调用了它们。我知道了。这就是诀窍,我很感激你的回应。我仍然有点好奇为什么,如果我在我的原始代码中注释掉posIndex,并且只运行否定它可以工作,但同时两者都不会。我什至将它们组合成一个仍在 onSubmit 中的函数,并且它起作用了。很奇怪。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多