Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.09.2021, 22:31
Новичок на форуме
Отправить личное сообщение для b3ng3r Посмотреть профиль Найти все сообщения от b3ng3r
 
Регистрация: 04.09.2021
Сообщений: 7

Скрытие/показ разных div
Очередной вечер в попытке разобраться в работе js.
Вчера разобрался с подставлением уникальных ид при динамическом добавлении через js. На этот раз необходимо сделать следующее:
Имеем <div id="id-1"> ... </div> и таких 20 штук. То есть, <div id="id-2">...<div id="id-3"> и так далее. После этого имеем <div class="film_1">и точно так же до <div class="film_20">. Все что хочу сделать, это чтобы при нажатии на див с ид, тобишь <div id="4"> все остальные дивы с ид прятались по типу display none. И при этом <div class="film_4"> появлялся. Думаю задумка ясна. Но реализовать у меня не получается, как только не пробовал. Буду благодарен тому кто поможет.
Вот код с динамическим созданием дивов с ид и классом. Cтрока с id - 52. Строка с class'ом - 81
const API_KEY = 
      "1576af80-f100-440b-94bb-d19fb8e90583";
const API_URL_POPULAR =
  "https://kinopoiskapiunofficial.tech/api/v2.2/films/top?type=TOP_100_POPULAR_FILMS&page=1";
const API_URL_SEARCH =
  "https://kinopoiskapiunofficial.tech/api/v2.1/films/search-by-keyword?keyword=";

const API_FILM = "8498e5fa32d80e669ddc10908de7e3bd";




getMovies(API_URL_POPULAR);

async function getMovies(url) {
  const resp = await fetch(url, {
    headers: {
      "Content-Type": "application/json",
      "X-API-KEY": API_KEY,
    },
  });
    
  const respData = await resp.json();
  showMovies(respData);
}

function getClassByRate(vote) {
  if (vote >= 7) {
    return "green";
  } else if (vote > 5) {
    return "orange";
  } else {
    return "red";
  }
}


            
      

function showMovies(data) {
  const moviesEl = document.querySelector(".movies");

  // Очистка фильмов
  document.querySelector(".movies").innerHTML = "";
  data.films.forEach((movie, i) => {
    const movieEl = document.createElement("div");
     
        
    movieEl.classList.add("movie");
    movieEl.innerHTML = `
        <div id="id-${i+1}" href="">
        <a href="">
        <div class="movie__cover-inner">
        <img
          src="${movie.posterUrlPreview}"
          class="movie__cover"
          alt="${movie.nameRu}"
        
          />  
         
        
        <div class="movie__cover--darkened"></div>
      </div>
      <div class="movie__info">
        <div class="movie__title">${movie.nameRu}</div>
        <div class="movie__category">${movie.genres.map(
          (genre) => ` ${genre.genre}`
        )}</div>
        ${
          movie.rating &&
          `
        <div class="movie__average movie__average--${getClassByRate(
          movie.rating
        )}">${movie.rating}</div>
        `
        }
      </div>
    </div>

    <div class="film_${i+1}">
        <div class="film__name">${movie.nameRu}</div>
        <div class="film__poster"><img src="${movie.posterUrlPreview}" class="film__poster"></div>
        <div class="film__movie"><iframe src="https://v1630850415.bazon.site/kp/${movie.filmId}" frameborder="0" scrolling="no" allowfullscreen="" referrerpolicy="origin" width="800" height="452" class="film__movie"></iframe></div>
        <div class="film__description">${movie.description}</div>
        </div>

        `;


 
    moviesEl.appendChild(movieEl);
  });
}
        

   

const form = document.querySelector("form");
const search = document.querySelector(".header__search");

form.addEventListener("submit", (e) => {
  e.preventDefault();

  const apiSearchUrl = `${API_URL_SEARCH}${search.value}`;
  if (search.value) {
    getMovies(apiSearchUrl);

    search.value = "";
  }
});
Ответить с цитированием
  #2 (permalink)  
Старый 05.09.2021, 23:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

b3ng3r,
а можно без любых id?
Ответить с цитированием
  #3 (permalink)  
Старый 05.09.2021, 23:05
Новичок на форуме
Отправить личное сообщение для b3ng3r Посмотреть профиль Найти все сообщения от b3ng3r
 
Регистрация: 04.09.2021
Сообщений: 7

рони,
Ну мне необходимо по определенному диву скрывать остальные и показывать доп. определенный. Просто может привязку по классу сделать вместо ид
Ответить с цитированием
  #4 (permalink)  
Старый 06.09.2021, 00:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

film poster open close
b3ng3r,
открывашка будет вечной, если я сменю батарейки...)))
кликать по миниатюрам слева...


