У меня есть столбец кнопок. Когда пользователь нажимает кнопку, я хочу показать сообщение и скрыть его через несколько секунд.Почему .each() не работает в D3?
HTML
<div class="wrapper">
<div class="add">
Add
<span class="message"></span>
</div>
<div class="add">
Add
<span class="message"></span>
</div>
</div
D3
d3.select(".add")
.on("click", function() {
d3.selectAll(".message")
.each(function() {
d3.select(this)
.transition()
.duration(500)
.style("opacity", 1)
.text("added");
})
})
У меня 2 вопроса:
Когда нажата кнопка «Добавить», отображаются все сообщения, а не кнопки рядом с нажатой кнопкой. Что-то не так с тем, как я использовал
.each
?Я не могу скрыть сообщение после некоторой продолжительности. Я пробовал использовать
delay
иfadeOut
, но он сломал всю функцию.
Любая помощь очень ценится.
Отрывок
d3.selectAll(".add")
.on("click", function() {
d3.selectAll(".message")
.each(function() {
d3.select(this)
.transition()
.duration(500)
.style("opacity", 1)
.text("added");
})
})
.wrapper {
display: inline-block;
margin: 50px;
width: 200px;
}
.wrapper div {
padding: 16px 32px;
background-color: grey;
color: #FFF;
font-family: sans-serif;
cursor: pointer;
text-align: center;
margin-bottom: 5px;
position: relative;
}
.wrapper span {
position: absolute;
right: -60px;
bottom: 10px;
background-color: lightblue;
color: black;
font-size: 12px;
padding: 8px 16px;
opacity: 0;
}
<script src="https://d3js.org/d3.v3.min.js"></script>
<div class="wrapper">
<div class="add">
Add
<span class="message"></span>
</div>
<div class="add">
Add
<span class="message"></span>
</div>
<div class="add">
Add
<span class="message"></span>
</div>
<div class="add">
Add
<span class="message"></span>
</div>
<div class="add">
Add
<span class="message"></span>
</div>
</div>
К вопросу 1: проблема не '.each()' ', но .selectAll()'. «Получить все элементы с помощью класса' message' (= 'selectAll (". Message ")') и показать их один за другим ('.each()'). Вместо этого выберите элемент clicked ('.select (this)') и затем найдите элемент '.message' (' .select (". message") ') – Andreas
@Andreas Спасибо, это имеет смысл. Он останавливает отображение всех сообщений одновременно, но покажет только первое сообщение, независимо от того, какая кнопка нажата ---> https://jsfiddle.net/sol_b/sub9kw8d/1/ - Я не уверен, что пошло не так – sol
Вам не нужен '.each()'. '. select (this) 'возвращает только один элемент. И вы должны получить элемент' .message', который является дочерним элементом 'this' ->' select (this) .select (". message") '- https: // jsfiddle .net/sub9kw8d/3/ – Andreas