• Как сделать склонение слов в зависимости от числа?

    makarenya
    @makarenya
    программист
    С ГитХаба

    function getNoun(number, one, two, five) {
        let n = Math.abs(number);
        n %= 100;
        if (n >= 5 && n <= 20) {
          return five;
        }
        n %= 10;
        if (n === 1) {
          return one;
        }
        if (n >= 2 && n <= 4) {
          return two;
        }
        return five;
      }


    Используется так:
    alert("4 " + getNoun(4, 'слон', 'слона', 'слонов'));

    Выведет сообщение 4 слона.
    Ответ написан
    1 комментарий
  • Как правильно реализовать модальное подтверждением удаления элементов?

    mizutsune
    @mizutsune
    Frontend Developer
    Не пойму в чем дело, разъясните пожалуйста.


    Действительно, что-то тут не так...

    Немного об оригинальном коде из вопроса...


    Для начала поставьте console.log в определенном месте своего кода:

    document.querySelector('.list').addEventListener('click', (event) => {
      const target = event.target
      if (target.classList.contains('delete')) {
        const task = document.querySelector(`[data-id="${target.dataset.delete}"]`)
        // Посмотрим что будет выводиться в консоль?
        console.log(target.dataset.id)
        deleteTask(task)
      }
    })


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


    Ну, а вообще, если как-то по простому решить проблему + немного подчистить код, то можно сделать например вот так:

    const modal = document.querySelector(".modal");
    const listbox = document.querySelector(".list");
    const modalCancelButton = modal.querySelector(".cancel");
    const modalConfirmButton = modal.querySelector(".confirm");
    
    let currentTaskID = null;
    
    listbox.addEventListener("click", ({ target: t }) => {
      if (t.classList.contains("delete")) {
        currentTaskID = t.dataset.delete;
        modal.classList.remove("hidden");
      }
    });
    
    modalCancelButton.addEventListener("click", () => {
      modal.classList.add("hidden");
      currentTaskID = null;
    });
    
    modalConfirmButton.addEventListener("click", () => {
      modal.classList.add("hidden");
      deleteTask(currentTaskID);
    });
    
    const deleteTask = id => id && listbox.querySelector(`[data-id="${id}"]`).remove();
    Ответ написан
    Комментировать
  • Как правильно реализовать модальное подтверждением удаления элементов?

    SPART4K
    @SPART4K
    Middle Front-end Developer (Vue.js/Nuxt.js)
    Если именно с вашей структурой то вот:
    const modal = document.querySelector('.modal')
    document.querySelector('.list').addEventListener('click', (event) => {
      const target = event.target
      var task = document.querySelector(`[data-id="${target.dataset.delete}"]`)
      if (target.classList.contains('delete')) {
      
      modal.classList.remove('hidden')
      modal.addEventListener('click', (event) => {
        if (event.target.classList.contains('cancel')) {
          modal.classList.add('hidden')
          task = null
          return false
        } else if (event.target.classList.contains('confirm')) {
          modal.classList.add('hidden')
          if (task) {
             task.remove()
          }  
        }
      })
      }
    })




    Но я вам рекомендую изменить логику, потому что вам не нужно слушать каждый клик в этом блоке, а именно кнопки.
    Если по простому, то я бы привязал слушатель на каждый из трех элементов,
    В клике кнопке привязал бы передачу id из data-id и и удалял бы если в модалке нажимаешь на delete
    Так-же на всякий случай подскажу если интерфейс не очень важен - есть нативный метод confir('test'):
    if (confirm('Удалить элемент?') {
     delete()
    }
    Ответ написан
    Комментировать
  • Как правильно реализовать модальное подтверждением удаления элементов?

    @Vladimir-Silenko
    Недавно сталкивался с такой проблемой, и применил следующий костыль:
    при нажатии на кнопку удаления, присваивал айдишник её родителя кнопке модального подтверждения, и удалял через сравнение
    Ответ написан
    Комментировать
  • Как убрать состояние checked?

    @timokins
    document.getElementById('toggle5').checked = false;
    Ответ написан
    1 комментарий
  • Как вернуть Main menu в PhpStorm?

    OlegOleg1980
    @OlegOleg1980 Автор вопроса
    программист
    Решил через Find Action: Ctrl+Shift+A -> вводим в поиск View -> и далее открывается меню.

    5e3569a5ca32f455581814.jpeg
    Ответ написан
    1 комментарий
  • Jquery ui slider - как при изменении значения в input менять положение ползунка?

    Comrues
    @Comrues Автор вопроса
    Решение нашёл!!! Вот - https://codepen.io/Comrues/pen/YzyXaxW
    Ответ написан
    Комментировать
  • Ошибка при установке пакета gulp-sass?

    mmmaaak
    @mmmaaak
    судя по readme от node-gyp с гитхаба:
    On Windows
    Option 1
    Install all the required tools and configurations using Microsoft's windows-build-tools using npm install --global --production windows-build-tools from an elevated PowerShell or CMD.exe (run as Administrator).

    Option 2
    Install tools and configuration manually:

    Install Visual C++ Build Environment: Visual Studio Build Tools (using "Visual C++ build tools" workload) or Visual Studio 2017 Community (using the "Desktop development with C++" workload)
    Install Python 2.7 (v3.x.x is not supported), and run npm config set python python2.7 (or see below for further instructions on specifying the proper Python version and path.)
    Launch cmd, npm config set msvs_version 2017


    а в логах говорится, что он нашел третий питон
    Ответ написан
    4 комментария
  • Ошибка при установке пакета gulp-sass?

    Artem71
    @Artem71 Автор вопроса
    Начинающий верстальщик
    В общем решение такое нужно иметь Node.js последней версии и ввести команду npm install --global windows-build-tools все
    Ответ написан
    Комментировать
  • Не могу запустить сборку через webpack. Что не так?

    @SiegfriedDelap
    Привет! Попробуй в файле package.json в строке "browserslist" оставить только ">1%". В моей ситуации помогло)
    Ответ написан
    2 комментария
  • Табы на js, как правильно?

    Самое первое - отказаться от неоправданного изменения html. Все эти `data-index` - признак плохого кода. Любой блок должен, по возможности, получаться в JS только один раз, записываться в кеш и работать далее с блоком именно как с JS инстансом.

    Второе - разделить глобальное управление и каждый таб в отдельности. Каждый логический блок дожлен быть инстансом класса - тогда значительно легче с этим орудовать и дебажить.

    Третье - изменения html максимально выносим в отдельный метод.

    Ну и вообще - все действия разбить на блоки в виде методов.

    Как разультат:

    const TabItemSelector = '.pageNav__tabItem';
    const ContentItemSelector = '.pageNav__contentItem';
    
    class TabsManager {
      constructor(navNode){
        this.tabs = [];
        this.activeTab = null;
    
        this.initFromHtml(navNode);
        this.activateTab(this.tabs[0]);
      }
    
      initFromHtml (navNode) {
        const headers  = navNode.querySelectorAll(TabItemSelector);
        const contents = navNode.querySelectorAll(ContentItemSelector);
    
        for (var i = 0; i < headers.length; i++) {
            this.registerTab(headers[i], contents[i]);
        }
      }
    
      registerTab (header, content) {
        const tab = new TabItem(header, content);
        tab.onActivate(() => this.activateTab(tab));
        this.tabs.push(tab);
      }
      
      activateTab (tabItem) {
        if (this.activeTab) {
            this.activeTab.setActive(false);
        }
    
        this.activeTab = tabItem;
        this.activeTab.setActive(true);
      }
      
    }
    
    const ActiveTabHeaderClass = 'pageNav__tabItem--active';
    const ActiveTabContentClass = 'pageNav__contentItem--active';
    
    class TabItem {
        constructor (header, content) {
            this.header  = header;
            this.content = content;
        }
        onActivate (action) {
            this.header.addEventListener('click', () => action(this));
        }
        setActive(value) {
            this.header.classList.toggle(ActiveTabHeaderClass, value);
            this.content.classList.toggle(ActiveTabContentClass, value);
        }
    }
    
    document.addEventListener('DOMContentLoaded', ()=>{
      let tabs = new TabsManager(document.querySelector('.pageNav'));
    })


    Самое сомнительное в этом коде - это, конечно, TabsManager.initFromHtml, где создается взаимосвязь между headers и contents (к примеру, что будет если заголовков табов будет больше, чем детей?). Но это получается из-за верстки.
    Ответ написан
  • Выдает ошибку, не могли бы помочь?

    Dante449
    @Dante449
    Изучаю Python
    Решение проблемы:
    Открываем терминал от админа.
    Пишем и запускаем: Set-ExecutionPolicy RemoteSigned

    На вопрос отвечаем: Да (Да для всех)
    Ответ написан
    11 комментариев
  • Как очистить куки у пользователя?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Пример #2 Пример удаления cookie посредством setcookie()

    Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм броузера, удаляющий истекшие cookie.
    php.net/manual/ru/function.setcookie.php
    Ответ написан
    Комментировать
  • Как работать с gulp-file-include?

    @bulkmaker
    Просто вложенность добавьте. /src/html/_includes
    src - готовые файлы
    html - html c вложениями
    _includes - вложения
    Ответ написан
    Комментировать
  • Как работать с gulp-file-include?

    @FoxFka
    На сколько я понимаю - этот плагин не предназначен для автоматической сборки файлов. То есть ваш page.html Вам в любом случае придется сделать вручную, забив в него каркас html-файла. А вот включать в него блоки с разными параметрами как раз можно и нужно при помощи плагина. Для того, чтобы файлы шаблонов блоков не попадали в сборку на мой взгляд лучше всего поступить примерно следующим образом.
    Можно добавлять некий единый префикс для всех файлов блоков. Во-первых это даст возможность привязаться к этому префиксу при настройке task, а во-вторых Вы, вернувшись к работе над проектом через некоторое время быстро сможете отличить файлы шаблонов от блоков.
    Выглядеть это все может так:
    gulp.task('html:build', function() {
     gulp.src('src/[^_]*.html')
    .pipe(fileinclude({
      prefix: '@@',
      basepath: '@file'
    }))
    .pipe(gulp.dest('build/')); 
    });

    Эта задача будет отрабатывать на всех html файлах директории src, имена которых НЕ начинаются с символа "_"
    Далее, чтобы подключить файл блока в ваш шаблон нужно создать его, не забыв добавить "_" в начало. Например "src/_includes/_module.html". Подключить его в обрабатываемый файл src/index.html можно, добавив в нужное место
    @@include('./_includes/_module.html')
    При запуске таски html:build в вашей папке /build появится файл index.html, включающий в себя содержимое файла module.html
    Это базовая схема, которую можно расширять в зависимости от ваших потребностей. Вся инфа для этого есть в документации и примерах.
    Ответ написан
    Комментировать
  • Как сделать такой quiz?

    IlyaDeveloper
    @IlyaDeveloper
    Top Rated | Expert Web Developer
    Да переходы и шаги в принципе можно и на чистом CSS сделать без JS, но конечно есть но, если тебе и логику оплаты нужно делать, то нужно чуть js вкурить, потому что тупо как ты хочешь можешь и не найти(( но похожее надо будет прикручивать под себя!

    А вообще в двух словах что там искать :
    - https://codepen.io/search/pens?q=quiz&page=1&order...
    - https://www.sitepoint.com/simple-javascript-quiz/
    - https://codepen.io/timivey/pen/zxyNrw

    К слову если нету времени учить и прочее, то в чем проблема плати с кем-то из нас договоришься и сделаем или просто иди на фриланс, задача несложная, пару часивов и вуаля))
    Ответ написан
    1 комментарий
  • Как остановить плавающий блок на javascript?

    @AmadeyMinisol
    full stack web-developer
    алгоритм простой:
    1) берем смещение футера относительного левого верхнего угла, на jquery это $(node).offset().top
    2) берем высоту блока который плавает
    3) берем его смещение
    4) к смещению плавающего блока прибавляем его высоту + нужны отступ
    5) смотрим не пересеклись ли они, и если пересеклись, то фиксируем плавающий блок
    Ответ написан
    1 комментарий
  • Как показывать по три блока и скрывать их?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const SHOW_MORE = 3;
    const itemSelector = '.item';
    const hiddenClass = 'd-none';
    const hiddenSelector = `.${hiddenClass}`;
    const $show = $('.show');
    const $hide = $('.hide');
    const $items = $(itemSelector);
    
    function updateButtons() {
      $show.toggleClass(hiddenClass, $items.filter(hiddenSelector).length === 0);
      $hide.toggleClass(hiddenClass, $items.not(hiddenSelector).length === SHOW_MORE);
    }
    
    $show.click(function() {
      $items.filter(hiddenSelector).slice(0, SHOW_MORE).removeClass(hiddenClass);
      updateButtons();
    }).click();
    
    $hide.click(function() {
      $items.slice(SHOW_MORE).addClass(hiddenClass);
      updateButtons();
    });
    Ответ написан
    1 комментарий
  • Как вывести заглушку при ожидании ajax запроса?

    @mletov
    Примерно так:

    1) Создать div: width: 100%, height: 100%, opacity: например, 0.5, position:fixed, display:none, background:Цвет фона
    2) Перед вызовом ajax сделать этому div display:block; (например, по нажатию на кнопке или почему там в сценарии вызывается запрос)
    3) В success колбэке ajax сделать диву display:none

    PS: Внутрь дива разместить анимированный гиф загрузчика, надпись "Page loading..." или что-нибудь еще по своему вкусу
    Ответ написан
    Комментировать