Ответы пользователя по тегу JavaScript
  • Как повторно вызвать скрипт (ready()), которые подгружается динамически?

    @sergiodev
    По-моему тут три варианта:

    1. Переписать код загрузки скрипта так, чтобы при повторном нажатии на кнопку он не загружался опять
    2. Удалить проблемные блоки из документа и пересоздать их
    3. Перезагрузить страницу
    Ответ написан
  • Как перевести время в moment в локальное?

    @sergiodev
    Нужно передать часовой пояс как 3-й аргумент после формата, тогда должно заработать. Согласно документации на сайте moment.js:

    var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto");


    Не забудьте подключить модуль moment-timezone.
    Ответ написан
    Комментировать
  • Как добавить в конец таблицы несколько записей?

    @sergiodev
    Проще всего было бы создать шаблон строки с нужными вам ячейками, а потом его просто добавлять в таблицу, заполняя где надо пробелы. Советую погуглить Mustache / Handlebars.

    Пример шаблона:

    <tr>
        <input type="hidden" value="{{sysid}}" class="sysid">
        <td>
            <p class="bold">{{personName}}</p>
            <p class="bold">{{personAddress}}</p>
        </td>
    </tr>


    Потом просто вызываете Mustache вот так:

    Mustache.render(templateHtmlString, {
        sysid: 456,
        personName: 'John Doe',
        personAddress: '123 Main St',
    });


    Другой вариант - использовать frontend-фреймворк аля React / Vue / Angular.

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

    Как вариант ещё можно реализовать API на стороне PHP, которое возвращало бы HTML для новых строчек. Некоторые так делают (или раньше делали).
    Ответ написан
    Комментировать
  • Как реализовать динамическое добавление в массив?

    @sergiodev
    const allServers = [1, 2, 3];
    const servers = [];
    const savedUser_serverId = saved_user[0].server_id;
    servers.push(savedUser_serverId);
    servers.push(...allServers.filter(s => s != savedUser_serverId));
    Ответ написан
    Комментировать
  • Как лучше использовать removeEventListener?

    @sergiodev
    По-моему у вас некорректно удаляются listener-ы, т.к. вы связывая метод с this через вызов this.onButtonGarageNext.bind(this) вы тем самым создаёте новую функцию, а в removeEventListener() вы передаете сам метод onButtonGarageNext. Получается, что ничего не удалится, т.к. такая функция не навешана не событие click и listener не найдётся при удалении.

    Нужно где-то запомнить функцию, возвращаемую из bind() и потом передавать её в removeEventListener().

    Насчёт повторяющегося кода - я бы записал ссылки на элементы .top-menu, #btn-garage-next, #btn-garage-prev в какое-нибудь поле класса при инициализации, и потом их переиспользовал в removeListeners(), например:

    this.menuBbtn = document.querySelector('.top-menu');
    this.btnGarageNext = document.querySelector('#btn-garage-next');
    this.btnGaragePrev = document.querySelector('#btn-garage-prev');


    Если вы используете React, то там для этого есть специальный атрибут ref - https://ru.reactjs.org/docs/refs-and-the-dom.html
    Ответ написан
    1 комментарий
  • JS как правильно пройтись по элементам по ссылкам и если сссылка совпадает с get добавить ему класс?

    @sergiodev
    Надо заменить

    (this).parentNode.addClass("navigation-list__item_active");


    на

    $(this).parent().addClass("navigation-list__item_active");


    а еще лучше на вот это (так надёжнее, на случай если структура navigation-list__item изменится):

    $(this).closest(".navigation-list__item").addClass("navigation-list__item_active");


    parentNode - это свойство DOM-элементов, в jQuery аналогичный метод - это parent()
    Ответ написан
    1 комментарий
  • Как сформировать массив только тех полей, которые изменились, чтобы потом их отправить?

    @sergiodev
    По-моему надо запомнить начальное состояние (при загрузке страницы), потом при отправке формы пройтись по всем строчкам таблицы и проверить, совпадает ли значение с изначальным. Если нет - добавить соотв. запись в массив.

    Что-то вроде такого:

    var initialState = serialize();
    
    function serialize() {
        var data = [];
        var rows = myTable.rows;
    
        for (var i = 1; i < rows.length; i++) {
            var row = rows[i];
            var id = row.cells[0].textContent;
            var info = row.cells[2].firstChild.value;
            var status = row.cells[3].firstChild.value;
            data.push({
                id: id,
                info: info,
                status: status
            });
        }
    
        return data;
    }
    
    function onSubmit() {
        var data = [];
        var currentState = serialize();
    
        for (var i = 0; i < currentState.length; i++) {
            var entry = currentState[i];
            var oldEntry = initialState.find(e => e.id == entry.id);
            if (oldEntry.state != entry.state || oldEntry.info != entry.info) {
                data.push(entry);
            }
        }
    
        // отправить реквест с данными из data
    }
    Ответ написан
  • Почему webpack отталкивается от папки css, а не от src, при импорте стилей?

    @sergiodev
    Потому что путь начинается на ./ поэтому он и ищет относительно текущей директории, т.е директории текущего файла, коей является css

    Советую поменять ./src/img на src/img или ../img
    Ответ написан
    Комментировать
  • Как сделать общий рандом для всех юзеров?

    @sergiodev
    нужно генерировать число на стороне сервера и посылать его всем (через API какое-нибудь или WebSocket)
    Ответ написан
    Комментировать
  • Как переключать классы у нескольких кнопок сразу?

    @sergiodev
    Как вариант можно добавить внутрь каждой кнопки иконку .feather-close, скрытую по умолчанию, и по клику на кнопку показывать эту иконку и скрывать изначальную иконку:



    <!-- HTML -->
    
    <div class="header__button">
        <button class="btn header__basket_btn">
            <i class="icon feather-shopping"></i>
            <i class="close-icon feather-close"></i>
        </button>
        <button class="btn header__search_btn">
            <i class="icon feather-search"></i>
            <i class="close-icon feather-close"></i>
        </button>
        <button class="btn header__user_btn">
            <i class="icon feather-user"></i>
            <i class="close-icon feather-close"></i>
        </button>
    </div>


    /* CSS */
    
    .header__button .btn .close-icon {
        display: none;
    }
    .header__button .btn.close .icon {
        display: none;
    }
    .header__button .btn.close .close-icon {
        display: inline;
    }


    // JavaScript
    
    $('.header__button .btn').click(function() {
        $(this).toggleClass('close');
    });
    Ответ написан
    Комментировать