在项目列表上绑定点击事件,该框会一直消失。知道为什么click事件不能在item-list>上工作DIV。
想法是获取正在点击的文本(来自项目列表)并将其放在输入字段中?
$json =
Array
(
[1] => b
[1] => c
[1] => d
)

(function() {
$(".input-msg").focus(function() {
$(".item-list").css('display', 'block');
$(".item-list div").click(function() {
var inputValue = $('.input-msg');
var data = $(this).text();
inputValue.val(data);
});
}).blur(function() {
$(".item-list").css('display', 'none');
});
})();

.input-wrapper {
width: 300px;
}
.item-list {
display: none;
}

答案 0 :(得分:3)
我想我遇到了你的问题: -
1.删除blur
代码。 (因为当从输入框中聚焦时它会立即隐藏div)
2.在click
之外放置focus
。 (只注册听众一次就足够了)
3.Inside click
执行hide
代码。 (如果你想在点击它的文本div之后隐藏div)
工作代码段: -
(function() {
$(".input-msg").focus(function() {
$(".item-list").css('display', 'block');
});
$(".item-list div").click(function() {
var inputValue = $('.input-msg');
var data = $(this).text();
inputValue.val(data);
$('.item-list').hide();
});
})();
$(document).mouseup(function(e) {
if (!$(e.target).is('.item-list') && !$(e.target).is('.input-msg')) {
$('.item-list').hide(1000);
}
});
.input-wrapper {
width: 300px;
}
.item-list {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="input-wrapper">
<input type="text" class="input-msg" placeholder="click me">
<!-- input msg -->
<div class="item-list">
<div>This is item one</div>
<div>This is item Two</div>
<div>This is item Three</div>
<div>This is item Four</div>
</div>
</div><br>
答案 1 :(得分:1)
项目列表消失,因为在输入框触发的blur
事件中,列表被清除。我已经注释掉了隐藏列表的代码,并将其移动到项目列表click
上。
我还从click
处理程序中移动了列表blur
处理程序。这样可以防止点击处理程序一次又一次地挂载。
(function() {
$(".input-msg").focus(function() {
$(".item-list").css('display', 'block');
}).blur(function() {
// THIS IS YOUR ISSUE.
// We're going to move this line down to the
// `item-list` click handler.
// $(".item-list").css('display', 'none');
});
// You want to register this listener once,
// not every time user focuses on input box.
$(".item-list div").click(function() {
var inputValue = $('.input-msg');
var data = $(this).text();
inputValue.val(data);
});
$('.main-wrapper').children().not('.input-wrapper').click(function(){
// Hide the item list on body click.
// This was moved here from the `blur` handler above.
$(".item-list").css('display', 'none');
});
})();
.main-wrapper {
float: left;
width: 600px;
}
.other-wrapper {
float: left;
width: 300px;
}
.input-wrapper {
float: left;
width: 300px;
}
.item-list {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main-wrapper">
<div class="input-wrapper">
<input type="text" class="input-msg" placeholder="click me">
<!-- input msg -->
<div class="item-list">
<div>This is item one</div>
<div>This is item one</div>
<div>This is item one</div>
<div>This is item one</div>
</div>
</div>
<div class="other-wrapper">Other stuff.</div>
<div>
答案 2 :(得分:1)
看看这个。
(function() {
$(".item-list div").click(function() {
var inputValue = $('.input-msg');
var data = $(this).text();
inputValue.val(data);
$('.item-list').fadeOut('fast');
});
$(".input-msg").focus(function() {
$(".item-list").fadeIn('fast');
})
$(document).mouseup(function(e) {
if (!$(e.target).is('.item-list') && !$(e.target).is('.input-msg')) {
$('.item-list').fadeOut('fast');
}
});
})();
&#13;
.input-wrapper {
width: 300px;
}
.item-list {
display: none;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="input-wrapper">
<input type="text" class="input-msg" placeholder="click me">
<!-- input msg -->
<div class="item-list">
<div>This is item one</div>
<div>This is item two</div>
<div>This is item three</div>
<div>This is item four</div>
</div>
</div>
&#13;
答案 3 :(得分:0)
const input = $("input")
const itemList = $(".item-list")
const items = $(".item-list > div")
const overlay = $(".overlay")
addClickTo(input, () => display(itemList, overlay))
addClickTo(items, (e) => {
const itemText = e.currentTarget.textContent
setValueOf(input, itemText)
dontDisplay(itemList, overlay)
})
addClickTo(overlay, () => dontDisplay(itemList, overlay))
// helpers
function dontDisplay(...elements) { elements.forEach((element) => element.style.display = "none") }
function display(...elements) { elements.forEach((element) => element.style.display = "block") }
function $(selector) {
const matchedElements = document.querySelectorAll(selector)
return matchedElements && matchedElements.length > 1
? matchedElements
: matchedElements[0]
}
function addClickTo(elements, handler) {
elements.forEach || (elements = [elements])
elements.forEach((element) => element.addEventListener("click", handler))
}
function setValueOf(input, text) {
input.value = text
}
const input = $("input")
const itemList = $(".item-list")
const items = $(".item-list > div")
const overlay = $(".overlay")
addClickTo(input, () => display(itemList, overlay))
addClickTo(items, (e) => {
const itemText = e.currentTarget.textContent
setValueOf(input, itemText)
dontDisplay(itemList, overlay)
})
addClickTo(overlay, () => dontDisplay(itemList, overlay))
// helpers
function dontDisplay(...elements) { elements.forEach((element) => element.style.display = "none") }
function display(...elements) { elements.forEach((element) => element.style.display = "block") }
function $(selector) {
const matchedElements = document.querySelectorAll(selector)
return matchedElements && matchedElements.length > 1
? matchedElements
: matchedElements[0]
}
function addClickTo(elements, handler) {
elements.forEach || (elements = [elements])
elements.forEach((element) => element.addEventListener("click", handler))
}
function setValueOf(input, text) {
input.value = text
}
&#13;
.item-list {
display: none;
position: relative;
cursor: pointer;
}
input {
position: relative;
}
.overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
&#13;
<div class="input-wrapper">
<div class="overlay"></div>
<input type="text" class="input-msg" placeholder="click me">
<!-- input msg -->
<div class="item-list">
<div>This is item one</div>
<div>This is item two</div>
<div>This is item three</div>
<div>This is item four</div>
</div>
</div>
&#13;