Ответы пользователя по тегу JavaScript
  • Догрузка script и link которых нет в DOM после получения AJAX-ответа?

    azproduction
    @azproduction
    Это, конечно, извращение, но сделать в пару строк можно — jsfiddle.net/Cx5Wa/2/
    Для живого примера прогоните код в консоли над хабром — продатет реклама.
    Ответ написан
    Комментировать
  • Сборка проекта, AMD, LMD, использование модулей проекта

    azproduction
    @azproduction
    Использовать сборку и автоматизацию — однозначно стоит.

    require.js имеет свой собственный сборщик модулй и оптимизатор — r.js

    Достаточно много с ним работал из опыта могу сказать, что он хорош, но мне не подошел — муторно поддерживать проект на нем:
    — это AMD, а значит нужно писать обертку define, колдовать если заходится использовать модуль в node.js… (можно не писать обертку, но придется опять колдовать)
    — require() — God Object и возвращает всевозможные тип ресурсов всевозможными путями. Долго вникать что к чему если код чужой
    — плагинная система у него странная для восприятия «с нуля»
    — результат сборки сложно окинуть взглядом «все как-то само»

    В общем, я устал от AMD и RequireJS, смотрел в сторону всевозможных подобных проектов тк мне не хотелось писать еще один велосипед. В итоге, мне пришлось написать инструмент своей мечты — LMD.

    Исходил я из слудующих соображений:

    * Сегодня все собирается. Даже dev
    — зачем писать обертку и вобще писать что-то лишнее если за тебя это может сделать робот?!
    * Читаемость кода очень важна
    — Нужно исключить неявные конструкции
    — Я как архитектор моего проекта хочу знать, что в нем будет «валяться»
    * Сборок бывает много
    — dev, production, dev-ru, test-en_US
    * Нужен контроль результата сборки
    — Проверка целостности
    — Подробная информация о сборке
    — Аналитика

    Сегодня LMD умеет все то, что умеют другие сборщики, и имеет ряд преимуществ: CommonJS/Modules, честная и тотальная изоляция модулей, шикарная аналитика сборок как статическая так и динамическая, CLI с автокомплитом, GUI. LMD особенно хорош если у вас много сборок — много языков, много окружений.

    Если вы используете grunt, то у LMD есть для него плагин — grunt-lmd.

    Буквально на длях я написал целую кучу примеров к всевозможным плагинам и фичам LMD. Посмотрите их. Если будут вопросы задавайте тут или в ЛС.
    Ответ написан
    3 комментария
  • Как разобрать видео на кадры с помощью JavaScript / Canvas?

    azproduction
    @azproduction
    Можно попробовать сделать «высокочастотный» таймер используя вот это gist.github.com/2802407 а еще лучше сделать таймер в воркере на основе setInterval, который будет слать в окно postMessage без лагов таймера.

    Можно еще попробовать сделать хак с play() pause(): play(), таймаут 20мс и pause(), чтение кадра.

    Однако ни один из способов не застрахован от долгих циклов дольше 1000/FPS. Самый надежный способ — декодировать видео в воркере бинарно :(

    Количество проигранных кадров можно узнать только у FF developer.mozilla.org/en-US/docs/DOM/HTMLVideoElement
    Ответ написан
    1 комментарий
  • Парсинг даты из ISO 8601

    azproduction
    @azproduction
    Можно использовать date.js или же просто регулярку
    var rx = /[+-]\d{2}\:?(?:\d{2})?$/;
    "2005-08-09T18:31:42+03:30".match(rx); // ["+03:30"]
    "2005-08-09T18:31:42+0330".match(rx); // ["+0330"]
    "2005-08-09T18:31:42+03".match(rx); // ["+03"]
    
    // Или более правльный формат таймзоны
    var rx = /[+-]\d{2}\:?\d{2}$/; //  не включает короткую запись таймзоны 2005-08-09T18:31:42+03 - такие даты так же не парсят браузеры
    
    Ответ написан
    Комментировать
  • Как блокировать выполнение кривого плагина для Google Chrome?

    azproduction
    @azproduction
    Можно повесить контент-зависимый хук на функции прототипа String

    Плагин использует вот такую конструкцию somestring.replace(/^[^\?]+(\?)*/, ''); для каких-то своих целей

    Мы можем переписать String.prototype.replace и в зависимости от аргументов выбрасывать неожиданное для него исключение (тем самым прерывать работу плагина в самом начале).
    (function (){
        var realStringPrototypeReplace = String.prototype.replace;
        
        String.prototype.replace = function (what) {
            if (what.toString() === "/^[^\\?]+(\\?)*/") {
                throw new TypeError();
            } else {
                return realStringPrototypeReplace.apply(this, arguments);
            }
        };
    }());
    


    Тут проблема в том, чтобы аргументы были уникальными (чтобы что-то полезное не нарвалось на наш капкан) и смое главное, чтобы этот код запустился раньше кода плагина иначе придется искать какое-то подобное динамическое место.
    Ответ написан
  • Фиксация загрузки изображения до загрузки изображения

    azproduction
    @azproduction
    Думаю получится ускорить в ИЕ, используя onreadystatechange.

    Мозиловский MozAfterPaint сейчас не доступен.
    watch на свойство DOM элемента повесить нельзя.
    Эвент «loading» для изображений только в обсуждениях рабочей группы.
    Возможно есть способ подойти со стороны WebGL-ных текстур, но уверенности в этом нет.
    Ответ написан
  • Прототипы JavaScript [Решено, все так печально]

    azproduction
    @azproduction
    Создавайте разные прототипы или объявляйте ownProperty attr в конструкторе иначе никак. Логично, что foo.attr === bar.attr потому как оба они ссылаются на Class.prototype.attr
    Ответ написан
    Комментировать
  • Javascript получение данных из консоли?

    azproduction
    @azproduction
    В клиентском JavaScript нет как таковой консоли. Есть неймсейс и методы которые используют вендоры браузеров для отображения данных для отладки — методы одни, но данные отображаются от браузера к браузеру разные. Фаетически есть «STDOUT», «STDERR», но нет «STDIN». Можно, конечно, сделать костыль, используя prompt(), подогнать интерфейс как javascript linux или написать расширение для конкретного браузера.

    В Node.js есть полноценные методы работы с терминалом TTY
    Ответ написан
    1 комментарий
  • JavaScript: что делает Function.call.apply(…)?

    azproduction
    @azproduction
    В примере они сделали так, чтобы не отделять первый элемент массива — сделать красиво.

    В свое время сломал мозг когда разбирал, вот примеры, которые все объясняет:
    Function.prototype.call.apply(function(a,b){console.log([this,a,b])}, [NaN,{},4], {}, 0);
    (function(a,b){console.log([this,a,b])}).apply(NaN, [{},4], {}, 0);
    // Оба выдают [NaN {}, Object {}, 4]
    // NaN будет объектом т.к. был передан в качестве первого параметра
    

    Function.prototype.call.call(function(a,b){console.log([this,a,b])}, [NaN,{},4], {}, 0);
    (function(a,b){console.log([this,a,b])}).call([NaN,{},4], {}, 0);
    // Оба выдают [[NaN, Object {}, 4], Object {}, 0]
    // Массив [NaN,{},4] уже объект поэтому не преобразуется в объект
    
    Ответ написан
    1 комментарий
  • Хром сортирует свойства в хеше

    azproduction
    @azproduction
    TheShock, это фича/баг хрома(мб WebKit) в остальных браузерах все как и было раньше. Смирись он есть давно.
    Ответ написан
    Комментировать
  • JS-библиотека для "граффити"?

    azproduction
    @azproduction
    Используя, canvas+excanvas вы будете иметь возможность кроссбраузерно нарисовать, но выгрузить картинку удастся только на Op 9+ (Presto 2.0) Fx 3+ (?), Sa, Ch, IE 9 Ибо только в них есть хоть какая-то поддержка canvas#toDataURL developer.mozilla.org/en/DOM/HTMLCanvasElement т.е. для вас возможность сохранить файл на сервере.
    Я уже не говорю о HTML FileAPI canvas.getAsFile("test.jpg", "image/jpeg");

    Кроссбраузерное решение только на Flash.
    Ответ написан
    4 комментария
  • Загрузка файлов на сервер как на Gmail?

    azproduction
    @azproduction
    Использовал вариант с PHP+APC www.ibm.com/developerworks/library/os-php-v525/index.html Все красиво, без лишних плагинов и без флэша.
    Ответ написан
    Комментировать