• Как сделать переборку по классам?

    У вас HTMLCollection, а не массив, поэтому forEach нет.

    Два варианта:
    1. [...document.getElementsByClassName("allow")] для перевода в массив, и далее делаете forEach
    2. Если не нужна Live-коллекция элементов, используйте querySelectorAll чтобы найти элементы

    Вариант №2 обычно предпочтительнее.

    И, не меняйте всё свойство style, а лишь нужный стиль:
    e.style.background = 'red';

    Поэтому если записать всё максимально коротко, то:
    [...document.querySelectorAll('.allow')].forEach(element => {
      element.style.background = 'red';
    });
    Ответ написан
    3 комментария
  • Когда в БЭМ использовать миксы, а когда модификаторы?

    Обычно формируется некий UI Kit, и максимум иногда нужно модифицировать отображение блока в отдельных случаях. Посмотрите что у вас с дизайном, может быть вы пытаетесь один блок подогнать под миллион разных задач, тогда как это должны быть разные блоки.

    В общем случае, если вы корректируете стиль в отдельном случае, это модификатор. Если у вас их будет много – это тоже нормально (с точки зрения размещения классов), но обратите внимание почему их много, это не совсем типично иметь 20-40 разных модификаторов под один блок на разных страницах.
    Ответ написан
    Комментировать
  • Структура файлов небольшого многостраничника, как организовать?

    Почитайте про CMS и как они работают.

    Если коротко, то программа определяет путь через URL (адрес страницы в интернете), и в зависимости от адреса отдает вам нужную страницу. При этом сам скрипт, обрабатывающий запрос от клиента обычно в корне сайта (index.php), и просто ловит все запросы поступающие к сайту.

    Поэтому как верно сказано выше, статику никто не делает, если это не самый-самый-самый простой сайт.
    Ответ написан
    Комментировать
  • Чему, как и где учиться веб дизайну?

    В веб-дизайне нужно понимать техническую часть, как люди (в том числе и техническая команда, и пользователи) потом будут работать с этими дизайнами, и при этом нужно "чувствовать" чтобы сделать хороший веб-дизайн.

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

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

    Третье, разобраться как устроены сайты (структура, шапка, контент, футер, меню), и посмотреть на разные UI Kit'ы, чтобы понять из чего обычно строятся все интерфейсы (плюс-минус, если без наворотов).

    Дальше надо просто брать идеи продуктов, и рисовать дизайны. Если без опыта верстки, то надо кого-то, кто подскажет какие есть ошибки в дизайне (для технических специалистов). Поэтому лучше устроиться куда-нибудь и начать набираться опыта.

    Ну и практика-практика-практика, больше никак.
    С опытом придет чувство что хорошо, а что не очень. Объяснить это сложно :)

    По инструментам – Zeplin, или вектор, но могу ошибаться, потому что не дизайнер, я просто знаю что крутые дизайнеры работают с этим. Если сложно (вектор это непросто для новичка), можно начать с фотошопа.
    Ответ написан
    1 комментарий
  • Зачем нужна папка app в js приложениях?

    Есть такое слово, Cohesion, т.е. связи между сущностями. Если это слово применить к файловой структуре, можно сказать так –принципы по которым объединяются сущности в файловой системе. Например ручки можно сложить по цвету, или по типу (гелевая/шариковая).

    Так вот, в разработке тоже самое. Можно тесты хранить рядом с файлами, потому что они имеют прямое отношение к конкретной сущности. Можно и наоборот, хранить вне исходника приложения, потому что иногда считается что тесты это не код приложения, а прикладной код, который запускается только на этапе разработки, и делать ему рядом с кодом самого приложения нечего.

    На самом деле точек зрения больше.
    Просто в зависимости от идеи, можно хранить код в разных местах.

    Лично я предпочитаю именно вариант №1, потому что так и удобнее с позиции разработки (не надо лазить по файловой структуре, всё в одном месте), да и тесты неразделимы с разработкой (это часть разработки), в том числе документация решения, поэтому для меня это одно целое, поэтому я храню их вместе.

    Так вот, поэтому иногда есть разделение:
    app – код приложения
    test – код тестов
    ...море других папок (support/env/static/assets, и так далее).
    Ответ написан
    Комментировать
  • Что лучше использовать: qunit, mocha, jest?

    Есть несколько важных моментов при тестировании:
    1. Возможности библиотеки
    2. Скорость тестирования
    3. Популярность инструмента

    Так вот, Jest, по моему опыту использования, отвечает всем параметрам. Раньше был Jasmine (это база Jest, насколько я знаю), и там сильно не хватало параллельного запуска тестов, а в Jest это решили, и сейчас он очень быстро прогоняет тесты.

    Mocha не так популярна, да и из коробки есть не всё, надо или Chai ставить, потом Sinon, и так собирать нужное решение. Параллельного запуска тестов тоже из коробки нет. Поэтому, можно использовать, но придется самому собирать нужное решение под тестирование.

    QUnit не использовал, но всегда думал что это устаревшая штуковина

    Для меня, помимо всего прочего, важна популярность инструмента, потому что люди в команде меняются, инструменты развиваются, и чем популярнее инструмент, тем (имхо) легче найти специалистов, плюс, субъективно, такие инструменты обычно стабильнее и уже имеют решения типовых задач, которые могут возникнуть позже.

    Поэтому рекомендую Jest :+1:
    Ответ написан
    Комментировать
  • Фильтрация вложенных данных React?

    Я бы сделал два словаря (наборов соответствий данных):
    1. Название категории => Категория
    2. Название Item => Все категории с этим Item

    Дальше при фильтрации достаточно будет проверить наличие ключа в любом словаре (так вы поймете введена категория или Item), и вернуть значение по ключу.

    Словари можно составить один раз при получении данных.
    Всё написанное выше при условии что я правильно понял что вам нужно J
    Ответ написан
    Комментировать
  • Объясните как такое происходит с json?

    Если код не меняется, а выдача разная, дебажьте переменную $tamines
    Ответ написан
    1 комментарий
  • Как отрисовать график с помощью Js?

    Это уже не базовый график, судя по всему, и вам, вероятно, нужно работать с . Можно это сделать либо нативными средствами, либо есть такая библиотка, EaselJs, она довольно удобная – https://www.createjs.com/easeljs

    Если коротко, то она дает возможность описать структуру элементов, которые нужно отрисовать, и далее канвас перерисовывается в соответствии со структурой.
    Ответ написан
    Комментировать
  • Как обойти ожидание цепочки вызова методов?

    Похоже, что есть опечатка:

    open() {
            this.close = false
        }
    
        close() {
            this.close = true
        }


    Должно быть closed, судя по всему
    Ответ написан
  • Как вывести данный используя метод .map?

    Здесь проблема со структурой. Если атрибут относится к категории, он должен быть внутри её модели, а не отделен от неё. Поэтому и не получается обратиться сразу к двум свойствам из одного цикла, плюс возникает сложность по определению соответствий атрибутов и названий категорий.

    Текущую структуру можно вывести так:
    const testdata = [
                {
                    category: ['Категория-1_1', 'Категория-2_1','Категория-3_1',],
                    attr: [ 'attr1', 'attr2', 'attr3'],
                },
                {
                    category: ['Категория-1_2', 'Категория-2_2','Категория-3_2',],
                    attr: [ 'attr1', 'attr2', 'attr3'],
                }
            ];
    
    const templates = testdata.reduce((acc, item) => {
      return acc.concat(...item.category.map((category, index) => {
        const attr = item.attr[index] || '';
        return `<button class='category-btn' data-categoty='${attr}'>${category}</button>`;
      }));
    }, []);


    На выходе будет массив:
    0: "<button class='category-btn' data-categoty='attr1'>Категория-1_1</button>"
    1: "<button class='category-btn' data-categoty='attr2'>Категория-2_1</button>"
    2: "<button class='category-btn' data-categoty='attr3'>Категория-3_1</button>"
    3: "<button class='category-btn' data-categoty='attr1'>Категория-1_2</button>"
    4: "<button class='category-btn' data-categoty='attr2'>Категория-2_2</button>"
    5: "<button class='category-btn' data-categoty='attr3'>Категория-3_2</button>"
    Ответ написан
    Комментировать
  • Почему мой функционал поделиться в вк, твиттер и фэйсбкук работает коряво, а на примере нет?

    Если код одинаковый, а поведение разное, значит ошибка в окружении.
    Попробуйте запустить точную копию их кода (если возможно), и если ошибка останется, ищите внешние причины такого поведения.
    Ответ написан
    Комментировать
  • Nodejs и скрипт сайта?

    403 Forbidden обычно указывает на ошибку с правами
    Как вариант, проверьте наличие прав у пользователя под которым стартует nginx на чтение директорий.
    Ответ написан
    Комментировать
  • Возможно ли прочитать excel средствами js?

    Есть вот такой пакет для чтения Excel, https://www.npmjs.com/package/xlsx

    Если нужен локальный файл, то обращаться к диску пользователя нельзя, запрещено браузером.
    В лучшем случае есть песочница (https://developer.mozilla.org/en-US/docs/Web/API/F...), запросы к локальным файлам, и FileReader.
    Ответ написан
  • Отправка формы в iframe(в самом iframe есть форма) - как?

    Судя по вашему сообщению, проблема не в форме. Обычная HTML форма при отправке формирует тело запроса (или query) и открывает страницу заданную в форме с нужным типом запроса (GET/POST).

    Поэтому здесь не может быть запаздывания или каких-либо задержек со стороны браузера, просто потому что это обычная загрузка страницы с другим методом и с телом запроса, полученным из формы.

    >я тут немного посидел, если кратко: функция "public function submit()" в файле-обработчике php(сама отправка на email) - до неё доходит обработка: в начале функции пишу die - срабатывает. Видимо iframe быстро перезагружается - и отправка отменяется, но это не точно.
    Судя по всему, проблема не в форме, если запрос доходит. Проверьте метод запроса, параметры запроса, заголовки, и если всё в порядке, тогда проблема в обработчике.
    Ответ написан
  • Совсем не понимаю как правильно анимировать? Что за баг?

    Рекомендую переписать на CSS @keyframes и описать всю анимацию от её старта и до конца. Тогда, вероятно, JS не понадобится от слова совсем (разве что классы повесить при наведении мышки), и работать будет стабильно (всё будет на стороне браузера).

    https://developer.mozilla.org/en-US/docs/Web/CSS/C...

    И надо бы классы сделать, но не могу найти сходу нормального примера. Идея такая же, как здесь https://docs.angularjs.org/guide/animations.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы когда панель поднималась до верхнего края браузера, то она останавливала своё движение?

    Не совсем понял задачу, но похоже вам нужен просто `position: sticky`. В этом случае элемент будет "приклеен" к границе окна при прокрутке страницы. Положение такого элемента относительно границ окна можно регулировать, насколько я помню, через `top`, `right`, `bottom`, `left`.

    https://developer.mozilla.org/en-US/docs/Web/CSS/p...
    Вот здесь есть пример как оно работает
    Ответ написан
    Комментировать
  • Как передать значения из одного if в другой?

    Трудно понять как работает решение, но, похоже что спроектировано неверно.

    По-хорошему нужно переделать архитектуру, чтобы вы открывали модалку и передавали туда конкретное значение (в вашем случае URL), и тогда модалка отвяжется от конкретной разметки, и не будет проблем с пробросом значений.

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

    Если простое решение, то можно сделать через замыкание, т.е. делается IIFE (функция, которую объявили и сразу же вызвали), внутри неё создается переменная, и возвращается вам слушатель, и тогда из слушателя можно будет перезаписывать эту внешнюю переменную.

    element.addEventListener('click', function () {
      var sharedVariable;
    
      return function () {
        sharedVariable = 1; // Здесь переменная всегда доступна для чтения и записи
      }
    }());


    В любом случае рекомендую менять архитектуру.

    Как еще один простой вариант, это, хотя бы, можно сделать функцию openModal, и вызывать её при клике на ссылку. Она установит значение в разметке модалки, и откроет модалку, а дальше вы выберете нужный элемент из разметки и получите актуальную ссылку.
    Ответ написан
    3 комментария
  • Зачем нужны интерфейсы в Angular?

    Дело не в Angular, а в том что такое интерфейс. Я расскажу со стороны моей практики.

    Интерфейс это контракт взаимодействия между техническими сущностями (классы, объекты, функции, и так далее). Если мы создаем 10 объектов, которые соблюдают (реализуют) интерфейс, значит их можно подменять друг другом (только не нужно нарушать LSP, это принцип SOLID).

    Так вот, отсюда есть мощные бонусы:

    Первое, если создавать интерфейсы, то сущности начинают зависеть не друг от друга, а от интерфейса. Это значит что вместо зависимости одного класса от другого конкретного класса, можно использовать зависимость от интерфейса и любой класс реализующий интерфейс. Таким образом, если понадобится, можно спокойно заменить один класс на другой, если они реализуют один и тот же интерфейс. Это называется принцип инверсии зависимостей (один из принципов SOLID).

    Выходит что сущности не завязываются друг на друга, и их можно разрабатывать независимо друг от друга, а в разработке чем меньше связей между классами/объектами, тем лучше. Если потом понадобится изменить код, поменять класс, будет значительно меньше проблем. Меньше, потому что если есть цепочка зависимостей, то нельзя изменить что-то одно, потому что другое сломается, и придется менять всю цепочку. Убирая прямые зависимости изменение кода становится проще.

    Второе, это стабильность, лично для меня. Я работаю на TypeScript, и там можно описать интерфейс, сигнатуру функции, и ожидать на входе любые данные, которые его реализуют, и вообще пофигу откуда они, но пока они реализуют интерфейс, всё будет работать стабильно.

    Третье, это понимание с чем ты работаешь. Когда есть интерфейс, ты всегда понимаешь что можно использовать у объекта, что там есть, и какого это типа. Просто очень удобно.

    Ну и самое главное, лично для меня, это то, что мы инженеры, т.е. мы должны проектировать систему, а потом реализовывать, и интерфейс это один из наших "чертежей".

    Ты сначала думаешь как оно будет работать, какие есть данные, потом описываешь это через интерфейсы, и прочее, а потом реализуешь. Поэтому можно считать что интерфейс это один из ключевых строительных блоков архитектуры приложения. Без него сущности будут пытаться дергать нужные им данные от объектов на входе, без понимания можно ли их вообще оттуда дергать, что там вообще реально есть, и в итоге получится хаос.

    Поэтому Ангуляр собственно не причем, это просто фреймворк, а принципы проектирования там те же самые, как и в любом другом приложении.
    Ответ написан
    1 комментарий
  • Плавное переключение изображения при прокрутке. Как реализовать?

    Для таких штук обычно нужна высота изображений и размер контейнера изображений. Считается скролл, расчитывается текущая позиция, и через высоту элементов и размеры контейнера считается какие элементы сейчас должны быть видны. Остальные, соответственно, скрываются.

    С изображениями сложнее, они загружаются не сразу, и могут быть разные размеры, поэтому там нужно еще учитывать динамические размеры изображений.

    Если без хардкода, но не очень красиво, то можно при прокрутке для картинок считать руками видимы ли они (через позицию скролла и положение картинки относительно родительского элемента, например), и скрывать все остальные.
    Ответ написан
    Комментировать