Модальные окна и динамические списки

191
23 декабря 2021, 00:30

Надо сделать подобное. Я подобное сделал, но это получается говнокод какой-то и обслуживать его тоже вредно.

onst coise = { 
    category: '', 
    subcategory: '', 
    oneparams: '', 
    twoparams: '', 
    photo: '' 
} 
 
 
const categories = [ 
    "Работа", "Транспорт", "Недвижимость", "Услуги", "Электроника" 
]; 
 
const categoriesList = document.getElementsByClassName('categoryList')[0]; 
const imgStrelka = document.getElementsByClassName('imgStrelka')[0]; 
 
const categorie = { 
    "Работа": { 
        subcategory: { 
            title: "Выберите подкатегорию", 
            categorii: ["Вакансии", "Резюме", "Подработка"], 
        }, 
         
        photo: { 
            title: "Загрузить изображение", 
            categorii: ["Выбрать", "Сфотографировать", "У меня нет фото"] 
        } 
    }, 
    "Транспорт": { 
        subcategory: { 
            title: "Выберите подкатегорию", 
            categorii: ["Авто", "Мото", "Велосипеды"], 
        }, 
        oneparams: { 
            title: "Какая марка?", 
            categorii: ["бмв", "ауди", "мерседес", "бентли", "лада"], 
        }, 
 
 
        photo: { 
            title: "Загрузить изображение", 
            categorii: ["Выбрать", "Сфотографировать", "У меня нет фото"] 
        } 
    },  
    "Недвижимость": { 
        subcategory: { 
            title: "Выберите подкатегорию", 
            categorii: ["Квартира", "Дом", "Комната", "Гараж", "Земельный участок"] 
        }, 
        oneparams: { 
            title: "Сколько комнат?", 
            categorii: ["Студия", "1", "2", "3", "4+"] 
        }, 
        twoparams: { 
            title: "Какой этаж?", 
            categorii: ["1", "2", "3", "4", "5"] 
        }, 
        photo: { 
            title: "Загрузить изображение", 
            categorii: ["Выбрать", "Сфотографировать", "У меня нет фото"] 
        } 
    }, 
    "Услуги": { 
        subcategory: { 
            title: "Выберите подкатегорию", 
            categorii: ["Оказать услугу", "Требуется услуга"] 
        }, 
        photo: { 
            title: "Загрузить изображение", 
            categorii: ["Выбрать", "Сфотографировать", "У меня нет фото"] 
        } 
    } 
}; 
 
 
 
 
 
 
function addBoard(categor, tmp, title) { 
    createLiAppend(categor, title);  
    addEventClick(categor, tmp); 
} 
 
function createLiAppend(arr, title) { 
    for (let i=0; i < arr.length; i++) { 
        const li = document.createElement('li'); 
        li.innerText = arr[i]; 
        li.classList.add('categoryItem'); 
        categoriesList.appendChild(li); 
        contentTitle.innerText = title; 
    } 
} 
 
/* удаляет все элементы li */ 
function deleteLi() {   
    categoriesList.innerHTML = '' 
} 
 
 
var contentTitle = document.getElementsByClassName('contentTitle')[0]; 
 
function addEventClick(arr, tmp) { 
    const li = document.getElementsByTagName('li'); 
    for (let i = 0; i< arr.length; i++) { 
        li[i].addEventListener('click', function() { 
            if (tmp === 'Категория') { 
                contentTitle.innerText = "Категория"; 
                coise.category = li[i].innerText; 
                deleteLi(); 
                addBoard(categorie[coise.category].subcategory.categorii, 'Субкатегория', categorie[coise.category].subcategory.title); 
            } 
            else if (tmp === "Субкатегория") { 
                coise.subcategory = li[i].innerText; 
                deleteLi(); 
                 
                if (categorie[coise.category].oneparams === undefined) { 
                    addBoard(categorie[coise.category].photo.categorii, 'Фото', categorie[coise.category].photo.title); 
                } else  
                addBoard(categorie[coise.category].oneparams.categorii, '1 параметр', categorie[coise.category].oneparams.title); 
                 
            } 
            else if (tmp === '1 параметр') { 
 
                coise.oneparams = li[i].innerText; 
                deleteLi(); 
 
                if (categorie[coise.category].twoparams === undefined) { 
                    addBoard(categorie[coise.category].photo.categorii, 'Фото', categorie[coise.category].photo.title); 
                } else  
                addBoard(categorie[coise.category].twoparams.categorii, '2 параметр', categorie[coise.category].twoparams.title); 
 
            } 
            else if (tmp === '2 параметр') { 
                coise.twoparams = li[i].innerText; 
                deleteLi(); 
                addBoard(categorie[coise.category].photo.categorii, 'Фото', categorie[coise.category].photo.title) 
            }  
            else if (tmp === 'Фото') { 
                if (li[i].innerText === 'У меня нет фото') window.location.reload(); 
                 
            } 
        }) 
    }    
}

