Ответы пользователя по тегу JavaScript
  • Как использовать шаблон namespace?

    Я бы пожалуй использовал это так:

    var myModuleNS = extend(myApp, 'modules.module2');
    myModuleNS.method = function() {};
    
    //возможно лучше сразу перезаписать прото и не мучиться. 
    //Но это опасный некроссбраузерный код.
    myModuleNS.__proto__ = {
      method1: function() {},
      publicVar1: 1,
      __proto__: myModuleNS.__proto__
    }


    Этот способ мне кажется не очень удобным (это так же отмечено в оригинальной статье в следующих строках: "This works exceedingly well when defining purely namespaces alone, but can seem a little less flexible when you want to define both functions and properties at the same time as declaring your namespaces."), я бы пожалуй модифицировал функцую следующим образом:

    function extend(ns, ns_string, value) {
        var parts = ns_string.split('.'),
            parent = ns,
            pl, i;
    
        if (parts[0] == "myApp") {
            parts = parts.slice(1);
        }
        pl = parts.length;
    
        for (i = 0; i < pl; i++) {
            //create a property if it doesnt exist
            if (typeof parent[parts[i]] == 'undefined') {
                if (value !== undefined && i==pl-1) parent[parts[i]] = value;
                else parent[parts[i]] = {};
            }
            parent = parent[parts[i]];
        }
        return parent;
    }


    Теперь этим вполне можно пользоваться:
    var myModule = extend(myApp, 'modules.myModule', new MyModule());
    //это так же подойдет для расширения существующего пространства имен методами
    extend(myApp, 'modules.myModule.method', function myNewMethod() {});

    Такая конструкция имеет ряд недостатков, например повторная попытка сделать extend myModule, вернет результат первой такой попытки, я бы не ожидал подобного действия от кода.

    Конструкция описанная Сергей Мельников , сомнительна, он рекомендует вам с помощью этой функции получать методы искомого модуля. Теперь давайте представим, что запрашиваемого метода не существует - в ответ на extend вы получите пустой объект и попытаетесь его вызвать, а это ой как не понравится программе...

    В заключении:
    Если бы я и использовал этот паттерн, то пожалуй только внутри конструктора синглтона и только в предложенной мной модификации:

    function MyModule() {
      var module = extend(NS, 'modules.MyModule', this);
      if (module !== this) return module;
      
      //body of module
    }
    Ответ написан
    Комментировать
  • Что лучше: передавать функцию или ее результат в аргумент?

    С точки зрения интерпретатора эти конструкции практически идентичны, единственное, в первом случае в scope создается дополнительная ссылка на результат функции.

    Так что какой вариант использовать, в данном случае - решение стилистическое:
    с одной стороны есть мнение, что если результат вычислений используется лишь в одном месте, то не стоит создавать на него ссылку,
    с другой - сворачивание кода в бессылочную конструкцию приведет к его полной нечитабельности
    funcA(funcB(funcC(funcD(5))));
    Всего должно быть в меру.
    Ответ написан
    Комментировать
  • Как вставить текст из буфера в JavaScript?

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

    А вообще, все уже давно написано у вас проблемы с гуглом? stackoverflow.com/questions/400212/how-do-i-copy-t...
    Ответ написан
  • Как вывести массив var a = [2, 2,3,3,3,4]; в виде 2:2, 3:3, 4:1?

    Простите, вы собираетесь поэтапно решать свои задачи с помощью Тостера?
    Судя по списку предыдущих ваших вопросов, именно так дела и обстоят.

    Может стоит взять в руки учебник, ну или хотя бы javascript.ru проштудировать?
    Ответ написан
    Комментировать
  • Как можно заменить инструкцию jquery $(element).html() функцией на чистом javascript?

    Нет, серьезно, вы не пробовали почитать учебные материалы по языку программирования, который используете?
    Ответ написан
    1 комментарий
  • JavaScript: какая разница в объявлении переменных?

    Первый вариант:
    var a = 0, b = 0; имеет несколько явных недостатков:
    1. При наличии системы контроля версий, добавление новой переменной будет неинформативно. Будет изменена вся строка, что незначительно усложнит ревью кода.
    2. Субъективно подобная запись мешает восприятию кода. В ней плохо различимы переменные без присвоенного значения. Т.е. var a = 0, b = 0, c, d = 0;

    Второй вариант:
    var a = 0;
    var b = 0;

    Является наиболее расширяемым в плане версионирования (не имеет проблемы с выставлением запятой, как в приведенном ниже третьем варианте), но перегружен служебными словами.
    Лично я предпочитаю пользоваться этим синтаксисом в nodejs модулях для подгрузки библиотек в верхней части скрипта:
    var fs = require('fs');
    var path = require('path');


    Третий вариант:
    var a = 0,
        b = 0;

    Несколько проигрывает второму в плане удобства версионирования (при добавлении переменной С будет изменено две строчки, а не одна), но наиболее распространен в js best practices. Одинаково применим как с выравниванием по 4 пробелам для выстраивания переменных в столбик, так и без надуманного выравнивания.
    Из минусов этого варианта, можно отметить забытую запятую после a = 0. В таком случае переменная b будет объявлена глобально, если не используется "use strict"
    Ответ написан
    1 комментарий
  • Почему typeof ведет себя непредсказуемо?

    '' + Enum.ONE_TYPE == '[object Enum]'
    '' + Enum.TWO_TYPE == '[object Enum]'
    objects['[object Enum]'] == 'one'


    Дальше объяснять, или этого достаточно?
    Ответ написан
  • Как заставить две переменные в JavaScript ссылаться на один и тот же объект в памяти?

    Вам стоит разобраться с тем, какие типы передаются по ссылке, а какие по значению (т.е. копируются при присваивании). Строковые и численные переменные передаются по значению.

    Но все это вам куда лучше расскажет любой учебник по js в одной из первых глав.
    Ответ написан
    Комментировать
  • Как установить последовательность выполнения событий js?

    Проверяйте значение с задержкой.
    Никогда не пытайтесь сортировать события. Это антипаттерн.
    var changedFromSelect = false; //назовите его как хотите
    function onBlur() {
      setTimeout(function() {
        if (changedFromSelect) return;
    
        updateHiddenInput();
        //Показать форму здесь
      }, 50);
    }
    function onSelect() {
      changedFromSelect = true;
      updateHiddenInput();
    }
    Ответ написан
    Комментировать
  • Как получить текст сообщений консоли(JavaScript)?

    Переопределите функцию console.log, например так:

    console.output = []; // Из этого массива заберете все что вам нужно
    console.log = (function(log) {
      return function() {
        log.apply(console, arguments);
        console.output.push(arguments);
      }
    }(console.log));
    Ответ написан
    Комментировать
  • Можно ли изменять таймер при закрытом окне браузера?

    Я не тестировал этот код, но как-то так:
    function onSomeAction() {
      var delay =  1000*60*5;
      var currTime = new Date();
      var nextTime = new Date(currTime + delay);
      localStorage.nextAction = nextTime;
      setTimeout(callSomeOtherAction,  delay);
    }
    
    window.onload = function() {
      var currTime = new Date();
      if (localStorage.nextAction) {
        var delay = localStorage.nextAction - currTime;
        if (delay >= 0) {
          setTimeout(callSomeOtherAction, delay);
        } else {
          delete localStorage.nextAction;
        }
      }
    }
    
    function callSomeOtherAction() {
      delete localStorage.nextAction;
      someOtherAction();
    }
    
    function someAction() { console.log(1); onSomeAction(); }
    function someOtherAction() { console.log(2); }
    Ответ написан
    Комментировать
  • Как заменить регуляркой некоторое количество пробелов, только если их больше одного?

    "A B  C   D A".replace(/\s{2,}/g, function(s) {return new Array(s.length+1).join('-')})
    Ответ написан
    Комментировать
  • Как можно сериализовать данные не из формы?

    Вот вам готовый примерчик из закромов.

    var xmlsttr = '...';
    var data = new Blob([xmlstr], {type: 'text/xml; charset=utf-8'});
    var formData = new FormData();
    					
    formData.append("optionName", data, 'fileName.xml');
    $.ajax({
      type: "POST",
      url: "/url"),
      dataType: "text",
      success: function() {},
      error: function() {},
      contentType: false,
      processData: false,
      data: formData
    });
    Ответ написан
    3 комментария
  • Зачем нужны таск менеджеры GULP и GRUNT?

    Мне кажется тут не хватает образного примера:

    Вот купили вы стул. До ужаса дешевый, а потому без инструкции по сборке. Помучились час другой, но собрали. И тут выясняется, что ваша подруга купила такой же стул, а собрать ума не хватает, и просит она вас. Вы уже опытный - за пол часа управились. Вы бы и быстрее управились, но все никак не могли найти куда присобачить последний шуруп.
    Потом случилось страшное - почти вся ваша родня узнала о дешевых стульях, и помчалась их покупать, а за советом как собирать их, как вы уже догадались, обращается к вам. Конечно разъезжать из дома в дом по столь неуважительной причине вам не с руки, вот тогда вы написали инструкцию и разослали ее всем по факсу.
    Время шло, город слухами полнился, и вот уже совершенно незнакомые люди обращаются к вам с просьбой какой либо предмет мебели. До поры до времени инструкции спасали, но потом нахлынула толпа бабушек, которым ваши каракули как пергамент на древнеегипетском...
    На этом этапе вы решили уволиться с основной работы и открыть собственное дело по производству роботов-сборщиков (не путайте с роботами-сгибателями). Вам звонят бабушки, а вы им высылаете свои агрегаты, подчас загружая в них инструкцию по строительству дома.

    Вот и сказочке конец, а кто слушал, тот и gulp.

    Простите - пятница.
    Ответ написан
    Комментировать
  • Можно ли использовать bower для своих модулей?

    Возможно вам подойдет bower link
    Ответ написан
    Комментировать
  • Конструктор глобального "асоциативного" масива на JavaScript как создать?

    var events = {};
    
    function eventsAdd (dateid, time, todo) {
      var date = events[dateid] || events[dateid] = [];
      date.push({
        time: time, 
        todo: todo
      });
    }
    Ответ написан
    Комментировать
  • Как вернуть значение из вложенной функции?

    А вы давно занимаетесь асинхронным программированием или только сегодня начали?
    Потому как вам нужно как минимум вот это (простите не силен в coffescript, написал как мог):

    class ShowReaders
      constructor:(@listreaderdiv, @currentreaderdiv )->
           console.log('mainclass')
           @currentReader
           @testedReaders
    
    ...
    ...
    
    
    
      getCurrentReader:(url, callback)->
           $.post "/ajax/#{url}", (data)->
                console.log('data ',data['current'])
                @currentReader = data['current']
                @onGetCurrentReader()
    
      create:->
           @getCurrentReader('getcurrentreader')
    
      onGetCurrntReader:->
          $('#currentreader').empty()
          console.log( @currentReader)


    Мне наиболее логичным кажется следующий вариант:

    function ShowReaders() {
      this.currentReader = null;
      this.testedReaders = null;
    }
    
    ShowReaders.prototype.getCurrentReader = function(url, callback) {
      $.post(url, this.onGetCurrentReader.bind(this, callback));
    };
    
    ShowReaders.prototype.onGetCurrentReader = function(callback) {
      this.currentReader = data['current'];
      callback();
    };
    
    ShowReaders.prototype.create = function() {
      this.getCurrentReader('getcurrentreader', function() {
        $('#currentreader').empty();
        console.log(this.currentReader)
      }.bind(this));
    };
    Ответ написан
  • Как реализовать событие по календарю?

    Вот вам направление:

    var date = new Date('2014-12-2 15:00:00');
    var target = $('#target-block');
    
    if (Date.now() > date) target.hide();
    Ответ написан
    Комментировать
  • Как устроены потоки в gulp?

    Советую так же освоить https://github.com/substack/stream-handbook
    Ответ написан
    Комментировать