Активация элементов в некоторых рандомизированных массивы


У меня есть список с около 120 наименований в т. е. И у меня есть некоторые предметы, которые я хочу активировать. Я сравниваю, строить и выборочно некоторые массивы на лету. Цикл в метод run() функция является очень медленным, и я пытался добавить метод setTimeout(), как я читал где-то на StackOverflow.

Это, кажется, не улучшить производительность, и, если требуемый список элементов должен быть активирован слишком большой, начинается т. е. дать медленно ошибка сценария.

Я могу оптимизировать это то, что будет работать?

for(index = 0; index < 120; index++){
            wrapper.tempSlot.push(index);
}
Array.prototype.shuffle = function shuffle(){
    var tempSlot;
    var randomNumber;
    for(var i =0; i != this.length; i++){
        randomNumber = Math.floor(Math.random() * this.length);
        tempSlot = this[i]; 
        this[i] = this[randomNumber]; 
        this[randomNumber] = tempSlot;
    }
}

Array.prototype.compare = function(testArr) {
    if (this.length != testArr.length) return false;

    for (var i = 0; i < testArr.length; i++) {
        if (this[i].compare) { 
            if (!this[i].compare(testArr[i])) return false;
        }
        if (this[i] !== testArr[i]) return false;
    }
    return true;
}   


function checkAgainstEl(val){
    val = $($item.select).eq(val).data('personid')
    return val in oc([array, with, to, be, activated, numbers]);
}       

var index = 0;
var length = wall.globals.highlight.selection.length;
var run = function(){
    for(;index < length; index++){

        wrapper.tempSlot.shuffle();
        var pop     = wrapper.tempSlot.pop();
        var value   = wall.globals.highlight.selection[index];
        var newItem = $('#wallItem' + value);

        wrapper.objectsStr = wrapper.objectsStr + '#wallItem' + value + ', ';   

        while(checkAgainstEl(pop)){
            wrapper.tempSlot.shuffle()  
            pop = wrapper.tempSlot.pop();
        }

        beforeItem  = $($item.select).eq(pop);

        newItem.insertBefore(beforeItem);
        $($container.select).append(beforeItem);                

        if (index + 1 < length && index % 5 == 0) {
                setTimeout(run, 25);
            }               
    }
}
run();


Комментарии
1 ответ


  1. Взаимодействие с DOM является одним из самых медленных операций в JavaScript. Я предлагаю выбрать все элементы перед циклом, а затем сославшись на кэшированные элементы внутри.

  2. В то же время, не проводите никаких манипуляций с DOM в цикле, если вы можете помочь ему. Поскольку это не выглядит, как вы можете, другой подход заключается в том, чтобы отсоединить все элементы DOM, вы собираетесь переставить перед началом цикла, выполнить манипуляции внутри цикла, а затем снова прикрепить их в дом в конце.

  3. Обратного пока цикл будет быстрее, чем на.

  4. Если вы используете версию jQuery до 1.6, то .данных() метод несет много накладных расходов. В checkAgainstEl(), используйте $.данных($($пункт.выберите).вам(Вэл), 'personId') вместо.

  5. Похоже, вы перегруппировка объектов jQuery в новых объектов jQuery без надобности, и в нескольких местах. Как в #4. Я предполагаю, что переменные с префиксом $ являются jQuery объекты; если они есть, нет необходимости, чтобы обернуть их в $() снова.

Ваша самая большая проблема-это взаимодействие дом внутри цикла. Прекратите это любым способом, и вы будете золотой.

5
ответ дан 6 мая 2011 в 08:05 Источник Поделиться