![見出し画像](https://assets.st-note.com/production/uploads/images/123669799/rectangle_large_type_2_b0709f2b507d13ed06ade74673da1807.png?width=1200)
[jQuery] Gmailの宛先みたいなテキスト入力を作りたい
Gmailって便利ですよね~。
ということで、Gmailの宛先入力と同じような
テキスト入力枠を作成してみました。
で、調べてみると全然情報がない!
ただ、テキストの上にラベルを表示したいだけなんです…
あとで調べてみると「select2.full.min.js」という
ライブラリを使うことでもっと簡単にできた。
もっと早く知りたかったけど、作ってしまったので載せておきます。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>ラベル表示</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<style>
.label {
display: inline-block;
background-color: #e0e0e0;
padding: 5px;
margin-right: 5px;
margin-bottom: 5px;
}
.label-close {
cursor: pointer;
font-weight: bold;
color: #555;
margin-left: 5px;
}
.label-container {
position: relative;
display: inline-block;
}
.label-list {
list-style-type: none;
padding: 10px;
border: 1px solid #ccc;
display: flex;
flex-wrap: wrap;
cursor: text;
margin-bottom: 0px;
}
.label-input {
margin-top: 10px;
flex: 1;
border: none;
outline: none;
background: none;
padding: 0;
}
.user-list {
max-height: 200px;
margin-top: 0px;
border: 1px solid #ccc;
border-top: none;
display: none;
overflow-y: scroll;
}
.user-list.visible {
display: block;
}
.user-list .label {
display: block;
margin-left: -40px;
background: none;
cursor: pointer;
}
.user-list .label:hover {
background-color: #eee;
}
</style>
</head>
<body>
<h1>ラベル表示</h1>
<div class="label-container">
<ul id="labelList" class="label-list">
<li><input type="text" id="txt-label" class="label-input"></li>
</ul>
<ul id="labelPopup" class="user-list"></ul>
</div>
<script>
$(function() {
// ulタグにフォーカスを当てる
$("#labelList").on("click", function() {
$("#txt-label").focus();
});
// ドキュメント全体でクリックイベントを監視
$(document).on("click", function(event) {
var target = event.target;
if (!target.closest("#labelList")) {
hideLabelPopup();
}
});
});
var labelList = document.getElementById("labelList");
var input = labelList.getElementsByClassName("label-input")[0];
var labelPopup = document.getElementById("labelPopup");
var pList = [
"John Doe", "Jane Smith", "Michael Johnson", "a", "b", "c", "d", "e", "f", "g",
// ... ここに残りのラベルデータを追加する ...
];
input.addEventListener("focus", function() {
showLabelPopup();
});
input.addEventListener("keydown", function(event) {
if (event.keyCode === 13) { // Enterキーが押された場合
event.preventDefault();
var recipient = input.value.trim();
if (recipient !== "") {
createLabel(recipient);
input.value = "";
}
}
});
function showLabelPopup() {
labelPopup.innerHTML = "";
for (var i = 0; i < pList.length; i++) {
var label = document.createElement("li");
label.className = "label";
label.id = "label" + i;
label.textContent = pList[i];
label.addEventListener("click", function() {
createLabel(this.textContent);
hideLabelPopup();
});
labelPopup.appendChild(label);
}
labelPopup.classList.add("visible");
}
function hideLabelPopup() {
input.value = "";
labelPopup.classList.remove("visible");
}
function createLabel(recipient) {
var label = document.createElement("div");
label.className = "label";
label.textContent = recipient;
var closeButton = document.createElement("span");
closeButton.className = "label-close";
closeButton.textContent = "×";
closeButton.addEventListener("click", function() {
label.remove();
});
label.appendChild(closeButton);
labelList.insertBefore(label, input.parentElement);
}
</script>
</body>
</html>