Answer 1

Полностью затачивать под указанные Вами скриншоты не стал, но общую логику обрисовал.

let activeScreen = 0; 
let screenValues = {}; 
 
const $screen = document.getElementById('screen'); 
const $screenOptions = document.getElementById('screen-options'); 
const $screenLabel = document.getElementById('screen-label'); 
 
// Список экранов и их параметров 
let screens = [{  
  key: 'key1', 
  label: 'Заголовок 1',  
  options: [  
    {label: 'Параметр 1-1', value: 'value1-1' }, 
    {label: 'Параметр 1-2', value: 'value1-2' }, 
    //... 
  ]  
},{  
  key: 'key2', 
  label: 'Заголовок 2',  
  options: [  
    {label: 'Параметр 2-1', value: 'value2-1' }, 
    {label: 'Параметр 2-2', value: 'value2-2' }, 
    {label: 'Параметр 2-3', value: 'value2-3' }, 
    //... 
  ]  
}]; 
 
// Функция обновления активного экрана 
function updateScreen(screenIndex) { 
   
  // Переключаемся на следующий экран 
  activeScreen = screenIndex; 
 
  // Обновляем заголовок нового экрана 
  $screenLabel.innerText = screens[activeScreen].label; 
   
  // Обновляем параметры нового экрана 
  $screenOptions.innerHTML = ''; 
  const options = screens[activeScreen].options; 
  for (const optionIndex in options) { 
    let $option = document.createElement('li'); 
    $option.innerText = options[optionIndex].label; 
    $option.onclick = () => onSelectScreenOption(optionIndex); 
    $screenOptions.appendChild($option); 
  } 
   
} 
 
// Событие выбора параметра активного экрана 
function onSelectScreenOption(optionIndex) { 
 
  const activeScreenData = screens[activeScreen]; 
  const selectedOption = activeScreenData.options[optionIndex]; 
  
  // Сохраняем значение выбранного параметра 
  screenValues[activeScreenData.key] = selectedOption.value; 
   
  if (activeScreen + 1 === screens.length) {  
    // Выбор параметров завершен 
    // Скрываем экран 
    $screen.style.display = 'none';  
    // Все значения экранов хранятся в объекте screenValues 
    console.log(screenValues);  
  } else { 
    updateScreen(activeScreen + 1); 
  } 
   
} 
 
updateScreen(0); // Показваем первый экран
<div id='screen'> 
  <h2 id='screen-label'></h2> 
  <ul id='screen-options'></ul> 
</div>

READ ALSO
Разделить API config на версию dev и prod webpack

Разделить API config на версию dev и prod webpack

Подскажите пожалуйста, есть вот файл configjs в нем экспортируемая переменная с ссылкой на API, но есть API для dev версии, а есть отдельное API для prod версии,...

304
Какой метод использовать для получения cookies?

Какой метод использовать для получения cookies?

Я делаю свое собственное расширение Chrome на JS, поэтому, мне нaдo получать куки с нужного сайтаНо я не знаю, какой метод мне использовать

193
Как реализовать подсветку в &lt;code&gt; html js?

Как реализовать подсветку в <code> html js?

Как сделать такую подсветку как например у нас на stackoverflow?

157