每次调用JavaScript时,JavaScript动态元素重复

时间:2018-12-25 01:55:19

标签: javascript

我有一个称为validateForm()的函数,该函数为我检查表单输入。如果输入不是正确的(每个字段都已填写),则应该显示警报消息,并应在3秒钟后删除警报消息,但确实如此,但是每次我调用此函数时,都会在DOM中创建此元素。如何改善该代码?我想要得到的是带有警报消息的div,如下所示,但不是每次调用该函数时都在DOM中创建,而是一次。

static validateForm() {
    const title = document.querySelector('#title').value;
    const author = document.querySelector('#author').value;
    const isbn = document.querySelector('#isbn').value;

    if (title === '' || author === '' || isbn === '') {
        const div = document.createElement('div');
        div.className = 'alert alert-dismissible alert-danger';
        const message = document.createTextNode('Please fill all fields before adding.');
        div.appendChild(message);

        const bookForm = document.querySelector('#book-form');
        bookForm.parentNode.insertBefore(div, bookForm);


        setTimeout(() => {
            div.classList.add('d-none');
        }, 3000);

        return false;
    }

    return true;
}

4 个答案:

答案 0 :(得分:1)

您可以在HTML中创建用于警报的div,并将其赋予类别隐藏以便将其隐藏。

然后,当输入不正确时,可以通过警报消息更改该div元素的内部HTML,并添加类 show 使其显示。

放映时间结束后,让我们从该div中删除放映类。

.hidden {
  display: none;
} 

.show {
  display: block;
}

答案 1 :(得分:1)

如果您不想切换样式,appendChild的倒置形式为removeChild


//you can reuse the div
const div = document.createElement('div');
{
  div.className = 'alert alert-dismissible alert-danger';
  const message = document.createTextNode('Please fill all fields before adding.');
  div.appendChild(message);
}
function foo() {
  const bookForm = document.querySelector('#root');
  bookForm.parentNode.insertBefore(div, bookForm);

  setTimeout(()=>bookForm.parentNode.removeChild(div), 3000);
}
<div id="root"></div>

<button onclick="foo()">show node</button>

答案 2 :(得分:1)

尝试一下:

//construct div globally
var div = document.createElement('div');
div.className = 'alert alert-dismissible alert-danger';
div.style.display = "none";
const bookForm = document.querySelector('#book-form');
bookForm.parentNode.insertBefore(div, bookForm);


static validateForm() {
    const title = document.querySelector('#title').value;
    const author = document.querySelector('#author').value;
    const isbn = document.querySelector('#isbn').value;

    if (title === '' || author === '' || isbn === '') {
        const message = document.createTextNode('Please fill all fields before adding.');
        div.html = message;
        div.style.display = "block";

        setTimeout(() => {
            div.classList.add('d-none');
        }, 3000);

        return false;
    }

    return true;
}

答案 3 :(得分:0)

最简单的方法是使用带有 d-none 类的html创建div,然后在要显示div时添加 d-block 类。或使用JQuery slideDown()函数。然后设置超时并删除 d-block 类并添加 d-none 类或使用JQuery slideUp()函数