Jquery,在不同的 div 中执行相同操作的按钮

Jquery, buttons that do the same thing in different divs

我正在创建问卷创建器。我的问题是我就是想不出为不同的 div 实现类似代码的方法。对于第一个问题,一切正常。添加答案按钮添加了一个答案,但只要我添加一个新问题,类似按钮就会停止工作。在评论中,您会看到我尝试过的内容。

感谢帮助

 $(document).ready(function(){    
    var quest=2;
    var counter=2;    
      
    $("#addButton").click(function () {        
      if(counter>10){
        alert("Only 10 answers allowed");
        return false;
      }   

      var newTextBoxDiv = $(document.createElement('div')).attr("id", 'TextBoxDiv' + counter);

      newTextBoxDiv.after().html('<label>Answer #'+ counter + ' : </label>' +
            '<input type="text" name="textbox' + counter + 
            '" id="textbox' + counter + '" value="" >'
            );   
      newTextBoxDiv.appendTo("#TextBoxesGroup");
      $("html, body").animate({ scrollTop: $(document).height() }, "slow");
      counter++;
    });
    
    $("#removeButton").click(function () {
     if(counter==2){
          alert("You have to have at least one possible answer available");
          return false;
       }         
     counter--;       
      $("#TextBoxDiv" + counter).remove();       
    });        
    
    $("#btn1").click(function () {        
     var newTextBoxDiv = $(document.createElement('div')).attr("id", 'TextBoxDiv' + quest);
     newTextBoxDiv.after().html(
      '<br><label>Question #'+ quest + '</label>' +
           '<input type="text" name="quest' + quest + 
           '" id="quest' + quest + '" value="" placeholder="Insert the question">'+
           
           '<label>Description</label>'+
           '<textarea id="descr+"'+quest+' name="descr"'+quest+' "value="" placeholder="Insert clarifications if needed"></textarea> '+
    
           '<br><label>Select type of question</label>'+
           '<label><input type="radio" name="type'+quest+' " id="a'+quest+'" value="checkbox'+quest+'" <label for="a+'+quest+'"> Multiple choice</label> </label>'
           +'<label><input type="radio" name="type'+quest+' " id="b'+quest+'" value="radio'+quest+'" '+
           '<label for="b+'+quest+'"> One choice </label></label>'+
           '<label> <input type="radio" name="type'+quest+' " id="c'+quest+'" value="text'+quest+'" '+
           '<label for="c+'+quest+'"> Text</label></label>'+
    
           '<div id="TextBoxesGroup'+quest+'"> <div id="TextBoxDiv'+quest+'"> <label>Answer #1 : </label><input type="textbox" id="textbox'+quest+' " </div> </div><input type="button"  value="Add Answer'+quest+' " id="addButton'+quest+'" class="test"> <input type="button" value="Remove Answer'+quest+' " id="removeButton'+quest+' ">'      
    
      );
                
     newTextBoxDiv.appendTo("#question");
      $("html, body").animate({ scrollTop: $(document).height() }, "slow");
     quest++;
    });
    
    $("input[type='radio']#c").click(function(){
        $("#addButton").prop('disabled',true);
        for (var i =counter; i >= 2; i--) {
          $("#TextBoxDiv"+i).remove();
        }     
    });
    
    $("input[type='radio']#a").click(function(){
       $("#addButton").prop('disabled',false);
      });
        
    $("input[type='radio']#b").click(function(){
       $("#addButton").prop('disabled',false);
      });
    });
    
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mom">
  <div class="header">
    <h2>Questionnaire Creator</h2>
  </div>

  <div class="nav">
    <p> Insert the questionnaire name here</p>
    <textarea id="info" name="info"></textarea>
  </div>

  <div id="question">
      <label for="name">Question #1<br></label><input type ="text" id="quest1" name="quest" placeholder="Insert the Question">
      <label for="descr">Description<br></label><textarea id="subject" name="subject" placeholder="Insert clarifications if needed"></textarea><br>
      <label for="type">Select type of the question<br></label>
      <input type="radio" name="type" value="checkbox" id="a"> 
      <label for="a">Multiple choice</label><br>
      <input type="radio" name="type" value="radio" id="b"> 
      <label for="b">One choice</label><br>
      <input type="radio" name="type" value="text" id="c"> 
      <label for="c">Text</label><br>

    <div id='TextBoxesGroup'>
      <div id="TextBoxDiv1">
        <label>Answer #1 : </label><input type='textbox' id='textbox1' >
      </div>
    </div>
  <br>
  <br>
  <input type='button' value='Add Answer' id='addButton' class="test">
  <input type='button' value='Remove Answer' id='removeButton' class="test">
  <br>
</div>
<button id="btn1">Add new question</button>
<button id="btn3" type="submit">submit</button>

您似乎正在初始化所有关于文档加载的操作。这是正确的方法,但不幸的是,这意味着任何新按钮都不会收到正确的操作。我建议将附加到#addButton 的函数放入一个函数中。然后您可以在创建时向新按钮添加一个 onclick 属性

function addButton() {}
$("#addButton").click(addbutton())
<input type="button" value="Add Answer3 " id="addButton3" class="test" onclick="addButton()">

