Ответы пользователя по тегу JavaScript
  • Пустая страница, ошибок нет. JS. В чем проблема?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    У автора был нарушен порядок выполнения скриптов.
    Инициализация слайдера происходила раньше отрисовки разметки для слайдера.
    Ответ написан
    6 комментариев
  • Делаю сайт, программа правильная, но выдает ошибку, в чем проблема?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    переменная $site = null.
    такое происходит когда querySelector не нашёл в разметке ничего подходящего.
    Либо опечатка в селекторе, либо элемент, который вы через селектор ищите - подгружается диинамически и позже описанного кода, соответтсвенно, на момент его выполнения в разметке такого элемента нет.
    Ответ написан
    Комментировать
  • Есть ли сейчас необходимость в HTML5Shiv и Modernizr?

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

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Чтобы решить любую задачу нужно начать с разбития её на последовательность простых шагов.
    1) Сделать кнопку
    2) Сделать массив адресов видео
    3) Сделать цикличный счётчик от 0 до длина массива из п2 минус один, т.к. индексация в массивах с нуля.
    4) Всё совместить - доставать урл на видео по индексу-значению счетчика.

    // Кнопка
    const nextvideo = document.getElementById('nextvideo');
    // Видео элемент
    const videoElement = document.getElementById("video");
    // Массив путей
    const vids = [
      "../assets/img/web_1.mp4",
      "../assets/img/web_2.mp4",
      "../assets/img/web_3.mp4"
    ];
    // Счётчик
    let idx = 0;
    // Устанавливаем первый урл как первое видео.
    videoElement.src = vids[0]
    // Совмещаем всё вместе в обработчике клик
    nextvideo.addEventListener('click', function () {
      // Цикличность счётчика:
      // Если следующее значение выходит за длину массива минус 1 (выражено знаком "меньше"), 
      // то обнуляем, в противном случае увеличиваем на 1.
      idx = idx + 1 < vids.length ? idx + 1 : 0; 
      const nextVideoUrl = vids[idx];
      videoElement.src = nextVideoUrl
    })
    Ответ написан
    Комментировать
  • Как написать маску для замены в js?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    "[related_products] text text text [/related_products]".replace(/\[related_products\]\s(.+?)\s\[\/related_products\]/g, '$1') // text text text
    Ответ написан
    Комментировать
  • Как исправить ошибку Uncaught TypeError: Cannot set properties of null (setting 'textContent')?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    const $days = document.querySelector('.timer__days');
    const $hours = document.querySelector('.timer__hours');
    const $minutes = document.querySelector('.timer__minutes');
    const $seconds = document.querySelector('.timer__seconds');

    Одна из этих переменных на момент исполнения кода - null. То есть такого элемента нет в разметке.

    Не знаю как решить.

    Ну для начала стоит научиться читать тексты ошибок и понимать о чём они Вам говорят.
    Эта Вам говорит что не может установить свойство textContent у null. Это уже говорит о многом куда копать.

    А так же нужно научиться отладке своего кода https://learn.javascript.ru/debugging-chrome
    Ответ написан
    Комментировать
  • Почему не обрабатывается первое нажатие на чекбокс?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Так а зачем Вы дважды назначаете обработчик события?

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

    $(document).ready(function() {
        
      let checkbox = "";
    
      function checkbox_add() {
            var isChecked1 = $("#foundation").prop("checked");
            var isChecked2 = $("#drop").prop("checked");
            
            if (isChecked1 && isChecked2) {
              checkbox = "Выбрано два чекбокса";
            } else if (isChecked1) {
              checkbox = "Выбран 1 чекбокс";
            } else if (isChecked2) {
              checkbox = "Выбран 2 чекбокс";
            } else {
              checkbox = "Ничего не выбрано";
            }
    
            console.log(checkbox);
      }
    
      $("#foundation, #drop").on('change', checkbox_add);
    });
    Ответ написан
    2 комментария
  • Почему не работает перевод?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Ну так открываем консоль, читаем ошибку. Думаем.

    google-translate.js:114 Uncaught ReferenceError: TranslateSetCookie is not defined
        at HTMLAnchorElement.<anonymous> (google-translate.js:114:9)
        at HTMLAnchorElement.dispatch (jquery.min.js:2:41772)
        at y.handle (jquery.min.js:2:39791)


    Открываем соответствующий код:
    $('[data-google-lang]').click(function () {
            TranslateSetCookie($(this).attr("data-google-lang"))
            // Перезагружаем страницу
            window.location.reload();
        });


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

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    У Вас нет приращения i в цикле. Всегда ноль снова устанавливается.

    Итого имеем:
    1) цикл у которого начало с нуля.
    2) 0%2 === 0 - true,
    3) потом отрицание, то есть false.
    4) Условие не выполняется.
    5) Цикл уходит на следующую итерацию, где i снова = 0.
    6) Всё уходит работать по кругу. Вкладка браузера умирает.

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

    А когда сделаете прирощение, то, наверное, удивитесь результату, потому что делаете возврат из всей функции, а не из текущей итерации цикла и, как следствие, не будет никакой суммы до числа 10. Будет всегда возвращать 0.
    Ответ написан
  • Почему не работает функция вызванная в addEventListener?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    code должно быть с большой буквы.
    - if (e.keycode === 13) {
    + if (e.keyCode === 13) {


    Тая Зотова учу javascript
    Одно из важнейших, чему стоит научиться в первую очередь - отладка своего кода.
    https://learn.javascript.ru/debugging-chrome
    Ответ написан
    5 комментариев
  • Как скрыть часть текста?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Ответ написан
    Комментировать
  • Как изменять размер элемента при наведении на его край курсора мыши?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    окей яндекс: custom resizable element
    https://habr.com/ru/articles/321612/
    Ответ написан
    5 комментариев
  • Что делать, если много условностей? ?? :: :, и как правильно его читать? Можно ли ссылку на статью какую нибудь?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Ответ написан
    Комментировать
  • Читаются все Alert ы в JS подряд?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Вы присваиваете внутри условия, а не сравниваете.
    Сравнивают двойным или тройным знаком равенства.

    Операция присвоения возвращает то, что присваивается. В обоих случаях у Вас это не пустая строка, что внутри условия интерпретируется как истина.
    Так как это два последовательных if, не знающих друг о друге и не имеющих return внутри себя, то получаем:
    1. если истина, то + 10.
    2. если истина, то +5
    2.1 иначе упс
    Ответ написан
    6 комментариев
  • Как сделать замену под конкретный класс css, а не общий поиск?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Ну логично что нужно делать проверку. Насколько я понял вопрос, Вам нужно сделать так:
    function onEntry(entry) {
      entry.forEach(change => {
        const element = change.target
        if (change.isIntersecting) {
          const isCardEffect = element.classList.contains('card-effect-off')
          const isImage = element.classList.contains('image')
          if (isCardEffect) {
            element.classList.add('card-effect-on');
          }
          if (isImage) {
            element.classList.add('image-effect-on');
          }
        }
        else {
          element.classList.remove('card-effect-on');
          element.classList.remove('image-effect-on');
        }
      });
    }
    Ответ написан
  • Странное поведение скрипта js?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    у вас и во втором случае выводится не 2 ***, а 1 *** 2 ***.
    вы добавляете обработчик на каждый раз, а не переопределяете его. вот они и срабатывают все. сначала только 1 обработчик клика, потом 2, потом 3.
    Ответ написан
    9 комментариев
  • Как вызвать функцию с "именованными аргументами" в JS?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    В целом - ответ "никак". Потому что так делать не надо. Это не очевидно. Код с душком.

    Но если очень хочется, то такие варианты:
    1) Нормальный вариант (даже без душка):
    func(1, undefined, undefined, 2)
    2) Нормальный вариант - объявлять не переменные, а объект на вход c деструктуризацией его свойств:
    function func({ a, b, c, d }) {
      return a+d
    }
    func({ a: 1, d: 2 });

    То есть это сокращённый вариант от такого:
    function func(data) {
      return data.a+data.d
    }
    func({ a: 1, d: 2 });

    3) Грязный вариант - создать новую функцию с забинжеными аргументами:
    function func(a,b,c,d) { return a+d }
    var badFunc = (a,d) => func.bind(null, a, undefined, undefined, d)();
    badFunc(1,2)
    Ответ написан
    4 комментария
  • Почему forEach выдает разные результаты?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    если коротко и не совсем корректно, то
    a++ это a = a + 1
    a+1 это ничего. Потому что нет присваивания.

    P.s. не совсем корректно потому что
    a++ не то же самое что a = a+1, потому что a++ вернёт текущее значение а потом его инкрементирует:
    var a = 1;
    console.log(a++) // 1
    // тут же ещё раз выводим а без инкремента\сложения
    console.log(a) // 2
    a = a +1
    console.log(a) // 3
    Ответ написан
    2 комментария
  • Раскрытие карточки товара при наведении?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Tereverda,
    Сделал простой код ниже, но тогда увеличивается длина страницы - все съезжает вниз.
    Как сделать, чтобы исчезающий блок накладывается как бы на контент и был выше?

    Знаете что такое поток в вёрстке?
    Как убрать элемент из потока?
    Вот это и нужно сделать.

    Причём я же Вам сказал что нужно сделать, зачем Вы полезли в display?
    Накидал демку:
    Ответ написан