Оптимизация кода фиксированного блока

356
06 февраля 2017, 17:43

Можно ли это как то упростить:

function is_iOS() {
    var iDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'];
    while (iDevices.length) {
        if (navigator.platform === iDevices.pop()) return true;
    }
    return false;
}
function fixedRec(el) {
    if($(document).scrollTop() >= el.prev().offset().top + el.prev().outerHeight()) {
        if($(document).scrollTop() < el.parent().outerHeight() - ($(window).outerHeight() / 1.5)) {
            if(is_iOS() || $(window).width() < 1000){
                el.removeClass('fixed').addClass('absolute').css({top: (top - 150)});
            } else {      
                el.removeAttr('style').removeClass('absolute').addClass('fixed');
            }
        } else {
            el.removeAttr('style').removeClass('fixed').addClass('absolute');
        }
    } else {
        el.removeAttr('style').removeClass('absolute').removeClass('fixed');
    }
}
Answer 1

Вместо этой жести

function is_iOS() {
    var iDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'];
    while (iDevices.length) {
        if (navigator.platform === iDevices.pop()) return true;
    }
    return false;
}

Можно сделать.

function checkIOS() { 
  var iDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod']; 
   
  return iDevices.includes(navigator.platform); 
} 
 
console.log(checkIOS());

Есть еще способ с .test(), но у вас уже есть массив.
Вы уверены, что там должно быть "ИЛИ" в проверке на устройства и размер окна?

Answer 2

is_iOS переписываем используя Array.prototype.some

function is_iOS() {
    var iDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'];
    return iDevices.some(dev => dec === navigator.platform);
}

fixedRec делаем чуть менее выпуклым, за счёт замены else на return.
Обязательно добавляем комментарии, что происходит в каждом конкретном случае. Например: Долистали до следующего элемента.

function fixedRec(el) {
  let top = $(document).scrollTop();
  if (top < el.prev().offset().top + el.prev().outerHeight()) {
    // comment
    el.removeAttr('style').removeClass('absolute').removeClass('fixed');
    return;
  }
  if (top >= el.parent().outerHeight() - ($(window).outerHeight() / 1.5)) {
    // comment
    el.removeAttr('style').removeClass('fixed').addClass('absolute');
    return;
  }
  if(is_iOS() || $(window).width() < 1000){
    el.removeClass('fixed').addClass('absolute').css({top: (top - 150)});
  } else {      
    el.removeAttr('style').removeClass('absolute').addClass('fixed');
  }
}
READ ALSO
jQuery 3 - альтернатива функции live

jQuery 3 - альтернатива функции live

Подскажите пожалуйста, раньше использовал функцию live или модуль livequery для доступа к загруженным с помощью AJAX элементам

412
Сравнение данных в &ldquo;input&rdquo; с данными в объекте

Сравнение данных в “input” с данными в объекте

Все было бы прекрасно, но проблема с последним else ifОн с каждым объектом выдает alert независимо значение true или false

341
Не срабатывает padding сверху. Masonry

Не срабатывает padding сверху. Masonry

Нас последнем экране товаров не получается сделать отступ сверхуИспользовал плагин Masonry для адаптивной плитки блоков

467
Как запретить работу скрипта?

Как запретить работу скрипта?

Как по нажатию на input запретить или разрешить выполнение скрипта?

472