• Как назначить событие при изменении класса элемента?

    @iShatokhin
    JS developer
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            var newVal = $(mutation.target).prop(mutation.attributeName);
            if (mutation.attributeName === "class") {
                // если зашли сюда, значит класс сменился на значение из newVal
            }
        });
    });
    
    observer.observe(document.body, { // заменяем document.body на нужный нам элемент
        attributes: true
    });
    Ответ написан
    Комментировать
  • Как можно отслеживать передвижения (велосипеда) получая данные, показывать на карте в реальном времени?

    arxont
    @arxont
    C# программист
    Сама по себе реализация не очень сложная - с некоторой периодичностью отправлять на сервер GPS координаты, привязывать их к карте и соединять. Но дьявол кроется в деталях -
    а) GPS не всегда точные координаты отдаёт, поэтому нужно сглаживание, а это достаточно сложный алгоритм
    б) Если будет кейс, что движение в лесу к примеру, то нужно кэширование до выхода в зону действия сотовой связи.
    Ответ написан
    2 комментария
  • Как можно отслеживать передвижения (велосипеда) получая данные, показывать на карте в реальном времени?

    @iShatokhin
    JS developer
    Можно.

    Со стороны велосипеда: устройство должно посылать координаты в виде бинарного UPD пакета через интернет на открытый порт сервера через промежуток времени (обычно раз в секунду), а тот парсить пакет, проверять на ошибки (как минимум CRC) и регистрировать (запоминать как минимум последнюю).

    Со стороны браузера: открываем webSocket или дергаем ajax (обычно раз в секунду) к web части сервера и получаем координаты велосипеда в реальном времени. Координаты отрисовываем на Gmaps/Ymaps/OSmaps. Все.

    Ivan Arxont правильно описал нюансы погрешностей и потери связи.
    Ответ написан
    Комментировать
  • Какой способ шифрования данных использовать на клиенте (javascript)?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    UPD: предложен более православный способ. ВНИМАНИЕ: все принципы безопасности нарушены в приведённом примере, дабы упростить схему донельзя.

    Более православный способ, по совету Андрей :
    1. При регистрации пользователя и при каждом логине генерим пару ключей из пароля для ассиметричного шифрования (pub, priv), по заданному алгоритму. Таким образом даже при смене браузера мы снова получаем тот же pub и priv из пароля. При этом, владелец сервера имеет только pub для аутентификации пользователя (просто сравнивая два публичных ключа на сервере и на клиенте) и для шифрования, из него невозможно получить priv.
    2. Далее, всю инфу шифруем (хоть на клиенте, хоть на сервере) с помощью pub и расшифровываем на клиенте с помощью priv.
    Ответ написан
  • Как в JavaScript первым обработать event?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Можно.
    В JS эвенты находятся в двух состояниях - capturing и bubbling. Capturing - это первая фаза, когда эвент "углубляется" от корня DOM дерева (< body >) до своего target (элемента, на котором эвент сгенерирован), при этом все хендлеры, забинденные на любой из элементов на этом пути отработают (забиндены должны быть именно на фазу capture). Как только эвент дошёл до цели (< form >, например, если submit event), он меняет фазу на Bubbling. Bubbling - это наоборот, всплытие эвента вверх по дереву к корню DOM (от < form > до < body >). И снова эвент запускает все хендлеры, которые его слушают, только уже на фазе bubbling-a. К слову. в jQuery все эвенты работают только с фазой bubbling. Да и вообще у всей этой системы, как обычно, куча нюансов на разных браузерах, кому интересно - www.quirksmode.org/js/events_order.html

    В вашем случае, если хотите, чтобы ваш хендлер отработал раньше всех, этого можно достичь, забиндившись на фазу capture.
    Например:
    jQuery(form).parent().get(0).addEventListener('submit', submit_handler, true);
    // true в третьем параметре как раз и говорит, что бинд на фазе capture, а не bubble

    Для пущей уверенности, можно забиндиться не на элемент, а на его родителя (как в моём примере), при этом сверяя target у эвента, что он точно предназначен нужному вам элементу. Это не гарантирует, что вы отработаете первым, ведь какой-нибудь хитрый засранец мог поставить бинд аж на сам < body > на фазе capture, но ситуация крайне редкая, плюс никакие JS библиотеки не работают с capture фазой.
    Ответ написан
    6 комментариев
  • Как сделать "волосатый шарик" на css3/js?

    @GreatRash
    Туториал под XNA. И его реализация под WebGL, используется three.js.
    Ещё один вариант с Shadertoy.
    Ответ написан
    Комментировать
  • Стоит ли проверять имеил на валидность?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Где-то прочитал, что лучшая валидация - отправить письмо)
    Ответ написан
    Комментировать
  • Кто должен писать юнит-тесты?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Есть много разных автоматизированных тестов.

    Юнит-тесты пишет разработчик (в идеале — тот же самый, который пишет код, покрытый этими тестами, и ДО написания кода). Юнит-тесты помогают удостовериться, что каждый отдельный кусок (поэтому — unit) в программе по отдельности работает корректно. Имея на руках рабочие юнит-тесты, можно спокойно делать рефакторинг.

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

    Приемочные тесты помогают удостовериться, что программа соответстует требованиям, заложенным в ТЗ/диздок.
    Регрессионные тесты — что после последнего обновления ничего не сломалось. Эти два последних делают тестеры, с помощью различных тулзов — для веба, например, это Selenium.

    Все эти тесты, в идеале, запускаются на каждый коммит на специальном Continuos Integration сервере, и если программист «опять накодил в углу», ему приходит письмо, что его код не прошел такой-то тест и это надо починить.
    Ответ написан
    Комментировать
  • Кто должен писать юнит-тесты?

    dizballanze
    @dizballanze
    Software developer at Yandex
    Именно ЮНИТ тесты должен писать разработчик, тестировщик просто не сможет грамотно написать тесты для какого-то класса, написать моки и тд.
    Функциональные тесты может и тестировщик писать и разработчик.
    Ответ написан
    Комментировать
  • Что происходит когда вызываешь Object.apply(this ) в конструкторе "класса"?

    Думаю, этот код выдран откуда-то вами, но могу предположить вот что. Есть у вас обычный "класс".

    var X = function() { }
    X.prototype = {}

    Инициализировать вы его будете вот так: var x = new X(arg1, arg2, arg3, ...), что не всегда удобно. Можно, например, вот так: var x = make(X, [arg1, arg2, arg3]).

    Для этого можно сделать обертку:

    var make = function(maker, args) {
        var X = function() {
            maker.apply(this, args);
        }
        X.prototype = maker.prototype;
        return new X();
    }
    Ответ написан
    Комментировать
  • Почему не работают псевдоэлементы у тега input?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Это не работает потому, что у тега input нет контента. А псевдоэлементы вставляются до или после контента. Нет контента - нет псевдоэлементов.
    Ответ написан
    7 комментариев
  • JS router без хеша?

    @IceJOKER
    Web/Android developer
    js history api
    Ответ написан
    Комментировать
  • Как открыть консоль хрома в новом окне?

    shpaker
    @shpaker
    Вольный хлебопашец
    Так же как и раньше. Зажимаем ЛКМ на кнопе смены положения и выбираем нужный режим. Хром 42 под Виндой.
    Ответ написан
    Комментировать
  • Корректно ли брать деньги с заказчика за рендер при часовой оплате?

    vaux
    @vaux
    Курящий лыжник
    Посмотрите расценки на сайтах рендер-ферм. На ребусфарм, например, самый большой ценник - 2,6 р. за ГГц/ч. Потом посчитайте аналогичную стоимость рендеринга на вашей машине. Вы, конечно, можете время работы компьютера считать по вашей ставке, но это получится очень много. Как вы это заказчику обоснуете, если он будет в курсе про рендер-фермы? На счет за электричество такую сумму не спишешь.

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

    @iShatokhin
    JS developer
    Да, можно. Вот пример одновременного общения с двумя абсолютно разными серверами.

    4a74119601a54517abb1b2eb46f9d8bd.png
    Ответ написан
    3 комментария
  • Почему в функцию переданы странные параметры объекта?

    @iShatokhin
    JS developer
    По ссылке в учебнике описана работа Array#sort.
    colaA и colaB это аргументы функции сортировки (и равны они паре элементов массива для сравнения в соответствующей итерации), таков синтаксис сортировки в JS.
    Ответ написан
    1 комментарий
  • Можно ли сократить функцию в плагине?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Слушайте, ну тут уже просто на здравом смысле можно выехать - jsfiddle.net/94vgumkr/5
    Чуть сложнее в реализации, но проще в использовании - jsfiddle.net/94vgumkr/6
    Ответ написан
    Комментировать
  • Где правильнее проверять пользовательские данные? В контроллере или модели?

    IvanCher
    @IvanCher
    Мысли шире
    За работу с данными должна отвечать модель. Именно модель должна знать какие данные допустимы, а какие нет, потому что на ней лежит функция обработки/записи этих самых данных.
    У контролера цель - обрабатывать пользовательские запросы и решать, как на них ответить.
    Иными словами, вы принимаете данные с формы контролером и говорите модели сказать валидные ли данные пришли. Модель отвечает контролеру, контролер принимает решение, как на это ответить пользователю (ошибкой, каким-то конкретным представлением и т.п.).
    UPDATE
    MVC советую всем прочесть, прежде, чем давать странные советы. Особенно внимательно прочесть "Наиболее частые ошибки", как раз говориться, что делать из контролера Толстый Тупой Уродливый Контролер - не правильно по определению шаблона. Можно спорить сколько угодно, но об этом прямо многие авторитеты. Другое мнение сформировано отсутствием глубокого понимания MVC и малым опытом на крупных проектах.
    Ответ написан
    17 комментариев