2016-11-20 10 views
0

私は私の頭の周りを包むように見えない特定の問題があります。私はreddit APIを使用してデータを取得しています。jQueryはループ内に追加します

だから基本的に私は#triggerを使用して答えを見せたかった

$(function() { 

    console.log("is it loading") 

    axios.get('http://www.reddit.com/r/DrunkOrAKid/hot.json?sort=hot') 
    .then(function(data){ 
    var q; 
    for(var i = 2; i < data.data.data.children.length; i++){ 
     q = data.data.data.children[i]; 
     $('#main').append('<h4>' + q.data.title + '</h4><br><button class="btn btn-success trigger">answer</button><div class="answer">'+ q.data.selftext +'</div>') 


     $('.answer').hide() 


     $('.trigger').click(function(e){ 
     e.preventDefault() 
     console.log("clicked", [i]); 
     $('.answer').show() 
     }) 
    } 
    }).catch(function(error){ 
    console.log("error occured") 
    }) 
}) 

を更新しました。しかし、#triggerボタンをクリックすると問題が発生します。配列には26という実際のカウントではなく、27のカウントが表示されます。#triggerボタンをクリックすると何とか1カウントが追加されます。今すぐボタンをクリックして回答を表示することはできません。どんな助けも大いにありがとうございます

+2

なぜ[変数]で文字列に変数を追加していますか?これは不必要な配列を作成しています。また、実際に列挙されるIDを作る代わりに、これらのフィールドのクラスを使用することを検討する必要があります。次に、クラスを選択し、それらのクラスの 'eq(index)'を取得します。 – Taplar

+0

私はすでにクラスに変更しましたが、動作していないようです。私は本当に最初の質問であなたが何を意味していない。私はそれぞれのボタンと答えがお互いに異なっていることを望んでいたので、私のIDに[i]を追加しています。現在、私の配列の中に26のインデックスがあるので、26のボタンと答えがあります。たとえば、3番目のインデックスボタンをクリックすると、3番目の答えが表示されます。 – Irsyad14

+0

[]文字列の外側は配列です。通常、配列を文字列に連結しません。 idを 'name [#]'のパターンに従わせようとしていましたか?いずれにしても、クラスは必要ありません。あなたはあなたの質問を新しい論理で更新することができますか? – Taplar

答えて

0

これを試してみてください。ルックアップはしていません。要素を作成/使用しているときに要素を使用/バインドしています。より良いアプローチは、コンテキスト参照を使用して委譲されたリスナーを使用することです。

axios.get('http://www.reddit.com/r/DrunkOrAKid/hot.json?sort=hot') 
     .then(function(data) { 
      var $main = $('#main'); 

      //use slice so you can use forEach instead of rolling your own for loop 
      data.data.data.children.slice(2).forEach(function(child){ 
       //instead of looking up trigger, create it so you can do whatever you want with it 
       var $trigger = $('<button class="btn btn-success">answer</button>'); 
       //same with answer 
       var $answer = $('<div class="answer">'+ child.data.selftext +'</div>'); 

       $answer.hide(); 

       $trigger.on('click', function(e){ 
        e.preventDefault(); 
        $answer.show(); 
       }); 

       $main 
        .append('<h4>'+ child.data.title +'</h4><br>') 
        .append($trigger) 
        .append($answer); 
      }); 
     }).catch(function(error) { 
      console.log("error occured") 
     }); 
    }); 
+0

うん、うまくいきます。 forループ?2つの違いは何ですか?私のアプローチではなく、最後にappendを置くことの根拠は何ですか?また、ルックアップは何ですか?私は単に貼り付けをコピーするのではなく、ロジックを本当に理解しようとしています。 – Irsyad14

+0

forEachは、索引などを追跡する必要がないので、より洗練されています。両方とも同じロジックを実行しますが、forEachは定型化を大変します。しない問題。 appendはブラウザの再描画を行うため、hide()をappendの前に実行したいと思うかもしれませんが、hide/showも表示されます。ページに添付される前に非表示にすると、再描画は行われません。だから1 redraw vs 2。セレクタが文字列であり、関数/オブジェクトではないならば、$(selector)はルックアップです。 – Taplar

+0

今はすべてがクリアです。助けてくれてありがとう。 – Irsyad14

関連する問題