<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .movie__cover {
            height: 70px;
            width: 50px;
        }

        .info + .film{
              display: none;
        }

        .info.open + .film{
             display: block;
        }
        .film__poster{
             margin: 0 auto;
             width: 200px;
        }
    </style>
</head>
<body>
    <div class="movies"></div>
    <script>
        const API_KEY =
            "1576af80-f100-440b-94bb-d19fb8e90583";
        const API_URL_POPULAR =
            "https://kinopoiskapiunofficial.tech/api/v2.2/films/top?type=TOP_100_POPULAR_FILMS&page=1";
        const API_URL_SEARCH =
            "https://kinopoiskapiunofficial.tech/api/v2.1/films/search-by-keyword?keyword=";
        const API_FILM = "8498e5fa32d80e669ddc10908de7e3bd";
        getMovies(API_URL_POPULAR);
        async function getMovies(url) {
            const resp = await fetch(url, {
                headers: {
                    "Content-Type": "application/json",
                    "X-API-KEY": API_KEY,
                },
            });
            const respData = await resp.json();
            showMovies(respData);
            document.addEventListener("click", event => {
                let {target} = event;
                if (target = target.closest(".info")) {
                    event.preventDefault();
                    let open = document.querySelector(".info.open");
                    if (open && open != target) open.classList.remove("open");
                    target.classList.toggle("open")
                }
            })
        }
        function getClassByRate(vote) {
            if (vote >= 7) {
                return "green";
            } else if (vote > 5) {
                return "orange";
            } else {
                return "red";
            }
        }
        function showMovies(data) {
            const moviesEl = document.querySelector(".movies");
            // Очистка фильмов
            document.querySelector(".movies").innerHTML = "";
            data.films.forEach((movie, i) => {
                const movieEl = document.createElement("div");
                movieEl.classList.add("movie");
                movieEl.innerHTML = `
                <div class="info">
                <div class="movie__cover-inner">
                <img
                    src="${movie.posterUrlPreview}"
                    class="movie__cover"
                    alt="${movie.nameRu}"
                    />
                <div class="movie__cover--darkened"></div>
            </div>
            <div class="movie__info">
                <div class="movie__title">${movie.nameRu}</div>
                <div class="movie__category">${movie.genres.map(
                    (genre) => ` ${genre.genre}`
                )}</div>
                ${
                    movie.rating &&
                    `
                <div class="movie__average movie__average--${getClassByRate(
                    movie.rating
                )}">${movie.rating}</div>
                `
                }
            </div>
        </div>
        <div class="film">
                <div class="film__name">${movie.nameRu}</div>
                <div class="film__poster"><img src="${movie.posterUrlPreview}" class="film__poster"></div>
                <div class="film__movie"><iframe src="https://v1630850415.bazon.site/kp/${movie.filmId}" frameborder="0" scrolling="no" allowfullscreen="" referrerpolicy="origin" width="800" height="452" class="film__movie"></iframe></div>
                <div class="film__description">${movie.description}</div>
                </div>
                `;
                moviesEl.appendChild(movieEl);
            });
        }
        /*const form = document.querySelector("form");
        const search = document.querySelector(".header__search");
        form.addEventListener("submit", (e) => {
            e.preventDefault();
            const apiSearchUrl = `${API_URL_SEARCH}${search.value}`;
            if (search.value) {
                getMovies(apiSearchUrl);
                search.value = "";
            }
        });*/
    </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 06.09.2021, 09:41
Новичок на форуме
Отправить личное сообщение для b3ng3r Посмотреть профиль Найти все сообщения от b3ng3r
 
Регистрация: 04.09.2021
Сообщений: 7

рони,
А можешь дописать код, чтобы при нажатии на div info все остальные div info скрывались. То есть чтобы после нажатия оставался только div film и ничего больше. А то с моими стилями и внешнем оформлении данный формат конфликтует.
Ответить с цитированием
  #6 (permalink)  
Старый 06.09.2021, 10:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Сообщение от b3ng3r
все остальные div info скрывались.
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .movie__cover {
            height: 70px;
            width: 50px;
        }
        .info + .film, .info.hidden{
              display: none;
        }
        .info.open + .film{
             display: block;
        }
        .film__poster{
             margin: 0 auto;
             width: 200px;
        }
    </style>
