删除输入字段的jQuery问题

时间:2019-01-03 12:51:38

标签: javascript jquery html

我试图在单击add时添加一个输入字段,并且在单击delete单击时应将其删除。

这是 JS Bin 链接: JS issue with deletion

var newTextBoxDiv;
var rowCount = 0;
var counter = 1;
var delCounter = 1;
$(document).ready(function() {
    $(document).on('focus', '.txtFocus', function() {
        $(this).next('.clearContent').hide()
    });
    $(document).on('focusout', '.txtFocus', function() {
        $('.clearContent').show()
    })
});
    
function addTags(obj) {
    var newTextBoxDiv = '<div class="col-md-4 TextBoxMainDiv"><div style=""><div class="input-group" id="" style="width: 40%;margin: 0;padding: 0;padding: 2px;float:left;width:80%;"><input type="text" name="textbox' + counter + '" id="textbox' + counter + '" value=""  class="txtFocus" required  placeholder="Add Tag"   autocomplete="false" style="width: 100%" ><span class="clearContent"><a href="#" onClick="deleteTag(this);"><i class="fas fa-times"></i></a></span> </div><div style="width: 15%;display: inline-block;text-align:right;"><span id="addMore" onClick="addTags(this);"><a href="#"><i class="fas fa-plus-square"></i></a></span></div></div></div>';
    $(obj).hide();
    $("#tagElement").append(newTextBoxDiv);
    $('.txtFocus').focus();
    counter++;
    if (counter == 1) {
        $(obj).show()
    }
}
    
function deleteTag(obj) {
    $(obj).closest('.TextBoxMainDiv').last().find('#addMore').show();
    $(obj).closest('.TextBoxMainDiv').last().find('#addMore').css('display', 'block');
    $(obj).closest('.TextBoxMainDiv').remove();
    counter--;
    if (counter == 1) {
        $('#addMore').show()
    }
}
<div class="row">
    <div id="tagElement">
        <div>&nbsp;</div>
        <div class="col-md-4 TextBoxMainDiv">
            <div style="">
                <div class="input-group" id="" style="width: 40%;margin: 0;padding: 0;padding: 2px;float:left;width:80%;">
                    <input type="text" class="txtFocus" required placeholder="Add Tag" id="textBox" autocomplete="false" autofocus="autofocus" style="width: 100%">
                    <span class="clearContent">
                        <a href="#" onClick="deleteTag(this);">Add</a>
                    </span>
                </div>
                <div style="width: 15%;display: inline-block;text-align:right;">
                    <span id="addMore" onClick="addTags(this);">
                        <a href="#">cancel</a>
                    </span>
                </div>
            </div>
        </div>
    </div>
 </div>
 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
 <script src="https://code.jquery.com/jquery-3.1.0.js"></script>

我设法正确添加了输入字段,但是在删除它们时遇到了问题。它们似乎被随机删除。

2 个答案:

答案 0 :(得分:1)

我认为添加和删除按钮是混用的,但是我不能花时间分析代码,因为对于很少做的事情来说,代码太多了。以下演示:

  • 有一个按钮,用于添加一行表单控件:
    • 复选框
    • 文本输入
    • 一个按钮,它删除自己的行以及自己的行。

演示

var index = 0;
var template = `
  <figure class='frame'><input class='status' type='checkbox'><label class='tag'></label><input class='text' type='text' placeholder='Enter New Task'><button class='del' type='button'>&#10134;</button></figure>`;

$('.set').on('click', 'button', function(e) {
  if ($(this).hasClass('add')) {
    index++;
    $('.set').prepend(template);
    $('.status:eq(0)').attr('id', 'chx' + index);
    $('.tag:eq(0)').attr('for', 'chx' + index);
  } else {
    $(this).prevUntil('.del, .add').add(this).remove();
  }
});
.set {
  position: relative;
  padding: 2px 0 1px 2px;
  min-height: 28px;
  border-radius:7px;
}

