2016-08-04 9 views
1

ASP.Net에서 간단한 Ajax GET을 수행하고 웹 페이지로 돌아 오는 데이터 (Json 배열)로 jQuery 기능을 구현했습니다.루프 내에서 jQuery 클릭 이벤트 추가 "자동"모든 이벤트 클릭

아래의 lopp로 만든 각 div에 클릭 이벤트를 바인딩하려고 시도하지만 실행시 모든 클릭 이벤트가 페이지로드시 동시에 발생합니다!

아이디어가 있으십니까?

function grabList() { 
    $('#temp').empty(); 

    $.ajax({ 
     url: '/Home/GoModel', 
     method: 'GET', 
     success: function (data) {    
      for (var i = 0; i < data.length; i++) { 
       $('#temp').append('<div class="host col-sm-3"> id=' + data[i].name + '>' + data[i].name + '</div>'); 

       if (data[i].hostConnected === true) { 
        $('#temp').append('<div class="host connected col-sm-3" id=' + data[i].name + '>' + data[i].name + '</div>'); 
        continue; 
       } 

       $('#' + data[i].name).on('click', connect(data[i].name)); // Problem occurs 
      } 
      $('#container').html($('#temp').html()); 
     } 
    }); 
} 
+0

정확히 무슨 일이 일어나는지 자세히 설명해 주시겠습니까? "모든 클릭 이벤트가 페이지로드시 동시에 발생합니다"라는 의미는 무엇입니까? 또한,'connect' 함수의 코드는 무엇입니까? –

+0

가능한 [자바 스크립트 악명 높은 루프 문제?] (http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue) –

답변

0

그것은 이벤트를 트리거하지 않습니다, 당신은 바인딩에 전화를하고있다 :

$('#' + data[i].name).data({name : data[i].name}); 
    $('#' + data[i].name).on('click', function(e){connect($(e.target).data().name);}); 
+0

가능한 복제본이 작동하지 않습니다. 이것은 일반적인 "Closure-In-Loop"실수입니다. 'i'는 클릭 이벤트의 순간으로 바뀔 것입니다. –

+0

아, 그래, 잘 알았다. 사과, 나는 주요 문제에 집중했다. 이 문제를 해결하려면 data [i] .name의 값을 작성된 요소의 데이터 속성에 쓰고 함수에서 해제하십시오. 이 대답을 반영하도록 수정했습니다 –

2

당신은 시도 할 수 있습니다 :

$('#' + data[i].name).on('click', connect(data[i].name)); 

당신은 이런 식으로 할 필요가

function grabList() { 
 
    $('#temp').empty(); 
 

 
    $.ajax({ 
 
    url: 'https://api.github.com/repositories?since=700', 
 
    method: 'GET', 
 
    success: function (data) { 
 
     for (var i = 0; i < data.length; i++) { 
 
     $('#temp').append('<div class="host col-sm-3" id=' + data[i].name + '>' + data[i].name + '</div>'); 
 

 
     if (data[i].hostConnected === true) { 
 
      $('#temp').append('<div class="host connected col-sm-3" id=' + data[i].name + '>' + data[i].name + '</div>'); 
 
      continue; 
 
     } 
 

 
     (function (ele) { 
 
      $('#' + ele).on('click', function (e) { 
 
      alert(ele); 
 
      }); 
 
     })(data[i].name); 
 
     } 
 
     $('#container').html($('#temp').html()); 
 
    } 
 
    }); 
 
} 
 

 
$(function() { 
 
    grabList(); 
 
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
 
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
 

 

 
<div id="temp"></div> 
 
<div id="container"></div>

+0

좋은 선생님! 매력을 발휘했다. – ma11achy

0

사실 나중에 이벤트가 발생했을 때 대신 클릭 이벤트에 바인딩 할 때 connect() 함수를 호출하고 있습니다.

데이터를 이벤트 처리기로 전달하려는 경우 .on() 호출의 추가 매개 변수를 사용해야합니다. 대신이 같은 것을 시도해보십시오.

$('#' + data[i].name).on('click', null, data[i].name, function (e) { 
    connect(e.data); 
});