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

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вместо document.getElementByClassName("a") должно быть document.getElementsByClassName("a")[0]. Но если таких блоков на странице несколько, то работать этот код корректно не будет. Посмотрите варианты решения вашей задачи здесь.

    А вообще, вы либо трусы наденьте, либо крестик снимите:
    $('span').on('click', function () {
        var $el = $(this),
            targetID = $el.data('target-id'),
            $target = $('#' + targetID);
    
        $target.toggle()
            .next('.a')
            .toggle();
    });
    Ответ написан
    1 комментарий
  • Как передать + или \n через AJAX?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ответ написан
    Комментировать
  • Где ошибка в подсчёте кликов?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    В вашем коде так много ошибок и нелогичностей, что трудно понять, чего вы хотите добиться.
    Вам нужно что-то вроде этого?

    code review
    // $(function(){}) и $(document).ready(function(){}) одно и то же
    // Нет смысла вкладывать их друг в друга
    $(function () {
        $(document).ready(function () {
    
            // Если informer может принимать только значения 0 и 1,
            // гораздо логичнее сделать эту переменную булевой
            var informer = 0;
            
            // Крутые парни ставят точки с запятой в конце выражений
            // Конечно, если не хотят потом ловить баги automatic semicolon insertion по ночам
            var sfId_Start
            var sfId_Target
    
            console.log(informer)
    
            // Зачем у td два обработчика клика?
            $('td').click(function () {
                init()
                    
                ++informer;
                if (informer > 1) {
                    informer = 0
                }
    
    
                //  if (informer === 1 ) {   }
                console.log(informer)
    
            });
    
            function init() {
    
                // Зачем делать анонимную функцию, в которой просто вызывается другая функция?
                $('td').click(function () {
                    getId(this);
                });
    
                // Зачем эта функция сюда вложена?
                function getId(obj) {
    
                    var idsf
                                    
                    // Этот код не имеет смысла
                    // Почему при любом условии в переменную idsf пишется одно и то же значение?
                    if (informer === 0) {
                        idsf = $(obj).attr('id')
                    }
                    
                    // Зачем проверять, что 1 не равно 0?
                    if (informer === 1 && informer !== 0) {
                        idsf = $(obj).attr('id')
                    }
    
                    // Зачем писать одно и то же в обе переменные?
                    sfId_Start = idsf
                    sfId_Target = idsf
                }
            }
        })
    });

    Ответ написан
    Комментировать
  • Аналог BitConverter.ToUInt64 для JavaScript?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ответ написан
    Комментировать
  • Как сделать чтобы выпадающие списки меню отображались снизу вверх?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Такой хорошо документированный код, как на Технопойнте редко встречается, прочитайте его. (Ссылка не всегда открывается, видимо, есть какие-то проверки на источник перехода на стороне сервера. Самостоятельно найти ее в панели разработчика, думаю, не составит труда)
    Если не сможете разобраться, боюсь, ответы здесь вам тоже не помогут.
    Ответ написан
    8 комментариев
  • JQuery: Как добавить класс динамически созданному элементу, если смежное с ним текстовое поле не является пустым?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Корректный код:
    $(".input_has-clear").append("<i class='input__clear'>x</i>");
    
    // Ставим обработчик на событие изменения поля
    $('.input__control').on('change', function () {
        // Находим родительский блок
        $(this).closest('.input_has-clear')
            // в родительском блоке находим нужный элемент
            .find(".input__clear")
            // скрываем или показываем элемент в зависимости от заполненности поля
            // обратите внимание, что toggleClass вторым аргументом принимает чисто булевое значение
            // поэтому при помощи двойного отрицания приводим строку к нему
            // если она пустая - будет false и класс уберется, иначе - добавится
            .toggleClass("input__clear_visible", !!$(this).val());
    });

    jsfiddle.net/koceg/j40vquoo

    В вашем коде очень многое неверно:
    $(function() {
       $(".input_has-clear").append("<i class='input__clear'>");
    
       // 1. Этот код выполнится один раз при загрузке страницы,
       // вам же, наверняка, нужно, чтобы элемент скрывался или показывался
       // динамически по мере редактирования поля
       // 2. .input_has-clear - это span, у него нет value
       if($(".input_has-clear").val() != "") {
          // Логика определения скрытия и показа класса неверная
          // Если повесить на поле обработчик, то при вводе каждой буквы
          // Элемент будет то скрываться, то показываться
          $(this).find(".input__clear").toggleClass("input__clear_visible");
       }
    });


    P.S.
    цикл выполняться не хочет
    В вашем коде нет ни одного цикла.
    Ответ написан
    3 комментария
  • Don't make functions within a loop (как убрать ошибку)?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    function getSomeHtml() {
            return $(this).html();
    }
    
    for (var p = 0, len = number.length; p < len; p++) {
            if (number[p] == 'Свободен') {
                number_js[p] = $('.ofice:eq(' + p + ')>.ofice_number>strong').map(getSomeHtml)[0];
    
                for (var i = 0, len = rsrGroups.length; i < len; i++) {
                    if (number_js[p] == rsrGroups[i].data("room")) {
                        rsrGroups[i].attr('fill', '#F4DA6C');
                    }
                }
            }
        }


    Только функция тут вообще не нужна:
    number_js[p] = $('.ofice:eq(' + p + ')>.ofice_number>strong').first().html();
    Ответ написан
    22 комментария
  • Как отсортировать div элементы?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Может быть можно как то элегантнее решить данную задачу?
    Разумеется, можно. Достаточно понять, что вам нужно не строки таблицы сортировать, а данные. И уже данные потом рендерить.

    Данные должны контролировать DOM, а не наоборот. Такой подход позволит не только существенно ускорить работу приложения (избавляемся от ненужных операций с DOM-элементами), но и сделает код более понятным и расширяемым.

    Для этого можно использовать любой mvvm-фреймворк или написать все самому, если такая таблица одна, функционал ограничивается только сортировкой и по каким-то причинам не хочется использовать готовые инструменты.

    Посмотрите, например, как просто, а главное понятно, ваша задача решается при помощи Backbone. Приложение разделено на слои и разбито на части, каждый слой и каждая часть занимаются своим делом. Само собой, это quick'n'dirty демо, там могут быть ошибки, так что не стоит использовать этот код в продакшене :)
    Ответ написан
    2 комментария
  • Можно простыми словами объяснить принцип работы метода Apply в Java Script?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    methods.init.apply(this, arguments);
    Здесь метод init объекта methods вызывается c переопределенным контекстом this и в него передаются все аргументы, которые были переданы в функцию easyFader.

    Проще, вроде, некуда.
    Ответ написан
    Комментировать
  • Существуют ли сниппеты комментариев для PhpStorm как в SublimeText3?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вводите над определением функции /**, нажимаете Enter - вуаля, DocBlock готов!
    Документация
    Ответ написан
  • Douglas Crockford или Flanagan D для изучения JavaScript?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Все зависит от того, что вы вкладываете в понятие "разобраться". Я бы рекомендовал прочитать учебник Ильи Кантора, скорее всего, этого будет достаточно.
    Ответ написан
    5 комментариев
  • Как понять эту матрицу?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    You may also pass in a matrix while instantiating the PF.Grid class. It will initiate all the nodes in the grid with the same walkability indicated by the matrix. 0 for walkable while 1 for blocked.

    Как обычно, ответ на ваш вопрос находится в документации.

    Эта матрица, по сути - карта вашего поля, где 0 означает, что по клетке можно пройти, а 1 - нельзя.
    Если вам нужно получить информацию о проходимости какой-то конкретной клетки, то это сделать довольно легко:
    matrix [координата Y (номер строки)] [координата X (номер колонки)]
    Ответ написан
    3 комментария
  • Что не так в Javascript?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    document.querySelector("#nav-toggle")
    На странице нет такого элемента, поэтому querySelector возваращает null.
    Об этом в ошибке и написано - у null нет метода addEventListener.
    addEventListener вызывается только в одном месте - правда, разобраться совсем не сложно.

    А вообще, если уж используете jquery, так и используйте на полную катушку:
    if ($(window).width() > 991) {
        $("#nav-toggle").on("click", function() {
            $(this).toggleClass("active");
        });
    }
    Ответ написан
    3 комментария
  • Как можно улучшить код на JQuery?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Я же вам здесь очень подробно ответил.
    Принципы, которые там описаны, применяются одинаково хорошо и для ванильного js и для jquery.

    var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'];
    
    $('#sf tr').each(function () {
        var $cell = $('<td>').append('<a class="add_item">Добавить в корзину</a>');
        
        $(this).append($cell);
    
        $(this).find('td').each(function (index, element) {
            $(element).addClass(classes[index]);
        });    
    });


    Или вот такой вариант, без итерации по строкам:
    var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'],
        $rows = $('#sf tr').filter(':gt(0)'),
        $link = $('<a>').addClass('add_item').text('Добавить в корзину'),
        $cell = $('<td>').append($link),
        $cells;
    
    $rows.append($cell);
    
    $cells = $rows.find('td');
    
    $cells.each(function (index, cell) {
        $(cell).addClass(classes[index % classes.length]);
    });


    Интересные, кстати, получаются результаты сравнения скорости работы этих двух вариантов.
    Ответ написан
    9 комментариев
  • Почему постоянно лезет undefined?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    На сколько я поля это фишка асинхронности !?
    Правильно поняли.

    Это получается нужно код выстраивать цепочкой из калбэков ?
    Необязательно. (для nodejs, понятно, своя специфика, но общие принципы такие же, естественно).
    Ответ написан
    Комментировать
  • Как выполнять функцию по завершении часто повторяющегося события, а не много раз подряд?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Дело в том, что за время вращения колеса мыши, событие mousewheel срабатывает много раз. Соотвественно и обработчик события срабатывает столько же раз.
    Чтобы этого избежать, нужно применить debounce обработчика, то есть сделать так, чтобы он выполнился один раз через n миллисекунд после его последнего вызова. Если с момента последнего вызова не прошло n миллисекунд, а обработчик был вызван еще раз, его выполнение откладывается еще на n миллисекунд.
    В данном случае, обработчик выполнится через 100 миллисекунд после того, как перестанут поступать события скролла (100 - это просто пример, реальное значение нужно подбирать исходя из ситуации):
    $(document).ready(function () {
        var owl = $(".sldr").owlCarousel().data('owlCarousel');
    
        $(window).on('mousewheel', debounce(function (event) {
            var direction = event.originalEvent.deltaY < 0 ? 'next' : 'prev';
            owl[direction]();
        }, 100));   
    });
    Код функции debounce
    function debounce(func, wait, immediate) {
        var timeout, args, context, timestamp, result;
    
        var later = function () {
            var last = new Date().getTime() - timestamp;
    
            if (last < wait && last >= 0) {
                timeout = setTimeout(later, wait - last);
            } else {
                timeout = null;
                if (!immediate) {
                    result = func.apply(context, args);
                    if (!timeout) context = args = null;
                }
            }
        };
    
        return function () {
            context = this;
            args = arguments;
            timestamp = new Date().getTime();
            var callNow = immediate && !timeout;
            if (!timeout) timeout = setTimeout(later, wait);
            if (callNow) {
                result = func.apply(context, args);
                context = args = null;
            }
    
            return result;
        };
    }

    Реализацию функции debounce я беззастенчиво позаимствовал из библиотеки underscore.
    Интерактивный пример
    Ответ написан
    Комментировать
  • Как оптимизировать данный код (открытие/закрытие всплывающих окон)?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    У вас по сути N систем из трех взаимосвязанных элементов.
    Сами системы между собой никак не связаны, а вот элементы внутри системы между собой нужно как-то связать.
    Самый простой вариант - использовать индексы (интерактивный пример):
    var buttons = document.querySelectorAll('.js-btn-item'),
        popups = document.querySelectorAll('.js-products-popup'),
        closers = document.querySelectorAll('.js-btn-close'),
        index, button, popup, closer;
    
    for (index = 0; index < buttons.length; index++) {
        button = buttons[index];
        popup = popups[index];
        closer = closers[index];
    
        button.addEventListener('click', buttonHandler(popup));
        closer.addEventListener('click', closerHandler(popup))
    }
    
    function buttonHandler(popup) {
        return function (event) {
            event.preventDefault();
            popup.classList.add('js-popup-show');
        }
    }
    
    function closerHandler(popup) {
        return function (event) {
            event.preventDefault();
            popup.classList.remove('js-popup-show');
        }
    }

    Объяснение, зачем мы делаем такие сложные обработчики событий из двух вложенных функций, находится здесь. В современных браузерах можно сделать проще, но при этом внутри обработчика события this будет ссылаться уже не на элемент, а на что-то другое (скорее всего, window), но в данном случае это не имеет значения.

    Для того, чтобы этот вариант работал, естественно, элементы каждого типа должны идти в строго одинаковом порядке.
    Чтобы этого избежать, можно использовать родителя-обертку, внутри которого содержатся все 3 элемента системы (пример). Такой подход, помимо всего прочего, за счет делегирования позволяет устанавливать N обработчиков, а не N*2, как в первом случае. Но код обработчика слегка усложняется - добавляется проверка целевого элемента.

    Третий способ показал Алексей Зуев - он более декларативный, как видите, javascript-кода там совсем немного - одна универсальная функция. Но этот вариант требует использования id вместо классов, это не всегда возможно.
    Ответ написан
    Комментировать
  • Подключение/отключение CSS стилей по кнопке, с прямым изменением в файле css?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Как вам уже сказали, это серверная логика, для этого придется написать php-скрипт.
    При нажатии на кнопку отправлять ajax-запрос на этот скрипт (ну или просто переходить на него, а в конце редиректить куда нужно), а в самом скрипте изменять css-файл и перезаписывать его. Проще всего, разумеется, воспользоваться готовыми библиотеками.
    Ответ написан
    1 комментарий