.frame {
  padding: 0;
  margin: 0;
  min-width:90vw;
  }
  
.add {
  position: absolute;
  right: 6px;
  top: 3px;
  display:block;
}

.status {
  display: none
}

.tag {
  display: inline-table;
  font-size: 28px;
  line-height: 1;
  vertical-align: middle
}

.tag::before {
  content: '\2610';
}

.status:checked+.tag::before {
  content: '\2611'
}

.text {
  display:inline-table;
  width: 75%;
  margin: 2px 5px 0
}
<form id='ui'>

  <fieldset class='set'>
  <figure class='frame'>
    <input id='chx0' class='status' type='checkbox'>
    <label for='chx0' class='tag'></label>
    <input class='text' type='text' placeholder='Enter New Task' style='margin:2.5px 2px 0 0' autofocus>
    <button class='del' type='button'>&#10134;</button>
    </figure>
    <button class='add' type='button'>&#10133;</button>
  </fieldset>

</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 1 :(得分:0)

我认为您的代码逻辑正常,但是未显示用于添加和删除输入的图标。

您可以将newTextBoxDiv替换为:

var newTextBoxDiv = `
    <div class="col-md-4 TextBoxMainDiv">
        <div style="">
            <div class="input-group" id="" style="width: 40%;margin: 0;padding: 0;padding: 2px; float:left; width:80%;">
                <input type="text" name="textbox${counter}" id="textbox${counter}" value="" class="txtFocus" required placeholder="Add Tag" autocomplete="false" style="width: 100%" >
                <span class="clearContent">
                    <a href="#" onClick="deleteTag(this);">Delete<i class="fas fa-times"></i></a>
                </span>
            </div>
        <div style="width: 15%;display: inline-block;text-align:right;">
            <span id="addMore" onClick="addTags(this);">
                <a href="#">Add</a>
            </span>
        </div>
    </div>`;

请注意,我在标签之间添加了“添加”和“删除”一词,以便您可以点击

此外,我认为您需要在初始HTML中交换“添加”和“取消”一词,以传达更清晰的消息,因为它们现在正在做相反的事情。

另一个需要解决的方法是将id="addMore"替换为class="addMore"

<span class="addMore" onClick="addTags(this);">

由于id是唯一的。但是,在代码中,当添加新元素时,添加了具有重复ID的新元素,从而使jquery的选择器没有选择所需的元素。

用类替换id之后,还需要更改deleteTag函数以选择最后一个“ addMore”跨度并显示它。

function deleteTag(obj) {
    $(obj).closest('.TextBoxMainDiv').last().find('.addMore').show();
    $(obj).closest('.TextBoxMainDiv').last().find('.addMore').css('display', 'block');
    $(obj).closest('.TextBoxMainDiv').remove();
    counter--;
    $('.addMore').last().show();
}

对于布局,您需要使用css进行处理,删除float并以适当的宽度和显示设置div标签:inline-block。我建议您使用单独的css文件来设置元素的样式,而不是内联。

function deleteTodo() {
    $(this).parent().remove();
}

function addTodo() {
    var inputTemplate =
        '<div class="todo-input-wrapper">' +
            '<input class="todo-input" type="text" placeholder="Add Tag" />' +
            '<button class="delete-button">Delete</button>' +
        '</div>';
    $('.todo-wrapper').append(inputTemplate);
    $('.delete-button').last().on('click', deleteTodo);
    $('.todo-input').last().focus();
}

$(document).ready(function () {
    $('.delete-button').on('click', deleteTodo);
    $('.add-button').on('click', addTodo);
});
.todo-wrapper {
    display: inline-block;
    width: max-content;
    font-size: 0;
}

.todo-input-wrapper {
    margin: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="todo-wrapper">
    <div class="todo-input-wrapper">
        <input class="todo-input" type="text" placeholder="Add Tag" />
        <button class="delete-button">Delete</button>
    </div>
</div>
<button class="add-button">Add</button>