2017-01-23 5 views
3

私はボタンの列を持っています。ユーザーがボタンをクリックすると、メッセージを表示して数秒後に非表示にします。D3で.each()が動作しないのはなぜですか?

    Jsfiddle

    は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つの問題を持っています

  1. 「追加」ボタンをクリックすると、クリックされたボタンの横に表示されるのではなく、すべてのメッセージが表示されます。 .eachを使った方法に何か問題がありますか?

  2. メッセージをある程度の時間をかけて隠すことはできません。私はdelayfadeOutを使ってみましたが、それは関数全体を破壊しました。

大変助かりました。

スニペット

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>

+0

質問1:問題は '.each()'ではなく '.selectAll()'です。 ( '.select(this)')を選択してください。( '' selectAll( "。message") ') '.message'要素(' .select( "。message") ')を見つけてください。 – Andreas

+0

@Andreasありがとう、それは意味があります。同時にすべてのメッセージが表示されなくなりますが、どのボタンがクリックされても---> https://jsfiddle.net/sol_b/sub9kw8d/1/ - 何が間違っているのか分かりません – sol

+1

'.each()'は必要ありません。 select(this)) 'select(this)).select("。message ")' - https:// jsfiddleの子要素である '.message'要素を取得する必要があります。 .net/sub9kw8d/3/ – Andreas

答えて

2
ここ

私はそれをコーディングする方法をです:

d3.selectAll(".add") 
    .on("click", function() { 
     var m = d3.select(this.children[0]); 
     m.text("added") 
     .style("opacity", 1); 
     m.transition() 
     .delay(500) 
     .duration(1000) 
     .style("opacity", 0); 
    }); 

実行:

d3.selectAll(".add") 
 
    .on("click", function() { 
 
    var m = d3.select(this.children[0]); 
 
    m.text("added") 
 
     .style("opacity", 1); 
 
    m.transition() 
 
     .delay(500) 
 
     .duration(1000) 
 
     .style("opacity", 0); 
 
    })
.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: white; 
 
    color: black; 
 
    font-size: 12px; 
 
    padding: 8px 16px; 
 
    opacity: 0; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.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>

関連する問題