• Как ускорить обработку элементов в массиве JS?

    trushka
    @trushka
    Каждый раз append() вызывает тормоза, да и функция checkableItem() тоже весьма рессурсоёмкая. Да и сам по себе вызов функции весьма притормаживает выполнение. То есть, лучше прописать прямо в коде. Причём, именно добавлять в текстовую переменную сгенерированный html. А ховер-эффект с помощью css :hover сделать (а так же для :checked, чтоб отдельного класса не прописывать, ну и там ещё какой-то аттрибут my_type задаётся и при этом display:none - так тоже можно прописать в css .st-checkable-item[my_type] {display:none}).
    var ch = '', html='';            
                $.each(json.hotels, function(i) {
    
                    // Если итем присутствует в GET запросе.
                    ch =qs && qs.hotelId && qs.hotelId.length > 0 && $.inArray(json.hotels[i].id_extra, qs.hotelId) >= 0  // это выражение и так даст true или false
                   html+='<div class="st-checkable-item" unselectable="on"><input id="item_'+config.value+'" type="checkbox" value="'+json.hotels[i].id_extra+'" data-altvalue="+config.altValue+'"'+(config.ch?' checked':'')+'><label for="item_'+config.value+'" unselectable="on"><span>' + json.hotels[i].type + "&nbsp;" + json.hotels[i].name + '</span></label></div>'
                   // ну и т.д., я не все параметры тут вписал в код, но думаю, что ясно как остальные дописать.
                });
    $("#st-all-hotels-list .st-listbox-content").append(html)
    console.timeEnd('create list');
    Ответ написан
    Комментировать
  • Как ускорить обработку элементов в массиве JS?

    @Maa-Kut
    Как насчет того, чтобы не создавать/аппендить на каждой итерации новые элементы, а собирать вместо этого их в одну большую строку, которую затем разом положить в $("#st-selected-hotels-list .st-listbox-content")? Т.е. пусть checkableItem возвращает строку, а не элемент, и тогда будет что-то такое:
    var str = '';
    
    $.each(json.hotels, function(i) {
      str += checkableItem(...);
    });
    
    $("#st-all-hotels-list .st-listbox-content").append(str);
    
    // Обработку событий из checkableItem убираем, навешиваем обработчики отдельно
    
    $("#st-all-hotels-list .st-listbox-content").on('mouseenter', '.st-checkable-item', function() {
      $(this).addClass('st-highlight');
    });
    
    $("#st-all-hotels-list .st-listbox-content").on('mouseleave', '.st-checkable-item', function() {
      $(this).removeClass('st-highlight');
    });
    Ответ написан
    Комментировать
  • Как правильно отцентровать гуглокарту через div?

    ksider
    @ksider
    Я сварщик не настоящий
    Вообщем у меня эта проблема решилась подгрузкой карты во время клика по табу.
    а так проблема с display:none известная stackoverflow.com/questions/16167440/jquery-1-9-1-...
    Ответ написан
    Комментировать