Javascript在单击时创建removeChild和appendChild

Javascript在单击时创建removeChild和appendChild,javascript,html,Javascript,Html,我有一个链接,在单击事件中生成输入、标签和文本,我想在同一链接的下一次单击事件中删除该链接: 它不起作用,这是我的新代码: var addAnswer = (function() { var label; var text; return function (array_output) { label.parentNode.removeChild(label); label.removeChild(text); text = null; label =

我有一个链接,在单击事件中生成输入、标签和文本,我想在同一链接的下一次单击事件中删除该链接:

它不起作用,这是我的新代码:

var addAnswer = (function() {

   var label;
   var text;

   return function (array_output) {


  label.parentNode.removeChild(label);
  label.removeChild(text);
  text = null;
  label = null;


  label = document.createElement('label');
  text = document.createTextNode(array_output[i]);

  document.body.appendChild(label)
  label.appendChild(text);

 };

}());

var tab = ['one', 'two','three','four','five']  
var label = document.createElement('label');
var i = 0;

window.onclick = function () {

     addAnswer(tab);
     i++;   
}
我想看到,在点击事件中,“一”然后再点击“二”,然后再点击“三”

编辑:好的,我终于发现:

  var addAnswer = (function() {

  var label;
  var text;

  return function (array_output) {

if(label) { 

  label.parentNode.removeChild(label);
  label.removeChild(text);
  text = null;
  label = null;


  label = document.createElement('label');
  text = document.createTextNode(array_output[i++]);

  document.body.appendChild(label)
  label.appendChild(text);

}else{

  label = document.createElement('label');
  text = document.createTextNode(array_output[i]);

  document.body.appendChild(label)
  label.appendChild(text);
}
})

}())


每次调用函数时,都会创建一个新的执行上下文。所以当你这样做的时候:

if(label) {
    label.parentNode.removeChild(label)
}
然后标签将始终是未定义的,因为它直到稍后才被赋值。您可能需要存储对已创建元素的引用,以便以后删除它。关闭可能适用于:

var addAnswer = (function() {

  // Declare label here in "outer" execution context
  var label;

  return function (array_output) {

    // If label is truthy, assume references an element so remove it
    // and then remove reference so it's available for garbage collection
    if(label) {
      label.parentNode.removeChild(label);
      label = null;

    // If label was falsey, create a new one and keep a reference
    } else {

      // do stuff

      // don't declare label here so reference is kept using
      // the variable "label" in the outer scope
      label = document.createElement('label');

      // do more stuff
    }
  };
}());

以上内容将在第一次单击时添加标签,然后在下一次单击时将其删除。但一次只对一个标签有效。这就是你想要的,还是你想添加很多元素?如果是这样,您可以将引用存储在数组中,然后在数组中迭代以删除它们。

您可以改进您的问题吗,我(可能还有其他人)真的不知道您希望我们做什么。存储是否在属性中单击了元素,例如
data clicked='true'
或其他未定义变量标签的内容,你必须事先申报。也许你可以多加一点代码,这样我们就能理解你的期望。嗨,谢谢你给出了这个伟大而清晰的答案,如果我想同时创建和删除一个包含不同内容的标签,我该怎么做?假设标签中的textNode由数组生成:['textNode1'、'textNode2'、'orLabel3'、…]。我希望当我单击时,它从“textNode1”更改为数组中的另一个?删除else块,但将代码保留在其中,然后该函数将首先删除以前的标签,然后追加一个新标签。在这种情况下,该函数应该被称为reaplaceAnswer或类似的函数,因为它就是这样做的。
var addAnswer = (function() {

  // Declare label here in "outer" execution context
  var label;

  return function (array_output) {

    // If label is truthy, assume references an element so remove it
    // and then remove reference so it's available for garbage collection
    if(label) {
      label.parentNode.removeChild(label);
      label = null;

    // If label was falsey, create a new one and keep a reference
    } else {

      // do stuff

      // don't declare label here so reference is kept using
      // the variable "label" in the outer scope
      label = document.createElement('label');

      // do more stuff
    }
  };
}());