2010-11-17 54 views
11

Tôi có một danh sách nếu div có chứa hình ảnh. Tôi cần phải hiển thị ngẫu nhiên 4 trong số này mỗi khi trang tải. Đây là mã tôi bắt đầu.Hiển thị số ngẫu nhiên bằng cách sử dụng Jquery

<div class="Image"><img src="/image1.jpg"></div> 
<div class="Image"><img src="/image2.jpg"></div> 
<div class="Image"><img src="/image3.jpg"></div> 
<div class="Image"><img src="/image4.jpg"></div> 
<div class="Image"><img src="/image5.jpg"></div> 
<div class="Image"><img src="/image6.jpg"></div> 
<div class="Image"><img src="/image7.jpg"></div> 

Tất cả những điều này sẽ bắt đầu hiển thị: không, tôi muốn lấy 4 trong số các div một cách ngẫu nhiên và đặt chúng hiển thị: chặn. Tôi giả sử tôi cần phải sử dụng "Math.random()" trong đó một nơi nào đó nhưng không chắc chắn làm thế nào JQuery thực hiện điều này. Bất kỳ con trỏ sẽ được đánh giá cao.

Trả lời

16

tôi thấy họ sắp xếp một cách ngẫu nhiên sau đó cho thấy 4 đầu tiên là đơn giản nhất, như thế này:

var divs = $("div.Image").get().sort(function(){ 
      return Math.round(Math.random())-0.5; //so we get the right +/- combo 
      }).slice(0,4); 
$(divs).show(); 

You can test it out here. Nếu bạn cũng muốn để ngẫu nhiên thứ tự (không chỉ được hiển thị), bạn đã có chúng được sắp xếp vì vậy chỉ cần gắn nó vào phần cùng cha mẹ theo thứ tự mới của họ bằng cách thay đổi này:

$(divs).show(); 
//to this: 
$(divs).appendTo(divs[0].parentNode).show(); 

You can test that version here.

+1

Nice one, chém ở mảng để tránh chế biến nhiều hơn mức cần thiết, và thêm các appendTo. – Phrogz

+0

Sắp xếp mảng bằng cách sử dụng kỹ thuật đó là thiên vị đối với các vị trí ban đầu (nhiều khả năng hiển thị bốn vị trí đầu tiên), nhưng điều đó có lẽ là tốt cho nhu cầu của người đăng. – Phrogz

+0

@Phrogz - Không nên, đó là những gì '-0.5' cho, để tạo kết quả' -0.5' hoặc '0.5' cho kiểu sắp tới/quay lại cho tất cả các phần tử, không phải là' 0, 1' sẽ chỉ chuyển tiếp ... đưa ra các yếu tố thiên vị đầu tiên. –

2
jQuery(function($){ 
    var sortByN = function(a,b){ a=a.n; b=b.n; return a<b?-1:a>b?1:0 }; 
    $.each($('div.Image').map(
    function(){ return { div:this, n:Math.random() }; } 
).get().sort(sortByN), function(i){ 
    if (i<4) $(this.div).show(); 
    }); 
}); 

Lưu ý rằng điều này sẽ luôn hiển thị các div theo thứ tự giống như bản gốc. Điều đó có được chấp nhận không?

3

này làm những gì bạn cần: http://www.jsfiddle.net/Yn2pn/1/

$(document).ready(function() { 
    $(".Image").hide(); 

    var elements = $(".Image"); 
    var elementCount = elements.size(); 
    var elementsToShow = 4; 
    var alreadyChoosen = ","; 
    var i = 0; 
    while (i < elementsToShow) { 
     var rand = Math.floor(Math.random() * elementCount); 
     if (alreadyChoosen.indexOf("," + rand + ",") < 0) { 
      alreadyChoosen += rand + ","; 
      elements.eq(rand).show(); 
      ++i; 
     } 
    } 
}); 
+0

Câu trả lời từ Nick Craver thực sự là thanh lịch hơn :) –

Các vấn đề liên quan