</head>
<body>
    <div class="movies"></div>
    <script>
        const API_KEY =
            "1576af80-f100-440b-94bb-d19fb8e90583";
        const API_URL_POPULAR =
            "https://kinopoiskapiunofficial.tech/api/v2.2/films/top?type=TOP_100_POPULAR_FILMS&page=1";
        const API_URL_SEARCH =
            "https://kinopoiskapiunofficial.tech/api/v2.1/films/search-by-keyword?keyword=";
        const API_FILM = "8498e5fa32d80e669ddc10908de7e3bd";
        getMovies(API_URL_POPULAR);
        async function getMovies(url) {
            const resp = await fetch(url, {
                headers: {
                    "Content-Type": "application/json",
                    "X-API-KEY": API_KEY,
                },
            });
            const respData = await resp.json();
            showMovies(respData);
            document.addEventListener("click", event => {
                let {target} = event;
                if (target = target.closest(".info")) {
                    event.preventDefault();
                    let open = document.querySelector(".info.open");
                    target.classList.toggle("open");
                    document.querySelectorAll(".info").forEach( elem => {
                     if(target != elem) {
                     elem.classList.toggle("hidden", target != open)
                     }
                    })
                }
            })
        }
        function getClassByRate(vote) {
            if (vote >= 7) {
                return "green";
            } else if (vote > 5) {
                return "orange";
            } else {
                return "red";
            }
        }
        function showMovies(data) {
            const moviesEl = document.querySelector(".movies");
            // Очистка фильмов
            document.querySelector(".movies").innerHTML = "";
            data.films.forEach((movie, i) => {
                const movieEl = document.createElement("div");
                movieEl.classList.add("movie");
                movieEl.innerHTML = `
                <div class="info">
                <div class="movie__cover-inner">
                <img
                    src="${movie.posterUrlPreview}"
                    class="movie__cover"
                    alt="${movie.nameRu}"
                    />
                <div class="movie__cover--darkened"></div>
            </div>
            <div class="movie__info">
                <div class="movie__title">${movie.nameRu}</div>
                <div class="movie__category">${movie.genres.map(
                    (genre) => ` ${genre.genre}`
                )}</div>
                ${
                    movie.rating &&
                    `
                <div class="movie__average movie__average--${getClassByRate(
                    movie.rating
                )}">${movie.rating}</div>
                `
                }
            </div>
        </div>
        <div class="film">
                <div class="film__name">${movie.nameRu}</div>
                <div class="film__poster"><img src="${movie.posterUrlPreview}" class="film__poster"></div>
                <div class="film__movie"><iframe src="https://v1630850415.bazon.site/kp/${movie.filmId}" frameborder="0" scrolling="no" allowfullscreen="" referrerpolicy="origin" width="800" height="452" class="film__movie"></iframe></div>
                <div class="film__description">${movie.description}</div>
                </div>
                `;
                moviesEl.appendChild(movieEl);
            });
        }
        /*const form = document.querySelector("form");
        const search = document.querySelector(".header__search");
        form.addEventListener("submit", (e) => {
            e.preventDefault();
            const apiSearchUrl = `${API_URL_SEARCH}${search.value}`;
            if (search.value) {
                getMovies(apiSearchUrl);
                search.value = "";
            }
        });*/
    </script>
</body>
</html>
Ответить с цитированием
  #7 (permalink)  
Старый 06.09.2021, 10:16
Новичок на форуме
Отправить личное сообщение для b3ng3r Посмотреть профиль Найти все сообщения от b3ng3r
 
Регистрация: 04.09.2021
Сообщений: 7

рони,
Помогло, благодарю.
Ответить с цитированием
  #8 (permalink)  
Старый 06.09.2021, 10:42
Новичок на форуме
Отправить личное сообщение для b3ng3r Посмотреть профиль Найти все сообщения от b3ng3r
 
Регистрация: 04.09.2021
Сообщений: 7

рони,
В ходе изменений моего исходного кода и добавления его на хост, выявилась проблема. При использовании поиска и с последующей загрузкой точно таких же дивов с другими фильмами, скрипт с скрытием и показом div'ов перестал работать. Как можно решить данную проблему?
Прикреплю ссылку на сайт, но чтобы увидеть страницу уже с измененным скриптом надо чуть подождать чтобы хост обновился.
кликабельно
Ответить с цитированием
  #9 (permalink)  
Старый 06.09.2021, 13:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

b3ng3r,
вынесите строки 43 - 55 из getMovies в любое место, отдельно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX обновление div в разных частях страницы kkolorid AJAX и COMET 9 19.12.2014 11:58
Послать значения из разных div в виде строки Timuchen AJAX и COMET 4 25.08.2014 00:24
Jquery, Последовательное выполнение функций разных div в одном скрипте. schnitzer Общие вопросы Javascript 3 29.09.2013 02:49
вывод разных div в зависиости от checkbox djonA Общие вопросы Javascript 1 11.05.2013 12:52
Нудна помощь, координаты div в разных броузерах Виталий 777 Элементы интерфейса 4 07.02.2013 15:52