2016-07-05 3 views
-1

return false이 아래의 $.each 루프를 종료하지 않는 이유는 무엇입니까?

var Items = { 
    "5340071": { 
     "alt": "Sample text" 
    }, 
    "5333539": { 
     "alt": "Sample text" 
    }, 
    // Etc. 
}; 

var viewportBottom = $(window).height() + $(window).scrollTop(); 
$.each(Items, function(itemId, objItem) {  
    $("<img src='/img/1503/4/" + itemId + ".jpg?h=150'>").on('load', function() { 
     $(document.body).append($(this)); 
     var imageTop = $(this).offset().top; 
     if (imageTop > viewportBottom) { 
      console.log('Exit loop'); // Text is printed in console 
      return false;    // This should break the $.each loop, but it doesn't 
     } 
    }); 
}); 

알려 주시기 바랍니다.

+0

@ T.J.Crowder 'for'에서 작동합니다. '$ .each'에서 작동한다고 가정했습니다. :) – guradio

+2

@guradio : 완전히 다른 것들입니다. –

답변

0

코드에서 $.each에 대한 콜백에서 return false이 없습니다. on으로 연결된 이벤트 처리기에는 return false이 있습니다.

일반적으로 중첩 콜백을 사용하여 외부 루프에 영향을 주려는 경우 플래그를 설정하고 외부 루프에서이를 확인할 수 있습니다. 핸들러가 호출 될 때까지 $.each 루프가 오랫동안 완료되었으므로 여기서는 불가능합니다.

뷰포트를 채울 때까지 이미지를 추가하는 것이 목표 인 경우 $.each을 사용할 수 없습니다. 이미지가로드 될 때까지 멈출 때를 알지 못하기 때문에 비동기로 발생합니다. 좋습니다. 이전 위치가 완료되면 다음 위치 로딩을 트리거 할 수 있습니다.

var Items = { 
    "5340071": { 
     "alt": "Sample text" 
    }, 
    "5333539": { 
     "alt": "Sample text" 
    }, 
    // Etc. 
}; 

var viewportBottom = $(window).height() + $(window).scrollTop(); 
var index = 0; 
var itemIds = Object.keys(Items); 
loadNextImage(); 
function loadNextImage() { 
    // Get this item ID 
    var itemId = itemIds[index++]; 

    // Get the alt text for it 
    var alt = Items[itemId].alt; 

    // Create the image WITHOUT a src 
    var img = $("<img>"); 

    // Apply the alt text 
    if (alt) { 
     img.attr("alt", alt); 
    } 

    // Hook the load handler BEFORE we set src 
    img.one('load', function() { 
     // Append the image to the body 
     img.appendTo(document.body); 

     // Do we have more? 
     if (index < Items.length) { 
      // Do we have room for more? 
      var imageTop = img.offset().top; 
      if (imageTop <= viewportBottom) { 
       // Yes, load the next one 
       loadNextImage(); 
      } 
     } 
    }); 

    // Now set the src 
    img.attr("src", "/img/1503/4/" + itemId + ".jpg?h=150"); 
} 

또한 이전 코드는 이미지가 캐시에 있다면 돌발 할 수있는 경쟁 조건을 가지고, 약 src 위의 비트를 확인합니다.

그리고 alt 텍스트를 사용하지 않으므로 위에 추가했습니다.

+0

하지만 작동하도록 코드를 다시 작성하는 방법은 무엇입니까? 이미 플래그를 시도했지만 그 중 하나가 작동하지 않습니다. – Martin

+0

@Martin : 내가 할 수있는 한, 당신이하려고하는 것은 불가능하기 때문에 어떻게 작동시키는 지 당신에게 말할 수는 없습니다. 앞으로 이벤트 (이미지로드 콜백)를 만들려고하면 현재의 루프에 영향을 미칩니다. 이 코드의 실제 목표는 무엇입니까? 적합 할만큼 이미지를 추가하려면? –

+0

@Martin : 그렇다면 적절한 방법으로 업데이트해야하는 업데이트를 게시했습니다. –