Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как правильно обработать два события мыши?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Правильно - никак. Обрабатываем только движение, а информацию о нажатых кнопках берём из объекта события:

    wrap.on('mousemove', function(e) {
      if (!e.buttons) {
        return;
      }
    
      // здесь ваш код
    });
    Ответ написан
  • Почему не останавливается таймер в плагине?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сейчас у вас checkTimerId и sendTimerId существуют в единственных экземплярах - одни на все элементы, содержащиеся в наборе, на который ссылается this в trackCoords. События, по которым устанавливаются/снимаются интервалы всплывают, а элементы вложены один в другой - так что когда курсор уходит с внешнего элемента на внутренний, то сначала снимаются интервалы внешнего элемента, затем устанавливаются интервалы внутреннего элемента, затем событие mouseover, случившееся на внутреннем элементе достигает внешнего, и там опять устанавливаются интервалы, при этом идентификаторы интервалов внутреннего элемента затираются, после чего снять их уже нельзя.

    Так что, во-первых, элементы надо обрабатывать независимо:

    $.fn.trackCoords = function(options) {
      return this.each(function() {
        const $element = $(this);
        // ...
      });
    };

    Во-вторых, не надо на одних элементах обрабатывать события, которые приходят от других - останавливайте всплытие событий, или проверяйте, откуда пришло событие, сравнивая целевой элемент с тем, к которому прицеплен обработчик:

    $element.mouseover(function(e) {
      if (this !== e.target) {
        // чужое событие - не интересно, не обрабатываем
        return;
      }
     
      // ...
    });

    Кроме того, устанавливать обработчик события mousemove внутри обработчика mouseover - сомнительная затея. При каждом наведении курсора на элемент устанавливается новый обработчик, зачем это? Установите его один раз, там же, где устанавливаются обработчики mouseover/mouseout.
    Ответ написан
    1 комментарий
  • Запретить сортировку внутри sortable jQuery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Можно указать, какие конкретно элементы должны сортироваться. Типа так:

    $('#page_list').sortable({
      items: '> .action-box',
    });
    Ответ написан
  • Почему не могу отправить данные формы через fetch?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Забыли назначить имена элементам формы. Типа, <input name="firstname" ....

    Получать значения из формы надо внутри обработчика события submit, а не до его подключения (конечно, если вам нужны актуальные значения) - разместите строку const formData = new FormData(formElement); после e.preventDefault();.

    Кстати, необязательно обращаться к переменной, ссылающейся на элемент формы, можно воспользоваться объектом события: const formData = new FormData(e.target);.

    А если заменить стрелочную функцию на обычную, то можно и так делать: const formData = new FormData(this);.
    Ответ написан
    2 комментария
  • Почему переменная за пределами обработчика события keyup проверяется через раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Поясните это поведение

    Вы объявили регулярное выражение с модификатором g - то есть, ищутся все совпадения с шаблоном, а не только первое. Вы вызываете метод test - совпадение найдено, круто. Вызываете снова - поиск начинается не с начала, а с того места, где он был окончен в прошлый раз. Разумеется, в этот раз ничего не найдено. Вызываете test в третий раз - снова всё хорошо, потому что в прошлый раз совпадения кончились, поиск снова выполняется с начала строки.

    посоветуйте как вывернуть так, чтобы нормально отрабатывало

    1. Уберите модификатор g.

    2. После каждого вызова test вручную переустанавливайте позицию, с которой надо начинать поиск совпадения с шаблоном: hyper.lastIndex = 0;. Разумеется, этот вариант является говнокодом.
    Ответ написан
    1 комментарий
  • Как заставить работать плагин shuffle.js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Исправлено. Что было не так:

    1. В jsfiddle не генерируется событие DOMContentLoaded, по которому демка инициализируется. (UPD. Исправили эту дичь, неактуально).

    2. У вас была подключена старая версия плагина.
    Ответ написан
    1 комментарий
  • Как вывести элементы массива в select (каждый элемент в отдельный option)?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Получаем select:

    const select = document.querySelector('.table__select');
    
    // или
    
    const [ select ] = document.getElementsByClassName('table__select');

    Добавляем в него option'ы:

    select.innerHTML = arr.map(n => `<option>${n}</option>`).join('');
    
    // или
    
    select.append(...arr.map(n => new Option(n)));
    
    // или
    
    for (const n of arr) {
      select.appendChild(document.createElement('option'));
      select.lastChild.text = n;
    }
    
    // или
    
    for (let i = 0; i < arr.length; i++) {
      const option = document.createElement('option');
      option.textContent = arr[i];
      select.insertAdjacentElement('beforeend', option);
    }
    
    // или
    
    (function next(i) {
      if (i < arr.length) {
        const option = document.createElement('option');
        option.innerText = arr[i];
        select.insertBefore(option, null);
        next(i + 1);
      }
    })(0);

    Похоже на то, что вам надо?
    Ответ написан
  • Как найти минимальное значение многомерного массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const arr = [
      [ 2, 7, 2 ],
      [ 2, 5, 4 ],
      [ 2, 1, 5 ],
      [ 3, 1, 2 ],
    ];
    
    const [ val, iRow, iCol ] = arr
      .map((n, i) => n.reduce((min, m, j) => min[0] <= m ? min : [ m, i, j ], [ Infinity, -1 ]))
      .reduce((min, n) => min[0] <= n[0] ? min : n);

    UPD. Если нужно обрабатывать массивы произвольной размерности, можно применить рекурсию:

    const arr = [
      [ 2, 7, 2, [ 5, [ 4, [ 3 ], 2 ] ] ],
      [ 2, 5, [ 2, 6, 5, 2 ], 4 ],
      [ 2, 1, [ [ [ 9, 0, 1 ], [ [ [ 1 ] ] ], -1 ] ], 5 ],
      [ 3, 1, 2 ],
    ];
    
    const minElemWithIndex = arr =>
      arr.reduce((min, n, i) => {
        const m = n instanceof Array
          ? minElemWithIndex(n)
          : [ n, [] ];
    
        m[1].unshift(i);
    
        return m[0] < min[0] ? m : min;
      }, [ Infinity, [] ]);
    
    
    const [ val, indices ] = minElemWithIndex(arr);
    Ответ написан
    1 комментарий
  • Почему при запросе к APi новой почты вылетает ошибка?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $.ajax({
      type: 'POST',
      dataType: 'json',
      url: 'https://api.novaposhta.ua/v2.0/json/',
      data: JSON.stringify({
        modelName: 'Address',
        calledMethod: 'searchSettlements',
        methodProperties: {
          CityName: 'ки',
          Limit: 555
        },
        apiKey: 'f11a8e14401ddcf710f7195b4ebe358c'
      }),
      headers: {
        'Content-Type': 'application/json'
      },
      xhrFields: {
        withCredentials: false 
      },
      success: function(texts) {
        console.log(texts);
      },
    });
    Ответ написан
    5 комментариев
  • Ion.RangeSlider как передать значение слайдера в текстовое поле?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавить обработчик onChange:

    onChange(data) {
      $('input[name="sum"]').val(data.from);
    }

    И как поступить, если слайдера например два.

    onChange(data) {
      data.input
        .closest('селектор блоков со слайдерами')
        .find('селектор инпутов, в которые надо копировать значения')
        .val(data.from);
    }

    https://jsfiddle.net/k7stn10b/
    Ответ написан
    1 комментарий
  • Где ошибка в этих 5 строчках?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Контекст потеряли. Делайте так:

    setTimeout(() => location.href = this.href, 400);

    Или так:

    setTimeout(function() {
      location.href = this.href;
    }.bind(this), 400);

    Или так:

    setTimeout(function(href) {
      location.href = href;
    }, 400, this.href);
    Ответ написан
    Комментировать
  • Почему не удаляются стили при клике?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что обработчик клика не вызывается. А не вызывается он потому, что прицепить вы его попытались к несуществующему элементу - изначально у .wrap нет класса done, так что результат вызова $('.wrap.done') окажется пустым.

    Можно вешать делегированный обработчик:

    $(document).on('click', '.wrap.done', function() {
      $('.form, .wrap').removeClass('done');
    });

    Или, немного подумав, можно сообразить, что в отсутствие класса done элемент .wrap не виден, кликать некуда, так что неважно, есть класс или нет - можно цеплять обработчик клика просто к .wrap.
    Ответ написан
    Комментировать
  • Как сделать hover при наведение?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Это всё отлично разруливается через css:

    .one:hover + .two,
    .two:hover {
      /* показываем элемент .two */

    UPD. Вынесено из комментариев:

    Вообще класс нужно добавлять.

    Да без проблем - подключайте к .two тот же обработчик ховера, что и к .one:

    $('.one, .two').hover(function() {
      $('.two').toggleClass('show');
    });
    Ответ написан
    1 комментарий
  • Как заменить одинаковые символы в строке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделаем совсем просто - если новое значение совпало с предыдущим, будем добавлять единицу:

    function pasGen(chars, length) {
      let prev = null;
      return Array
        .from({ length }, () => {
          const i = Math.random() * chars.length | 0;
          return chars[prev = (i + (i === prev)) % chars.length];
        })
        .join('');
    }
    Ответ написан
  • Добавить блоку data-ripple="true"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кому и что надо добавить:

    const el = document.querySelector('.fab-button');
    const key = 'ripple';
    const val = 'true';

    Добавляем:

    el.dataset[key] = val;
    
    // или
    
    el.setAttribute(`data-${key}`, val);
    
    // или
    
    const attr = document.createAttribute('data-' + key);
    attr.value = val;
    el.attributes.setNamedItem(attr);
    Ответ написан
    Комментировать
  • Как перезагрузить dataTables?

    0xD34F
    @0xD34F Куратор тега JavaScript
    А почему вы решили, что "обновить вид" означает повторную инициализацию таблицы? Бред же. Удаляйте старые данные (метод clear), добавляйте новые (метод add).
    Ответ написан
  • Как заблокировать submit при нахождении стоп-слов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Цикл не нужен:

    $('.mysubmit').prop('disabled', arr.indexOf(str) !== -1);

    UPD. А-а-а, чёрт возьми - у вас поиск слов по тексту, а не проверка соответствия текста одному из слов... Тогда так:

    $('.mysubmit').prop('disabled', arr.some(n => str.indexOf(n) !== -1));
    Ответ написан
    6 комментариев
  • Как реализовать подставляемый placeholder?

    0xD34F
    @0xD34F Куратор тега JavaScript
    <input placeholder="цена, руб.">

    $('input').on({
      focus() {
        $(this).val((i, v) => v.replace(', руб.', ''));
      },
      blur() {
        $(this).val((i, v) => v && `${v}, руб.`);
      },
    });

    Но может лучше будет этот , руб выводить не в input, а в отдельный элемент рядом?
    Ответ написан
    Комментировать
  • Как удалить класс у элемента при отсутствии определенного дочернего элемента?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кто должен отсутствовать и какой класс надо удалить:

    const childSelector = 'img';
    const className = 'myclass';

    Удаляем:

    $(`.${className}:not(:has(> ${childSelector}))`).removeClass(className);

    или

    document.querySelectorAll(`.${className}`).forEach(n => {
      n.classList.toggle(className, !!n.querySelector(`:scope > ${childSelector}`));
    });

    или

    const elems = document.getElementsByClassName(className);
    for (let i = elems.length; i--;) {
      if (!Array.prototype.some.call(elems[i].children, n => n.matches(childSelector))) {
        elems[i].classList.remove(className);
      }
    }
    Ответ написан
    1 комментарий
  • Почему не работает onload на FileReader?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не работает потому, что вы ничего не загружаете - вы пытаетесь прочитать файл в обработчике onload. Естественно, что ничего не происходит. Делайте так:

    reader.onload = function(e) {
      console.log(this.result);
    };
    reader.readAsText(file);
    Ответ написан