最后,您的整体结构似乎需要一些更新。例如,您应该使用某种类型的分组来将您的新问题和答案分开,因为您是在动态创建它们。例如 id 就像 "q1-addButton3"。您还可以使用 jquery 模板让您的生活更轻松:

http://stephenwalther.com/archive/2010/11/30/an-introduction-to-jquery-templates

看来您一定遇到了 duplicate id 问题。所以我通过 .on 方法创建了这些事件,该方法适用于 lazy 加载的 dom 元素。我已经在你的元素中添加了分类。仍然存在计数器问题,您使用的是全局计数器变量,该变量根据您当前的计数器值生成 answer #,这应该是问题明智的答案计数。

$(document).ready(function() {
  var quest = 2;
  var counter = 2;

  $(document).on("click", ".addButton", function() {
    let btn = $(this).attr('data-attr');
    if (counter > 10) {
      alert("Only 10 answers allowed");
      return false;
    }

    var newTextBoxDiv = $(document.createElement('div')).attr("id", 'TextBoxDiv' + counter);

    newTextBoxDiv.html('<label class="label' + btn + counter + '">Answer #' + counter + ' : </label>' +
      '<input type="text" name="textbox' + counter +
      '" id="textbox' + counter + '" value="" >'
    );
    newTextBoxDiv.appendTo("#TextBoxesGroup"+btn);
    $("html, body").animate({
      scrollTop: $(document).height()
    }, "slow");
    counter++;
  });

  $("#removeButton").click(function() {
    if (counter == 2) {
      alert("You have to have at least one possible answer available");
      return false;
    }
    counter--;
    $("#TextBoxDiv" + counter).remove();
  });

  $("#btn1").click(function() {
    var newTextBoxDiv = $(document.createElement('div')).attr("id", 'TextBoxDiv' + quest);
    newTextBoxDiv.after().html(
      '<br><label>Question #' + quest + '</label>' +
      '<input type="text" name="quest' + quest +
      '" id="quest' + quest + '" value="" placeholder="Insert the question">' +

      '<label>Description</label>' +
      '<textarea id="descr+"' + quest + ' name="descr"' + quest + ' "value="" placeholder="Insert clarifications if needed"></textarea> ' +

      '<br><label>Select type of question</label>' +
      '<label><input type="radio" name="type' + quest + ' " id="a' + quest + '" value="checkbox' + quest + '" <label for="a+' + quest + '"> Multiple choice</label> </label>' +
      '<label><input type="radio" name="type' + quest + ' " id="b' + quest + '" value="radio' + quest + '" ' +
      '<label for="b+' + quest + '"> One choice </label></label>' +
      '<label> <input type="radio" name="type' + quest + ' " id="c' + quest + '" value="text' + quest + '" ' +
      '<label for="c+' + quest + '"> Text</label></label>' +

      '<div id="TextBoxesGroup' + quest + '"> <div id="TextBoxDiv' + quest + '"> <label class="label' + quest + ' ">Answer #1 : </label><input type="textbox" id="textbox' + quest + ' " </div></div><br><br><input type="button"  value="Add Answer' + quest + ' " id="addButton' + quest + '" data-attr="' + quest + '" class="test addButton"> <input type="button" value="Remove Answer' + quest + ' " id="removeButton' + quest + ' ">'

    );

    newTextBoxDiv.appendTo("#question");
    $("html, body").animate({
      scrollTop: $(document).height()
    }, "slow");
    quest++;
  });

  $("input[type='radio']#c").click(function() {
    $("#addButton").prop('disabled', true);
    for (var i = counter; i >= 2; i--) {
      $("#TextBoxDiv" + i).remove();
    }
  });

  $("input[type='radio']#a").click(function() {
    $("#addButton").prop('disabled', false);
  });

  $("input[type='radio']#b").click(function() {
    $("#addButton").prop('disabled', false);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mom">
  <div class="header">
    <h2>Questionnaire Creator</h2>
  </div>

  <div class="nav">
    <p> Insert the questionnaire name here</p>
    <textarea id="info" name="info"></textarea>
  </div>

  <div id="question">
    <label for="name">Question #1<br></label><input type="text" id="quest1" name="quest" placeholder="Insert the Question">
    <label for="descr">Description<br></label><textarea id="subject" name="subject" placeholder="Insert clarifications if needed"></textarea><br>
    <label for="type">Select type of the question<br></label>
    <input type="radio" name="type" value="checkbox" id="a">
    <label for="a">Multiple choice</label><br>
    <input type="radio" name="type" value="radio" id="b">
    <label for="b">One choice</label><br>
    <input type="radio" name="type" value="text" id="c">
    <label for="c">Text</label><br>

    <div id='TextBoxesGroup1'>
      <div id="TextBoxDiv1">
        <label>Answer #1 : </label class="label1"><input type='textbox' id='textbox1'>
      </div>
    </div>
    <br>
    <br>
    <input type='button' value='Add Answer' data-attr="1" id='addButton' class="test addButton">
    <input type='button' value='Remove Answer' id='removeButton' class="test">
    <br>
  </div>
  <button id="btn1">Add new question</button>
  <button id="btn3" type="submit">submit</button>