当前位置:  开发笔记 > 编程语言 > 正文

为什么在我追加孩子时我的输入值会被清除?

如何解决《为什么在我追加孩子时我的输入值会被清除?》经验,为你挑选了1个好方法。

当我在一个元素中添加一个元素时,我遇到了麻烦,div并且我输入的所有值(包括选定的选项)都被清除了,如下所示:

问题

正如您在单击"Añadirtecla"按钮时所看到的,文本框中的文本和所选选项"Shift"将返回默认选项"Flechas de movimiento".

为什么会发生这种情况,我该如何避免呢?

我的代码是下一个:

var controls = [{value: "flechas", text: "Flechas de movimiento"}, {value: "letras", text: "Letras (WASD)"}, {value: "enter", text: "Enter"}, {value: "control", text: "Ctrl"}, {value: "alt", text: "Alt"}, {value: "espacio", text: "Espacio"}, {value: "der", text: "Click derecho"}, {value: "izq", text: "Click izquierdo"}, {value: "mover", text: "Mover el ratón"}, {value: "shift", text: "Shift"}, {value: "customkey", text: "Especificar tecla"}];

function addControl(e) 
{
    e.appendChild(getControlSelect());
}

function getControlSelect() 
{
    var select = document.createElement('select'),
        option,
        i = 0,
        il = controls.length,
        html = document.createElement('div'),
        text = document.createElement('input'),
        delbtn = document.createElement('input');

    text.type = "text";

    delbtn.type = "button";
    delbtn.value = "-";

    for (; i < il; ++i)
    {
        option = document.createElement('option');
        option.setAttribute('value', controls[i].value);
        option.appendChild(document.createTextNode(controls[i].text));
        select.appendChild(option);
    }
    html.innerHTML += "Tecla
"; html.appendChild(select); html.innerHTML += "
Acción
"; html.appendChild(text); html.appendChild(delbtn); return html; }

HTML代码:

正如您所看到的,当我单击"Añadirtecla"时,我调用addControl函数并将parentNode作为唯一参数(稍后将用于将子项追加到其中).

所以,我不知道问题出在哪里,我认为一切都是正确的,但它需要一些东西来避免价值被清除.

编辑:我分享的代码没有问题,但我的完整代码在这里:

var controls = [{value: "flechas", text: "Flechas de movimiento"}, {value: "letras", text: "Letras (WASD)"}, {value: "enter", text: "Enter"}, {value: "control", text: "Ctrl"}, {value: "alt", text: "Alt"}, {value: "espacio", text: "Espacio"}, {value: "der", text: "Click derecho"}, {value: "izq", text: "Click izquierdo"}, {value: "mover", text: "Mover el ratón"}, {value: "shift", text: "Shift"}, {value: "customkey", text: "Especificar tecla"}],
	skippedIndexes = [],
	sep = "
", oldIndex = 0;//, //sInd = 0; function addControl(e) { if(e.lastChild.className != "sep") e.innerHTML += sep; e.appendChild(getControlSelect()); e.innerHTML += sep.replace(" id='firstsep'", ""); } function onSelectChange(e) { //Modify the array //a = e.associatedInput //console.log(e.dataset.i); /*var newIndex; newIndex = e.selectedIndex; if(skippedIndexes.length > 0 && skippedIndexes.indexOf(oldIndex) > -1) skippedIndexes.splice(skippedIndexes.indexOf(oldIndex), 1); //Delete oldIndex if(skippedIndexes.length > 0 && skippedIndexes.indexOf(newIndex) == -1) skippedIndexes.push(newIndex); oldIndex = newIndex;*/ //Change associated } function deleteFirstSep() { if(!document.getElementById("firstsep").nextSibling) document.getElementById("firstsep").remove(); } function getControlSelect() { var select = document.createElement('select'), option, i = 0, il = controls.length, html = document.createElement('div'), text = document.createElement('input'), delbtn = document.createElement('input'), ascinpt = document.createElement('input'), html1 = document.createElement('div'); html1.style.display = "inline-block"; text.type = "text"; text.name = "accion[]"; text.style.width = "158px"; delbtn.type = "button"; delbtn.setAttribute('onclick', 'var e = this.parentNode;e.nextSibling.remove();e.remove();deleteFirstSep();'); delbtn.value = "-"; delbtn.style.padding = "0 5px"; delbtn.style.marginLeft = "5px"; delbtn.style.position = "relative"; delbtn.style.top = "-20px"; delbtn.style.left = "2px"; ascinpt.name = "tecla[]"; ascinpt.type = "hidden"; select.id = "htmlkey"; select.dataset.associatedInput = ascinpt; //select.dataset.i = sInd; //sInd++; select.setAttribute("onchange", "onSelectChange(this)"); for (; i < il; ++i) if(skippedIndexes.indexOf(i) == -1) { option = document.createElement('option'); option.setAttribute('value', controls[i].value); option.appendChild(document.createTextNode(controls[i].text)); select.appendChild(option); } html1.innerHTML += "Tecla
"; html1.appendChild(select); html1.innerHTML += "
Acción
"; html1.appendChild(text); html.appendChild(html1); html.appendChild(delbtn); return html; }
.sep {
  border-top: 4px dashed #A4A4A4;
  margin: 15px 0 15px 0;
}



1> Oriol..:

问题是您覆盖HTML代码

element.innerHTML += newHTML;

这摆脱了当前元素的状态,包括事件监听器,输入值,检查等.

相反,你应该使用appendChildinsertAdjacentHTML:

element.insertAdjacentHTML('beforeend', newHTML);

var controls = [{value: "flechas", text: "Flechas de movimiento"}, {value: "letras", text: "Letras (WASD)"}, {value: "enter", text: "Enter"}, {value: "control", text: "Ctrl"}, {value: "alt", text: "Alt"}, {value: "espacio", text: "Espacio"}, {value: "der", text: "Click derecho"}, {value: "izq", text: "Click izquierdo"}, {value: "mover", text: "Mover el ratón"}, {value: "shift", text: "Shift"}, {value: "customkey", text: "Especificar tecla"}],
  skippedIndexes = [],
  sep = "
", oldIndex = 0; //, //sInd = 0; function addControl(e) { if (e.lastChild.className != "sep") e.innerHTML += sep; e.appendChild(getControlSelect()); e.insertAdjacentHTML('beforeend', sep.replace(" id='firstsep'", "")); } function onSelectChange(e) {} function deleteFirstSep() { if (!document.getElementById("firstsep").nextSibling) document.getElementById("firstsep").remove(); } function getControlSelect() { var select = document.createElement('select'), option, i = 0, il = controls.length, html = document.createElement('div'), text = document.createElement('input'), delbtn = document.createElement('input'), ascinpt = document.createElement('input'), html1 = document.createElement('div'); html1.style.display = "inline-block"; text.type = "text"; text.name = "accion[]"; text.style.width = "158px"; delbtn.type = "button"; delbtn.setAttribute('onclick', 'var e = this.parentNode;e.nextSibling.remove();e.remove();deleteFirstSep();'); delbtn.value = "-"; delbtn.style.padding = "0 5px"; delbtn.style.marginLeft = "5px"; delbtn.style.position = "relative"; delbtn.style.top = "-20px"; delbtn.style.left = "2px"; ascinpt.name = "tecla[]"; ascinpt.type = "hidden"; select.id = "htmlkey"; select.dataset.associatedInput = ascinpt; //select.dataset.i = sInd; //sInd++; select.setAttribute("onchange", "onSelectChange(this)"); for (; i < il; ++i) if (skippedIndexes.indexOf(i) == -1) { option = document.createElement('option'); option.setAttribute('value', controls[i].value); option.appendChild(document.createTextNode(controls[i].text)); select.appendChild(option); } html1.insertAdjacentHTML('beforeend', "Tecla
"); html1.appendChild(select); html1.insertAdjacentHTML('beforeend', "
Acción
"); html1.appendChild(text); html.appendChild(html1); html.appendChild(delbtn); return html; }
.sep {
  border-top: 4px dashed #A4A4A4;
  margin: 15px 0 15px 0;
}
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有