Функция изменения размера срабатывает несколько раз

Я использую метод resize() для запуска функции, которая вернется на различные размеры области просмотра, такие как 992 768 и т. д. проблема в том, что функция выполняется каждый раз, вызывая сбой в DOM. пример в кодеке https://codepen.io/paul-solomon/pen/WBEgQe

//javascript

$(window).resize(function(){
nh_masonry.data.loadorder();
});


//css

.masonry_grid_quarter__container{
 margin-bottom: 8px;
 column-count:3;
 column-gap:8px;
}

@media screen and (max-width:992px){
.masonry_grid_quarter__container{
 column-count:2;
 }
}

@media screen and (max-width:768px){
 .masonry_grid_quarter__container{
  column-count:2;
  }
}

@media screen and (max-width:580px){
 .masonry_grid_quarter__container{
  column-count:1;
  }
 }

ожидаемый результат: функция изменения размера выполняется в определенных окнах просмотра фактический результат: несколько раз выполняет изменение размера, создавая сбой DOM.

Привет Пол, удачи в том, чтобы заставить это работать?

Chris Ngo 28.05.2019 00:20

Мне не повезло с этим. когда console.info(), кажется, что объект добавляется несколько раз при изменении ширины окна браузера, какие-либо другие предложения?

Paul Solomon 28.05.2019 00:45

Пол, я сейчас смотрю на ваш codepen, что вы можете сделать, так это иметь переменную, которая отслеживает текущее состояние окна просмотра, позвольте мне кое-что исправить для вас.

Chris Ngo 28.05.2019 00:52

Привет Пол, попробуйте мое решение ниже. Я также обновил ваш codepen.

Chris Ngo 28.05.2019 01:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужна переменная, которая отслеживает текущее состояние DOM.

Давайте создадим переменную с именем currentViewPort, которая может иметь значение «настольный компьютер», «планшет» или «мобильный телефон».

Когда размер окна изменится, мы изменим значение currentViewPort. Если currentViewPort уже соответствует нашему макету экрана, мы больше не будем вызывать функцию. Он будет вызываться только тогда, когда мы введем другой макет.

Вот он в действии: https://codepen.io/anon/pen/GaGboG?editors=1111

   var App = (function ($) {

   var nh_masonry = {};
   var currentViewPort = ""
   //sets initial reorder variable
   nh_masonry.vars = { reorder : false} 

   nh_masonry.onload = function () {
            // when the document is loaded sets the reorder variable to true
            // and also loads the order object method 
            nh_masonry.vars.reorder = !nh_masonry.vars.reorder;
            nh_masonry.data.loadorder();

     $(window).resize(function(){
           // re-set layout after resize
           if ($( window ).width() <= 992 && $( window ).width() > 768 && currentViewPort !== "desktop"){

             currentViewPort = "desktop"
             console.info("desktop");
              nh_masonry.data.loadorder();
              // nh_masonry.responsive.tablet();
              // nh_masonry.responsive.mobile();

           } else if ($( window ).width() == 768 && currentViewPort !== "tablet"){

             currentViewPort = "tablet"
             console.info("tablet");
              nh_masonry.data.loadorder();
              // nh_masonry.responsive.tablet();
              // nh_masonry.responsive.mobile();

           } else if ($( window ).width() < 768 && $( window ).width() >= 380 && currentViewPort !== "mobile"){
            currentViewPort = "mobile"
             console.info("mobile");
              nh_masonry.data.loadorder();
              // nh_masonry.responsive.tablet();
              // nh_masonry.responsive.mobile();
           }
         })  
     };

Я бы предложил использовать else if, таким образом, вам не нужно читать все это, чтобы увидеть, может ли произойти несколько

Akxe 28.05.2019 01:09

эта переменная действительно решает проблему многократного запуска, однако последний вопрос заключается в том, правильно ли codepen отображает изменение размера события DOM, заметив, что мне нужно обновить, чтобы увидеть правильный порядок загрузки слева направо для адаптивного просмотра — Кристофер Нго

Paul Solomon 28.05.2019 03:35

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

Chris Ngo 28.05.2019 03:54

Другие вопросы по теме