当前位置:首页 > 科技 > 正文

如何在JavaScript / HTML / CSS中处理跨度关键字框

提问开始:

我试图建立一个可变数量的关键字框(关键字框的数量是由php处理的)。为了更好地理解,我做了三个硬编码的html关键字框。最终的结果应该是多个关键字框,可以处理多个关键字,并在每次输入后显示它们在一个单独的内框。如果我点击这个按钮,所有的关键字都会被提醒。

我现在的尝试就快成功了。您可以键入关键字,然后按enter键保存它们。但是内部的关键字框只有在再次点击关键字框之后才会显示。

如果有人能帮我解决这个问题,我将不胜感激。:)

let tags = [];

let tagContainer = document.querySelectorAll('.tag-container');
tagContainer.forEach(function(foo) {
  foo.addEventListener('click', (e) => {
    //console.log(e.target.tagName);

    //if (e.target.tagName === 'I') {
    var tagLabel = e.target.getAttribute('data-item');
    var index = tags.indexOf(tagLabel);
    tags = [...tags.slice(0, index), ...tags.slice(index + 1)];
    foo.querySelectorAll('.tag').forEach(tag => {
      tag.parentElement.removeChild(tag);
    });
    tags.slice().reverse().forEach(tag => {
      var div = document.createElement('div');
      div.setAttribute('class', 'tag');
      var span = document.createElement('span');
      span.innerHTML = tag;
      var closeIcon = document.createElement('i');
      closeIcon.innerHTML = 'close';
      closeIcon.setAttribute('class', 'material-icons');
      closeIcon.setAttribute('data-item', tag);
      div.appendChild(span);
      div.appendChild(closeIcon);
      foo.prepend(div);
    });
    //}
  })
});

let input = document.querySelectorAll('.tag-container input');
input.forEach(function(bar) {
  bar.addEventListener('keyup', (e) => {
    if (e.key === 'Enter') {
      e.target.value.split(',').forEach(tag => {
        tags.push(tag);
      });
      bar.querySelectorAll('.tag').forEach(tag => {
        tag.parentElement.removeChild(tag);
      });
      tags.slice().reverse().forEach(tag => {
        var div = document.createElement('div');
        div.setAttribute('class', 'tag');
        var span = document.createElement('span');
        span.innerHTML = tag;
        var closeIcon = document.createElement('i');
        closeIcon.innerHTML = 'close';
        closeIcon.setAttribute('class', 'material-icons');
        closeIcon.setAttribute('data-item', tag);
        div.appendChild(span);
        div.appendChild(closeIcon);
        bar.prepend(div);
      });
      bar.value = '';
    }
    bar.focus();
  })

});

function clicked() {
  alert(JSON.stringify(tags));
}
.container {
  width: 20%;
  margin: 40px;
  align-self: center;
}

.tag-container {
  border: 2px solid #ccc;
  padding: 10px;
  border-radius: 5px;
  display: flex;
}

.tag-container .tag {
  padding: 5px;
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  margin: 5px;
  border-radius: 3px;
  background: #f2f2f2;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 1px 1px #fff;
  cursor: default;
}

.tag i {
  font-size: 16px;
  margin-left: 5px;
}

.tag-container input {
  flex: 1;
  font-size: 16px;
  padding: 5px;
  outline: none;
  border: 0;
}


close
close
close

回复

回答开始:得票数 1

const tagContainerNodes = document.querySelectorAll(".tag-container");
tagContainerNodes.forEach((tagContainerNode) => {
  const input = tagContainerNode.querySelector("input");
  input.addEventListener("keyup", e => {
    if (e.key === "Enter") {
      createTag(e.target.value, tagContainerNode, input);
      e.target.value = "";
    }
  });
});

function createTag(tagName, parent, before) {
  var div = document.createElement("div");
  div.setAttribute("class", "tag");
  var span = document.createElement("span");
  span.innerHTML = tagName;
  div.appendChild(span);
  parent.insertBefore(div, before)
}

function clicked() {
  const allTagText = [];
  tagContainerNodes.forEach((tagContainerNode) => {
    const tagNodes = tagContainerNode.querySelectorAll(".tag");
    tagNodes.forEach((tagNode) => {
      allTagText.push(tagNode.textContent);
    });
  });
  console.log(allTagText);
}
.tag-container {
  border: 2px solid #ccc;
  padding: 10px;
  border-radius: 5px;
  display: flex;
}

.tag-container .tag {
  padding: 5px;
  border: 1px solid #ccc;
  margin: 5px;
  border-radius: 3px;
  background: #f2f2f2;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 1px 1px #fff;
}

.tag-container input {
  font-size: 16px;
  padding: 5px;
  outline: none;
  border: 0;
}

总结

以上是真正的电脑专家为你收集整理的如何在JavaScript / HTML / CSS中处理跨度关键字框的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。

你可能想看:

有话要说...

取消
扫码支持 支付码