2016-07-13 3 views
0

То, что я сделал до сих пор был следующим:Показать определенное количество случайных объектов из выделения и скрыть все остальные с помощью js/jQuery?

function randomSelectObjects(randObjects, countShow){ 
    var i = 0; 
    var countRandObjects = randObjects.length; 
    var preselectedObj = false; 
    randObjects.hide(); // hide all items 
    while (i < countShow) { // while until we found enough items we can show 
     preselectedObj = randObjects.eq(Math.floor(Math.random()*countRandObjects)); // random select an object 
     if(preselectedObj.is(':hidden')){ // make sure it is not already unhidden 
      preselectedObj.show(); // show the object 
      i++; // up the counter – done only in case it was not already visible 
     } 
    } 
} 

Использование:

var randObjects = $('.items'); 
randomSelectObjects(randObjects, 1); 

Проблема заключается в том, что я буду работать в выборе уже выявлено (show()) элемента внутри while время от времени. Я хотел бы удалить лишние накладные расходы.

К сожалению, кажется, что нет способа удалить объект из кешированного выделения. remove() также удаляет объект из DOM, который не является (всегда) тем, что я хочу.

Клонирование выбора объектов сначала, а затем с использованием remove() будет работать для процесса выбора, но тогда накладные расходы будут соответствовать выбранным элементам с живым DOM для фактически show().

ответ

1

Мое предложение - создать уникальный случайный массив. Скрыть все элементы затем цикл через массив случайных inidices и показать соответствующие элементы

// wrap in simple jQuery plugin 
$.fn.randomDisplay = function(max_items) { 
    max_items = max_items || 5; 
    //create array of unique random indices 
    var randArr = randArray(this.length, max_items); 
    // hide all then filter matches to show 
    this.hide().filter(function(i){ 
    return randArr.indexOf(i) >-1 
    }).show(); 

    // creates unique array 
    function randArray(max, len) { 
    var arr = [], rand; 
    for (var i = 0; i < len; i++) { 
     rand = getRand(max) 
     while (arr.indexOf(rand) > -1) { 
     rand = getRand(max) 
     } 
     arr.push(rand); 
    } 
    return arr; 
    } 
    // random number helper 
    function getRand(max) { 
    return Math.floor(Math.random() * max) 
    } 

} 

// use 
$(function(){ 
    $('.item').randomDisplay(7) 
}) 

DEMO

+0

Спасибо за ваше предложение! Переключение моего фрагмента с вашим, я получил расчет страниц, как навсегда, прежде чем показывать контент. Я расследую и дам вам знать, как только я это выясню. (Ошибка может быть где-то еще ...) – Hafenkranich