Ответы пользователя по тегу JavaScript
  • Как правильно получить расширение файла из специфической url-строки?

    lazalu68
    @lazalu68
    Salmon
    Если в самом простом варианте, то наверное просто стоит разбивать строку по слешам, и последнюю строку получившегося массива разбивать еще по точке:
    url = decodeURIComponent( "http://fs2.www.anyone.com/some/153983289/123456789.png%4E800" );
    last_part_of_url = url.substring(url.lastIndexOf('/') + 1);
    if (last_part_of_url.indexOf('.') !== -1) {
    	console.log(last_part_of_url.substring(last_part_of_url.lastIndexOf('.') + 1));
    }

    В большинстве случаев когда такое бывает нужно, впоследствии еще бывает нужно получать полную информацию об URI, Steven Levithan когда-то делал это так.

    Регуляркой то же самое как-то так:
    var r = /^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$/,
        s = "http://fs2.www.anyone.com/some/153983289/123456789.png%4E800";
    
    console.log( r.exec(decodeURIComponent(s))[6] );
    // "123456789.pngN800"
    Ответ написан
    Комментировать
  • Как отдельной кнопкой переключать месяцы в flatpickr?

    lazalu68
    @lazalu68
    Salmon
    Вы можете использовать секретный метод changeMonth
    Ответ написан
    Комментировать
  • Как получить анимацию кнопке на главной angular2?

    lazalu68
    @lazalu68
    Salmon
    Может неправильно понял, но мне кажется это называется ripple. Красивая демка.
    Ответ написан
    1 комментарий
  • Как получить список всех параметров функции JS?

    lazalu68
    @lazalu68
    Salmon
    Use the force, Kirill!

    Notifier.showEvent.toString()
    function (ev, force) {
      curNotifier.q_shown.push(ev);
      var thumbEl = '';
      if (ev.type == 'video_process_ready') {
        thumbEl = '';
      } else {
        thumbEl = '<img src="'+Notifier.fixPhoto(ev.author_photo)+'" alt="'+Notifier.fixPhoto(ev.author_photo)+'">';
      }
      var typeClassName = 'notifier_type_' + ev.type;
      ev.baloonWrapEl = ce('div', {
        className: 'notifier_baloon_wrap',
        innerHTML: '' + ev.title + '' + (ev.author_photo && ('' + (ev.author_link && ('<a href="'%20+%20ev.author_link%20+%20'">')) + thumbEl + (ev.author_link && '</a>') + '')) + (ev.add_photo && ('<img src="'%20+%20ev.add_photo%20+%20'" alt="'%20+%20ev.add_photo%20+%20'">')) + '' + ev.text + ''
      });
      ev.baloonEl = ev.baloonWrapEl.firstChild;
      ev.closeEl = geByClass1('notifier_close_wrap', ev.baloonEl);
    
      addEvent(ev.baloonEl, 'mouseover mouseout', function (e) {
        ev.over = (e.type == 'mouseover');
        if (ev.over) {
          Notifier.freezeEvents();
        } else {
          Notifier.unfreezeEvents();
        }
      });
      addEvent(ev.baloonEl, 'mousedown click', function (e) {
        e = (e.originalEvent || e) || window.event;
        var btn = e.which, nohide = false;
        if (browser.msie) {
          btn = e.button == 1 ? 1 : (e.button == 2 ? 3 : 2)
        }
        if (btn == 1 && (e.ctrlKey || browser.mac && e.metaKey)) {
          btn = 2;
          if (browser.mac) nohide = true;
        }
        if ((e.target || e.srcElement).tagName == 'A') {
          switch (btn) {
            case 1: // left button
              // setTimeout(function () {Notifier.hideEvent(ev);}, 100);
              break;
    
            case 3: // right
              break;
          }
          return;
        }
        switch (btn) {
          case 1: //left button
            eval(ev.onclick);
            Notifier.hideEvent(ev);
            break;
          case 2: // middle
            var wnd = window.open(ev.link, '_blank');
            try {wnd.blur(); window.focus();} catch (e) {}
            if (!nohide) Notifier.hideEvent(ev); // else it will be  hidden by context menu
            break;
          case 3: // right
            if (browser.mozilla) {
              return;
            }
        }
        return cancelEvent(e);
      });
      addEvent(ev.baloonEl, 'contextmenu', function (e) {
        setTimeout(function () {
          Notifier.hideEvent(ev, false, false, true);
        }, 10);
        return cancelEvent(e);
      });
      addEvent(ev.closeEl, 'mousedown click', function (e) {
        Notifier.hideEvent(ev, false, false, true);
        return cancelEvent(e);
      });
      ev.startFading = function () {
        ev.fading = animate(ev.baloonEl, {opacity: 0}, 1000, Notifier.hideEvent.bind(Notifier).pbind(ev, false));
        if (ev.over) {
          ev.fading.stop();
        }
      }
      curNotifier.cont.insertBefore(ev.baloonWrapEl, curNotifier.cont.firstChild);
      var h = ev.baloonWrapEl.offsetHeight;
      re(ev.baloonWrapEl);
      curNotifier.cont.appendChild(ev.baloonWrapEl);
      setStyle(curNotifier.cont, {bottom: -h});
      setStyle(ev.baloonWrapEl, {visibility: 'visible'});
      animate(curNotifier.cont, {bottom: 0}, 200);
      if (!curNotifier.idle_manager.is_idle || force) {
        ev.fadeTO = setTimeout(ev.startFading, hasAccessibilityMode() ? 35000 : 7000);
      }
    }
    Ответ написан
    Комментировать
  • Как сделать подгрузку фото из Instagram?

    lazalu68
    @lazalu68
    Salmon
    Ответ написан
    Комментировать
  • Как получить правильный номер итерации в ответе subscribe()?

    lazalu68
    @lazalu68
    Salmon
    getCars() {
            var params_list = {
                    param1:             1,  // 1 - ID параметра
                    param2:             2,
                    param3:             3,
                    ...
                    paramN:           N
                }
            
            for(let key in params_list){
                this.authHttp.get(APP_SERVER + '?car_param=' + params_list[key])
                .map( (response: Response) => response.json() )
                .subscribe(
                    (data) => {
                        data["name"] = key;
                        this.carsParams.push(data);
                    },
                    (error) => {
                        console.log('error');
                    }
                );
            }
        }
    Ответ написан
    3 комментария
  • Как передать все аргументы из внутренней функции в функцию, которая является аргументом?

    lazalu68
    @lazalu68
    Salmon
    Вероятно, я не очень понял задачу, но из того что я понял, получилось такое:
    Первый вариант
    function createCounter(start, step) {
      return function(){
        if (start === undefined)
          start = 0;
        if(step === undefined)
          step = 1;
        start+=step;
        return start - step;
      };
    }
    
    function pow(x) {
      return x * x;
    }
    
    function generator(f1, f2) {
      return function() {
        return f1(f2());
      };
    }
    
    var generatedFunction = generator( pow, createCounter(1, 1) );
    
    generatedFunction(); // 1
    generatedFunction(); // 4
    generatedFunction(); // 9
    generatedFunction(); // 16
    generatedFunction(); // 25

    Ну, вы бы могли использовать конструктор и тогда даже проблемы переопределения функций не было бы:
    Вариант с конструктором
    function createCounter(start, step) {
      return function(){
        if (start === undefined)
          start = 0;
        if(step === undefined)
          step = 1;
        start+=step;
        return start - step;
      };
    }
    
    function pow(x) {
      return x * x;
    }
    
    function CustomIterator(f1, f2) {
      this.f1 = f1;
      this.f2 = f2;
      this.next = function() {
        return this.f1( this.f2() );
      }
    }
    
    var iterator = new CustomIterator( pow, createCounter(1,1) )
    
    iterator.next() // 1
    iterator.next() // 4
    
    // set some other function as f1
    iterator.f1 = function(x) {
      return x * x * x;
    }
    
    iterator.next() // 27
    iterator.next() // 64
    
    // resetting counter, creating it once again
    iterator.f2 = createCounter(1, 5)
    
    iterator.next() // 1
    iterator.next() // 216

    Но если вы готовы ко всему и у вас всегда с собой баночка вазелина, то как-то так наверное:
    Вариант, использующий свойства функции
    function createCounter(start, step) {
      return function(){
        if (start === undefined)
          start = 0;
        if(step === undefined)
          step = 1;
        start+=step;
        return start - step;
      };
    }
    
    function pow(x) {
      return x * x;
    }
    
    function createIterator(f1, f2) {
      function generated() {
        return generated.f1( generated.f2() );
      }
      generated.f1 = f1;
      generated.f2 = f2;
      return generated;
    }
    
    iterator = createIterator( pow, createCounter(1,1) );
    
    iterator(); // 1
    iterator(); // 4
    
    iterator.f1 = function(x) {
      return x * x * x;
    }
    
    iterator(); // 27
    iterator(); // 64

    Можно конечно переложить на генерируемую функцию обязанности по переопределению функций, но мне кажется это очень-оооочень странным:
    Ну вообще содомия
    function createCounter(start, step) {
      return function(){
        if (start === undefined)
          start = 0;
        if(step === undefined)
          step = 1;
        start+=step;
        return start - step;
      };
    }
    
    function pow(x) {
      return x * x;
    }
    
    function createIterator(f1, f2) {
      function generated(inner_f1, inner_f2) {
        if (arguments.length) {
          if (typeof inner_f1 === 'function') {
            generated.f1 = inner_f1;
          }
          if (typeof inner_f2 === 'function') {
            generated.f2 = inner_f2;
          } 
        } else {
          return generated.f1( generated.f2() );
        }
      }
      generated.f1 = f1;
      generated.f2 = f2;
      return generated;
    }
    
    iterator = createIterator( pow, createCounter(1,1) );
    
    iterator(); // 1
    iterator(); // 4
    
    iterator(function(x) {
      return x * x * x;
    });
    
    iterator(); // 27
    iterator(); // 64
    Ответ написан
  • Как пользоваться random color?

    lazalu68
    @lazalu68
    Salmon
    Пример с гитхаба
    // Returns a hex code for an attractive color
    // Возвращает шестнадцатеричный код для привлекательного цвета (c) Google Translate
    randomColor(); 
    // "#c7f9fc"
    
    // Returns an array of ten green colors
    // Возвращает массив из десяти зеленых цветов (c) Google Translate
    randomColor({
       count: 10,
       hue: 'green'
    });
    // ["#44d644", "#9def8d", "#c0ef7a", "#b2ffb3", "#8cffdc", "#1be809", "#5ff49d", "#cefc7e", "#7fdb6d", "#7df455"]
    
    // Returns a hex code for a light blue
    // Возвращает шестнадцатеричный код для светло-голубой (c) Google Translate
    randomColor({
       luminosity: 'light',
       hue: 'blue'
    });
    // "#b5c6ff"
    
    // Returns a hex code for a 'truly random' color
    // Возвращает шестнадцатеричный код для 'истинно случайный "цвет (c) Google Translate
    randomColor({
       luminosity: 'random',
       hue: 'random'
    });
    // "#020504"
    
    // Returns a bright color in RGB
    // Возвращает яркий цвет в RGB (c) Google Translate
    randomColor({
       luminosity: 'bright',
       format: 'rgb' // e.g. 'rgb(225,200,20)'
    });
    // "rgb(4, 126, 214)"
    
    // Returns a dark RGB color with random alpha
    // Возвращает темный цвет RGB со случайным альфа (c) Google Translate
    randomColor({
       luminosity: 'dark',
       format: 'rgba' // e.g. 'rgba(9, 1, 107, 0.6482447960879654)'
    });
    // "rgba(9, 163, 83, 0.10101238849233907)"
    
    // Returns a dark RGB color with specified alpha
    // Возвращает темный цвет RGB с указанным альфа (c) Google Translate
    randomColor({
       luminosity: 'dark',
       format: 'rgba',
       alpha: 0.5 // e.g. 'rgba(9, 1, 107, 0.5)',
    });
    // "rgba(12, 70, 127, 0.05832547896138873)"
    
    // Returns a light HSL color with random alpha
    // Возвращает цвет света HSL со случайным альфа (c) Google Translate
    randomColor({
       luminosity: 'light',
       format: 'hsla' // e.g. 'hsla(27, 88.99%, 81.83%, 0.6450211517512798)'
    });
    // "hsla(43, 100%, 89.5%, 0.7559263499824191)"

    Также можно глянуть демку и на её код

    UPD: сделал пример, в котором используется randomColor.js
    Ответ написан
  • Как привязка данные к генерируемым кнопкам?

    lazalu68
    @lazalu68
    Salmon
    Можно, например, сохранять в самих объектах.
    Ответ написан
    Комментировать
  • Как сделать сброс фильтров?

    lazalu68
    @lazalu68
    Salmon
    Немного мимикрии, попробуйте использовать эту функцию:

    function berocket_reset() {
    	$('.berocket_checked').click();
    	$('select[name="orderby"] :first').prop('selected', true);
    	$('.berocket_filter_slider').each(function(i, o) {
    	    var $o = $( o ), all_terms_name = $o.data('all_terms_name');
    	    $o.data({
    	        value1: $o.data('min'),
    	        value2: $o.data('max')
    	    })
    	    if( $o.data('all_terms_name') == null )  {
    	        $( '#'+$o.data('fields_1') ).val( berocket_format_number ($o.data('value1') / $o.data( 'step' ) ) );
    	        $( '#'+$o.data('fields_2') ).val( berocket_format_number ($o.data('value2') / $o.data( 'step' ) ) );
    	    } else {
    	        $( '#'+$o.data('fields_1') ).val( all_terms_name[ $o.data('value1')>>0 ] );
    	        $( '#'+$o.data('fields_2') ).val( all_terms_name[ $o.data('value2')>>0 ] );
    	    }
    	    berocket_set_slider ( i, o );
    	})
    	updateProducts();
    }


    Вероятно, предварительно стоит сделать так:
    $ = jQuery
    Ответ написан
    3 комментария
  • Как узнать длину строки, ограниченной шириной блока и размером шрифта?

    lazalu68
    @lazalu68
    Salmon
    Сразу скажу, что я не знаю, как такое реализовать надёжно, но вот что-то такое получится, если попытаться решить задачу тем же способом, что и Уилл Паттерсон.

    Суть в том, что после каждого слова вставляется пустой span. Далее происходит проверка в цикле: если верхний отступ текущего span равен отступу первого в строке span, значит текущее слово относится к текущей строке. Если больше - к следующей.

    Колбэк, который передаётся аргументом в метод forEachTextLine, на входе получает 1) номер строки, 2) текст строки и 3) последний пустой span в этой строке.
    Ответ написан
    Комментировать
  • Геокодинг массива адресов?

    lazalu68
    @lazalu68
    Salmon
    Кажется, async.map как раз для этого

    Если задача одна и вся библиотека не нужна, аналог async.map реализуется довольно просто.

    Бтв, caolan вроде бы без промисов справляется с этим, в простейшей реализации как-то
    так
    var list_of_items_to_process = [ 1, 2, 3, 4, 5 ];
    
    function asyncMap(list, exec, callback) {
    	var processed = 0;
    
    	list.forEach(function(current, index, array) {
    		exec(current, index, array, innerCallback.bind(index));
    	})
    
    	function innerCallback(result) {
    		list[this] = result;
    		processed++;
    		if (processed === list.length) {
    			callback(list);
    		}
    	}
    }
    
    function processor(value, index, array, callback) { 
    	var result;
    	setTimeout(function() { 
    		result = value*Math.round(Math.random()*10);
    		console.log(result)
    		callback(result); 
    	}, 500*value); 
    }
    
    function mainCallback(values) {
    	console.log(values);
    }
    
    asyncMap(list_of_items_to_process, processor, mainCallback)


    Если я ничего не напутал, то после того, как вы сформируете items, вам достаточно будет выполнить
    это
    function asyncMap(list, exec, callback) {
      var processed = 0;
    
      list.forEach(function(current, index, array) {
        exec(current, index, array, innerCallback.bind(index));
      })
    
      function innerCallback(result) {
        list[this] = result;
        processed++;
        if (processed === list.length) {
          callback(list);
        }
      }
    }
    
    function processor(value, index, array, cb) {
      GMaps.geocode({
        address: value.address + " " + value.city + " " + value.zip,
        callback: function(results, status) {
          if (status == 'OK') {
            cb(results);
          } else {
            cb(false);
          }
        }
      });
    }
    
    function mainCallback(values) {
      values.forEach(function(value) {
        if (!value) return;
    
        var latlng = results[0].geometry.location;
        map.setCenter(latlng.lat(), latlng.lng());
    
        markers_data.push({
          id: value.id,
          lat: latlng.lat(),
          lng: latlng.lng(),
          title: value.name,
          icon: {
            size: new google.maps.Size(32, 32),
            url: icon
          },
          infoWindow: {
            content: ''
          }
        });
      });
    }
    
    asyncMap(items, processor, mainCallback)
    Ответ написан
    Комментировать
  • Как посчитать странное выражение (из теста с UpWork)?

    lazalu68
    @lazalu68
    Salmon
    UPD: разбор именно вашего случая

    TLDR - комментированный jjencode

    Описание порядка действий, type conversion table

    ++[[]][+[]]+[+[]]

    Два слагаемых: ++[[]][+[]] и [+[]]

    Первое слагаемое равно единице, т.к. первая пара квадратных скобок это литерал массива с единственным элементом - пустым массивом, вторая пара - обращение к этому массиву по индексу +[], то есть 0. По индексу 0 лежит пустой массив, в виду инкремента он приводится к числу (получается 0) и добавляется единица, получается 1

    Второе слагаемое это литерал массива с единственным элементом 0.

    То есть складываются единица и [0], 1+[0].

    Единственная загадка это почему в этой операции [0] приводится к строке. Было бы логично если бы в операции сложения единицы и массива массив приводился к примитиву с PreferredType равным "number", но почему-то получается строка. Большое спасибо было бы тому человеку, который бы объяснил этот момент в спецификации.
    Ответ написан
    7 комментариев
  • Какую функцию использовать для вывода результата по заданной формуле?

    lazalu68
    @lazalu68
    Salmon
    Имеется таблица в которой 3 поля (2 для ввода данных и 1 для вывода результата)

    1. прогноз - 2 цифры;
    2. результат - 2 цифры;
    3. баллы - 1 цифра.


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

    lazalu68
    @lazalu68
    Salmon
    PACE?
    Ответ написан
    Комментировать