2016-11-20 95 views
0

我有一个特别的问题,我似乎不包裹我的头。我正在使用reddit api来获取数据。jQuery附加循环内

修订

$(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显示答案。但问题在于,当我点击#trigger按钮时,数组显示了27个计数而不是实际的计数,它是26.当点击#trigger按钮时,它不知何故地添加了一个计数。现在我无法点击按钮来显示答案。任何帮助将不胜感激

+2

为什么要用'[variable]'将字符串附加到字符串?这是创建一个不必要的数组。你也应该考虑对这些字段使用类,而不是使用枚举的id。然后你可以选择这个类并获得它们的'eq(index)'来处理。 – Taplar

+0

我已经更改为类,它似乎不工作。我不确定你在第一个问题中的含义。我将[i]添加到我的ID中,因为我希望每个按钮和答案都有不同的ID。目前在我的数组中有26个索引,所以有26个按钮和答案。当我点击例如第三个索引按钮时,它应该只显示第三个答案。 – 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

是的,它的工作。谢谢。你能澄清为什么我需要使用forEach而不是for循环?两者之间有什么区别?另一个是将append放在最后而不是我的方法的基本原理是什么?什么是查找?我试图真正理解逻辑,而不是复制粘贴。 – Irsyad14

+0

forEach有点清洁,因为你不必跟踪索引等等,它们都遵循相同的逻辑,但是forEach做了很多的插件。不此事。虽然你可能想在append之前执行hide(),因为append将会执行浏览器重绘,所以会隐藏/显示。如果在连接到页面之前隐藏,则不会重绘。所以1重画vs 2. $(选择器)是一个查找,只要选择器是一个字符串而不是函数/对象。 – Taplar

+0

现在一切都很清楚。谢谢您的帮助。 – Irsyad14