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

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    А что в данном случае form.count ?
    Возможно, тут должно быть ещё что-то, чего нет?
    Ответ написан
    Комментировать
  • Что не так делаю в скрипте JS - ошибка promise, и др.?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Чтобы ошибок не получалось, проверять нужно. Очевидно, по описанию ошибки, что таблицы нет (она is null).

    let table = document.querySelector("body > table > tbody");
    if(table instanceof HTMLTableSectionElement){
        let countDATA = table.rows.length;
    }
    Ответ написан
    2 комментария
  • Как сделать, чтобы при нажатии на кнопку всплывал список?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Когда-то давно, в прошлом веке, я тоже не видел разницы между обработчиком события и слушателем события.

    Event listener — буквально так и переводится: "слушатель события". Т.е., когда мы назначаем элементу путём addEventListener некий обработчик, мы заставляем его слушать и реагировать на некоторое событие, возбуждается чем-то.

    К чему я это… В таких неопределённых ситуациях всегда лучше делегировать слушателя, а иногда без этого просто не обойтись, особенно когда дело касается "мышиной возни" (MouseDown, MouseOver etc). Делегирование слушателя одному из предков, к тому же, имеет ещё одно неоспоримое преимущество: при динамическом изменении DOM, например при загрузке по ajax пресловутых элементов .mobile-categories, не нужно следить за прикреплением им слушателей каждый раз.

    document.body.addEventListener('click', (ev)=>{
        if (ev.target.classList.includes('.mobile-categories')) {
           // Тут что-то делаем с ev.target
        }
    });
    Ответ написан
    Комментировать
  • Как реализовать отслеживание выбора select2?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    У него есть свой триггер select2:select

    $(<некий_селект>).on('select2:select', function(){
        console.log(this.selectedOptions); // HTMLCollection где каждый элемент - HTMLOptionElement, у которого соответствующие атрибуты
    });
    Ответ написан
    Комментировать
  • Почему javascript считает все эелементы?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Слайдерам сделай разные селекторы.
    document.querySelectorAll(".slider1 > div.slide");
    document.querySelectorAll(".slider2 > div.slide");
    document.querySelectorAll(".slider3 > div.slide");
    Ответ написан
  • Как парсить сайты с защитой от парсинга?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Создаётся экземпляр браузера, в него загружается документ, после подгрузки всех ajax-данных берётся весь DOM, и крути его как хочешь.
    Ответ написан
    Комментировать
  • Условие прокрутки всегда возвращает True, как исправить?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    header.scrollTop ничего не покажет, так как это измерение скролла контента блока, то есть того, что скроллится внутри него.

    Используй getBoundingClientRect();
    let bounds = header.getBoundingClientRect();
    // в bounds есть x, y, width, height элемента
    Ответ написан
    Комментировать
  • Как сделать кнопку неактивной при снятии чекбокса?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    я бы какой-нибудь такой монстр собрал:
    var TNextStepButton = /** @class */ (function () {
        function TNextStepButton(options) {
            this.extend(this, options);
            this._element['__obj'] = this;
            this._initCheckboxes();
            this.isChecked();
        }
        Object.defineProperty(TNextStepButton.prototype, "enabled", {
            /**
             * Тут, собственно, производим движения с кнопкой "далее".
             */
            set: function (val) {
                /**
                 * Кстати, у HTMLAnchorElement'а нет в прототипе disabled.
                 * Тут надо выдумывать что-то, или вместо <a> делать <button> 
                 */
                this._element.disabled = !val;
                console.log(val, this._element.disabled);
            },
            enumerable: true,
            configurable: true
        });
        /**
         * После каждого изменения в любом из чекбоксов, проверяем их состояние,
         * результат передаётся в сеттер элемента кнопки.
         */
        TNextStepButton.prototype.isChecked = function () {
            var ret = 0;
            [].map.call(this.inputs, function (_chb) {
                ret = ret | _chb.checked;
            });
            this.enabled = ret;
            return ret;
        };
        /**
         * Инициализация событий чекбоксов
         */
        TNextStepButton.prototype._initCheckboxes = function () {
            var _that = this;
            [].map.call(_that.inputs, function (_chb) {
                var _click = _chb.addEventListener('change', function (ev) {
                    _that.isChecked();
                });
            });
        };
        Object.defineProperty(TNextStepButton.prototype, "inputs", {
            /**
             * Возвращает все чекбоксы из указанного контейнера
             */
            get: function () {
                return document.querySelectorAll(this.inputsContainerSelector + ' input[type="checkbox"]');
            },
            enumerable: true,
            configurable: true
        });
        /**
         * Некоторое подобие extend'а
         */
        TNextStepButton.prototype.extend = function (first, second) {
            for (var id in second) {
                first[id] = second[id];
            }
            return first;
        };
        return TNextStepButton;
    }());
    document.addEventListener('DOMContentLoaded', function () {
        /**
         * По загрузке контента создаём объект у кнопки "далее"
         */
        var button = new TNextStepButton({
            _element: document.getElementById('nextstep'),
            inputsContainerSelector: '.checkboxes',
        });
    });
    Ответ написан
    Комментировать
  • Почему не работает код на JS?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    потому что document.getElementById('staps').onclick назначает слушателя на первый элемент, а остальные остаются мимо. нужно использовать querySelectorAll(), и слушателей назначать в цикле всем найденным.
    Ответ написан
    Комментировать
  • Почему тут true?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Везде так. null, где-то nil - это не false. а объект пустоты.
    Ответ написан
    Комментировать
  • Как к DIV через JS добавить onclick для Яндекс Метрики?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Клик сработает на рекламе, а не на обёртке. Нужно по клику на рекламе искать обёртку. Например, через closest()
    Ответ написан
    Комментировать
  • Как добавить разные цели на один элемент?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Сделай глобальную переменную, в которую при обработке клика по ссылкам внизу или вверху записывай идентификатор гола метрики. Соответственно, в ym вставляй значение этой переменной.
    Ответ написан
    Комментировать
  • Как посчитать кол-во кликов this count?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    for (let i = 0; i < blocks.length; i++) {
    	blocks[i]._clickCnt = 0;
      blocks[i].addEventListener('click', function() {
        var num = parseFloat(blocks[i].innerText, 10);
    
        if (this._clickCnt > 1) {
          this.classList.add('off');
          this.classList.remove('on');
          sum -= num;
          this._clickCnt--;
        } else {
          this.classList.add('on');
          this.classList.remove('off');
          sum += num;
          this._clickCnt++;      
        }
    
        blockResult.innerHTML = sum;
      });
    Ответ написан
    Комментировать
  • Почему то не подключается Яндекс Метрика?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Там у них в новой версии голы отправляются так:
    /**
        @var yandexAnaliticID - ID метрики
        @var id - ID сигнала
    */
    ym(yandexAnaliticID, 'reachGoal', id);
    Ответ написан
  • Как сделать, чтобы отображаемый select'ом текст отличался от текста выбранного option'а?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Нельзя так сделать.
    Разве что сделаешь поверх этого элемента плашечку с абсолютным позиционированием, и будешь туда писать нечто.
    Ответ написан
    Комментировать
  • Как сделать прокручивание внутри div, при навигации по его элементам?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    У каждого элемента есть offsetParent и offsetTop. Кроме того, есть у элемента замечательная функция getBoundingClientRect(). Вот возьми все эти цифры, и подумай как посчитать scroll и положение своего div'а относительно другого div'а.
    Ответ написан
    Комментировать
  • Если на слайдере оставить курсор, то не работает скролл страницы, как починить?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    я бы сказал никак.
    В конце-концов никого же не удивляет, когда над чем-то одно контекстное меню, над чем-то другое. Такова селяви. У всего свои события обрабатываются.
    Ответ написан
  • Как сделать замену части текста при клике на кнопку?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    $('.radio-input').parent().text('текст')
    Ответ написан
    Комментировать
  • Почему некорректно работает цикл?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    Для этого существует :focus в CSS…
    Но в данном случае лучше было делегировать события parent'у:
    <div data-type="my_inputs">
    <input />
    <input />
    …
    <input />
    </div>

    document.querySelector('[aria-inputs="my_inputs"] input').addEventListener('blur', function(){
       this.target.classList.remove(…);
    });

    Ну и прочие события.

    UPD. бл, что понаписал… пятница…

    [].map.call(document.querySelectorAll('[data-type="my_inputs"] input'), function (_input) {
            _input.addEventListener('focus', function (ev) {
    …
            });
            _input.addEventListener('blur', function (ev) {
    …
            });
        });
    Ответ написан
  • Как проверить состояние радиокнопки?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    var RGroup = (function () {
            function RGroup() {
                this.group = document.querySelectorAll('input[type="radio"]');
                var _that = this;
                [].map.call(this.group, function (_el) {
                    _el.addEventListener('change', _el['_change'] = function (ev) {
                        if (this.checked) {
                            this.hasCheck = true;
                            _that.leaveAll(this);
                        }
                    });
                    _el.addEventListener('click', _el['_click'] = function (ev) {
                        if (this.hasCheck) {
                            this.setAttribute('disabled', 'disabled');
                            _that.group.item(0).checked = true;
                        }
                    });
                });
            }
            RGroup.prototype.leaveAll = function (current) {
                [].map.call(this.group, function (_el) {
                    if (_el != current && _el.hasCheck) {
                        _el.hasCheck = false;
                    }
                });
            };
            return RGroup;
        }());
        var rg = new RGroup();


    ну, или посовременней
    spoiler
    class RGroup {
            constructor() {
                this.group = document.querySelectorAll('input[type="radio"]');
                let _that = this;
                [].map.call(this.group, function (_el) {
                    _el.addEventListener('change', _el['_change'] = function (ev) {
                        if (this.checked) {
                            this.hasCheck = true;
                            _that.leaveAll(this);
                        }
                    });
                    _el.addEventListener('click', _el['_click'] = function (ev) {
                        if (this.hasCheck) {
                            this.setAttribute('disabled', 'disabled');
                            _that.group.item(0).checked = true;
                        }
                    });
                });
            }
            leaveAll(current) {
                [].map.call(this.group, function (_el) {
                    if (_el != current && _el.hasCheck) {
                        _el.hasCheck = false;
                    }
                });
            }
        }
        let rg = new RGroup();

    Ответ написан
    Комментировать