• Как можно сделать перенос строк?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    word-break: break-word;

    в прошлой теме я думал что можно заменить пробелы через javascript, но такой способ работает только на визуйльной части а не в исходнике

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

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    После этого и срабатывает этот блок success. где отрисовывается новый блок.

    document.getElementById('client-personal-note-container').innerHTML += appendNotemakrup;

    Нет, это НЕ добавление нового элемента.
    Это чтение разметки КАК СТРОКИ, добавление к этой СТРОКЕ новой СТРОКИ и потом преобразование под капотом в DOM элементы. Понимаете?

    То есть все элементы что у Вас были - умирают и заменяются НОВЫМИ. Без добавленных на них ранее обработчиков.

    Как исправить?
    Основных пути 2:
    1) Научиться именно добавлять элементы https://learn.javascript.ru/modifying-document
    2) Освоить делигирование событий https://learn.javascript.ru/event-delegation
    Ответ написан
    1 комментарий
  • Почему каждый раз выдаёт undefined?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Вас совершенно не смущает что alert Вы делаете на первой строчке в функции example, а инициализацию переменной на 13ой?

    Тело функции выполняется каждый раз заново.
    Чтобы сработало так как Вы хотите, нужно определить переменную ВНЕ функции и убрать var для buffer внутри функции. (но для первого раза всё равно будет undefined, хотя если вне функции инициализировать переменную так же как и внутри функции, через querySelector().innerHTML, то будет ок).

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

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    На примере этого участка:
    select.addEventListener('change', function () {  
      formValidation(form);
      console.log(errors);
      ine.innerHTML = errors;
    });

    Так Вы никуда значение и не присваиваете, которое возвращает функция formValidation.
    console.log(errors) - errors не существует в данной области видимости. Функции возвращают значение, которое хранится в переменной, а не переменную с её названием в область видимости, где функция была вызвана.

    Таким образом:
    select.addEventListener('change', function () {  
      const errors = formValidation(form);
      console.log(errors);
      ine.innerHTML = errors;
    });
    Ответ написан
    1 комментарий
  • Почему игнорируется условие if?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    1. Если что-то не работает как задумано, первое что нужно сделать это открыть инструменты разработчика на вкладке console и посмотреть нет ли там никаких ошибок. Если есть то загуглить их и посмотреть где они возникают. Попытаться осознать и исправить. А ещё лучше научиться отладке собственного кода https://learn.javascript.ru/debugging-chrome
    2. Перед тем как пользоваться тем или иным способом объявления переменных (var\let\const) стоит почитать про него и ознакомиться с нюансами.
    https://medium.com/nuances-of-programming/%D0%B2-%...

    А именно:
    if (parseInt(number.innerHTML) == 0){
      let step = 3;
      } else {
      let step = parseInt(number.innerHTML) - 1;
      }

    Переменной step не существует вне фигурных скобок, соответственно, ниже, где Вы пытаетесь засунуть step как innerHTML - возникает ошибка, что step не определена.
    Ответ написан
    2 комментария
  • Сделать область регистрации касания "шире" без изменения параметров самого элемента?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Псевдоселекторы псевдоэлементы типа :before

    Но тут ещё стоит учесть ситуацию, когда 2 элемента окажутся рядом друг с другом. Что тогда? Ну, очевидно, один из них будет пеекрывать другой по z-index. Но вероятность что это будет не тот что нужно - высока. В итоге пользоватею нужно будет сначала убрать перекрывающий элемент, поправить целевой, вернуть обратно перекрывающий, а если их несколько?

    Поэтому варианта я вижу 3 и их лучше всего совместить:
    1) Расширить зону через псевдо
    2) Делать выбор элемента по тапу. То есть тапнул на элемент, он выделился - и потом с ним взаимодействуетшь. Если нессколько элементов лежат друг под другом, то выбирать последовательно на каждый тап следующий элемент. Первый тап выбирает самый верхний, второй тап выбирает лежаший под и так далее.
    Найти все элементы в координатах тапа поможет метод https://developer.mozilla.org/en-US/docs/Web/API/D...
    3) Сделать условный select в котором можно будет выбрать нужный элемент. В идеале - если каждый элемент будет как-то уникально промаркрован.

    Ну и ещё можно дать возможность зумить чтобы элементы становились больше, что облегчит взаимодействие с ними
    Ответ написан
    Комментировать
  • Можно как-то в css убрать определенные стили, если присутствуют другие?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    /* Правило для li, у которых атрибут style НЕ содержит подстроки list-style-type */
    li:not([style*="list-style-type"]) {
      /* свои стили */
    }
    Ответ написан
    1 комментарий
  • Почему выбор кастомного чекбокса работает только по клику на label?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    как добиться "выбора" чекбокса при клике на span visible-checkbox

    Либо и span и input должны лежать внутри label, либо только через js.
    Ну или хотя бы span внутри label
    И селектор тогда надо будет не забыть поменять.
    Ответ написан
    1 комментарий
  • Как получить новый объект с посчитанными суммами?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    const out = items.reduce((acc, {id, price}) => {
      const key = obj[id]
      if (key) { // проверяем что элемент с таким id нас вообще интересует
        if (acc[key]) { // если он встречался ранее, то добавляем к текущему значению
          acc[key] += price
        } else { // иначе запоминаем с текущей ценой
          acc[key] = price
        }
        acc.total += price // и всегда добавляем к total
      }
      return acc
    }, { total: 0 })
    Ответ написан
    Комментировать
  • Как заставить элемент не рендериться на сервере, но рендериться на клиенте?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    Ответ написан
    Комментировать
  • Почему touch slider (не плагин) не работает когда я открываю консоль?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    а с чего Вы решили, что у Вас touch слайдер? Где хоть один обработчик события touch*...?
    Вижу только обработчики mouse* события.

    В эмуляции девайса как раз включается эмуляция тача.

    UPD: fix на скорую руку. Стоит конечно же вынести функции отдельно, чтобы не дублировать.
    fix

    let slider = document.querySelector('.container-3_1');
    let innerSlider = document.querySelector('.container-3-1_blocks');
    
    
    let pressed = false;
    let startx;
    let x;
    
    slider.addEventListener('mousedown', (e)=> {
        pressed = true;
        startx = e.offsetX- innerSlider.offsetLeft;
        slider.style.cursor = 'grabbing'
    })
    
    slider.addEventListener('touchstart', (e)=> {
        pressed = true;
        const evt = e.touches[0]
        startx = evt.clientX- innerSlider.offsetLeft;
        slider.style.cursor = 'grabbing'
    })
    
    slider.addEventListener('mouseenter', ()=> {
        slider.style.cursor = 'grab'
    })
    
    slider.addEventListener('mouseup', ()=> {
        pressed = false;
        slider.style.cursor = 'grab'
    })
    
    slider.addEventListener('touchend', ()=> {
        pressed = false;
        slider.style.cursor = 'grab'
    })
    
    
    slider.addEventListener('mousemove', (e)=> {
        if(!pressed) return;
        e.preventDefault();
    
        x = e.offsetX;
    
        innerSlider.style.left = `${x - startx}px`
        
    
        checkboundary()
    })
    
    slider.addEventListener('touchmove', (e)=> {
        if(!pressed) return;
        e.preventDefault();
    
        const evt = e.touches[0]
        x = evt.clientX;
    
        innerSlider.style.left = `${x - startx}px`
        
    
        checkboundary()
    })
    
    
    function checkboundary(){
        let outer = slider.getBoundingClientRect();
        let inner = innerSlider.getBoundingClientRect();
    
        if(parseInt(innerSlider.style.left) > 0) {
            innerSlider.style.left = '0px'
        } else if (inner.right < outer.right){
            innerSlider.style.left = `-${inner.width - outer.width}px`
        }
    }

    Ответ написан
    Комментировать
  • Как Кинопоиск делает черный квадрат в захвате экрана?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Судя по всему - они это делают на основе DRM.
    Первый ответ на СО содержит ссылку на статью про это где есть демка, где работает точно так же.
    Ответ написан
    7 комментариев
  • Как по БЭМ правильно прописать классы в данном случае?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    недостаточно информации, но, предположим, что внешний див у вас сетка, внутренние - элементы, и тогда ответ такой:

    1) Если предположение верно, то в сетке вообще о постерах ничего не должно быть. Должно быть что-то типа просто <div class="grid"> или с модификатором, говорящем о двух колонках: <div class="grid grid_col_2">. Ну на худой конец <div class="grid grid_type_posters"> если это какая то уникальная сетка не повторяющаяся в рамках проекта никогда и нигде.
    2) Нижнее подчёркивание или тире - это на Ваш выбор, что использовать для разделения слов. Просто тогда нужно использовать разные разделители для сущностей, чтобы не пересекались с разделителем слов.
    По классической версии нижнее подчёркивание используется для разделения модификатора.
    3) Зачем Вам слово -item тоже не ясно.

    итого:
    <div class="grid">
        <div class="poster"></div>
        <div class="poster"></div>
    </div>
    Ответ написан
    Комментировать
  • Как сделать таблицу с горизонтальной прокруткой и фиксированным левым столбцом?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    Вы хотя бы пытались гуглить?
    Меньше минуты - https://codepen.io/nicolaserny/pen/zYEqgVv
    Ответ написан
    Комментировать
  • Как исправить ошибку $(...).X is not a function?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Скорее всего код, где выбрасывается ошибка - либо не корректный, либо преждевременный.
    Попробуйте закомментировать его и проверить.
    Ответ написан
    1 комментарий
  • Почему функция возвращает массив с теме же данными?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Потому что Вы не прочитали документацию по методу.

    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Возвращаемое значение
    Массив, содержащий удалённые элементы.


    Соответственно, return [].splice() возвращает массив из элементов, которые были удалены.
    А ещё метод - деструктивный. То есть меняет исходные данные. arrayTaskOne, объявленный вне функции, изменился, а это не хорошо.
    Почему не хорошо? Гуглите по теме: чистые функции, сайд эффект
    Ответ написан
    Комментировать
  • Как правильно дробить на компоненты?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    1) "читсые" компоненты не обязательно про ui.
    2) олдскульное разделение на containers и components. containers - "умные", они же "сложные" компоненты.

    https://habr.com/ru/company/ruvds/blog/446206/

    p.s. не существует "правильно". Нет единственно верного пути.
    Ответ написан
    Комментировать
  • Почему код при клике выполняется 2 раза?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Скорее всего потому, что у Вас инпут лежит внутри label.
    Если в таком случае вешать обработчик на label то будет двойное срабатывание.
    Можно повесить на сам инпут, либо связать лэйбл с инпутом через for
    Ответ написан
    4 комментария
  • Как сделать кнопку в фиксированном положении внизу экрана до момента скролла до ее реального нахождения внизу блока?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    .btn {
      position: sticky;
      bottom: 10px
    }


    Но так кнопка будет прокручиваться только в рамках своего родителя.

    Иначе на js.
    Гуглите то же самое.
    sticky.js
    Ответ написан
    Комментировать
  • Как JS понял, что нужно поменять именно исходный массив?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Так как тут отсутствуют ключевые слова для объявления переменных, типа let\const, то элементы внутри деструктуризации начинают работать как переменные текущего окружения.
    То есть [array[j], array[j+1]] = [array[j+1], array[j]]; разворачивается в
    array[j] = array[j+1]
    array[j+1] = array[j]

    как Js понял, что нужно поменять именно в массиве arr числа местами.

    Ну а так как array это ссылка на arr, вот и поменял.
    Ответ написан