Задать вопрос
Ответы пользователя по тегу JavaScript
  • Необходимые знания для моделирования геометрических объектов на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не вполне понятна ваша задача. Посмотрите JS библиотеки для графики:
    Ответ написан
    Комментировать
  • Как найти в объекте элемент и получить его ключ?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без риска напороться на устаревший браузер:
    function findKey( obj, value) {
        for( var prop in obj) {
            if( obj.hasOwnProperty( prop)  && obj[ prop] === value) return prop;
        }
        return false;
    }
    
    var A = {"34":"334", "003":"21"};
    var key = findKey( A, "21"); // "003"
    Ответ написан
    Комментировать
  • Как получить фото пользователя вконтакте по его id (используя js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нужно вызвать метод API ВКонтакте users.get() – он возвращает инфу о пользователе, в т.ч. его аватарки. Т.к. запрос выполняется из JavaScript с домена вашего сайта на другой домен api.vk.com, это кроссдоменный запрос. В jQuery ajax нужно указать тип данных jsonp.

    Запрос будет асинхронный, поэтому в функцию передаём id пользователя ВК и колбэк-функцию, которая будет вызвана, когда получим ответ от ВК со ссылкой на изображение:
    function getPhoto( id, callback) {
    	$.post({
    			url: "https://api.vk.com/method/users.get",
    			data: {
    				 user_id: parseInt(id),
    				 fields: "photo_100",
    				 v: 5.63
    			},
    			dataType: "jsonp",
    			success: function(r) {
    			  if(r && r.response && r.response[0].photo_100) {
    				  return callback(r.response[0].photo_100);
    				} else {
    				  console.log("No photo in response")
    				}
    			}
    	});
    }
    
    function gotPhoto( url) {
      var img = $('<img>')
    		.attr('width', 100)
    		.attr('height', 100)
    		.attr('src', url)
    	;
    	$('body').append(img);
    	
    }
    
    getPhoto( 755074, gotPhoto);


    fiddle
    Ответ написан
    1 комментарий
  • Как вызвать какие-то функции телефона через javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для телефона – схема tel: <a href="tel:+74955555555">+7 (495) 555-55-55</a>

    Для карт советуют ссылаться на Apple Maps, которые редиректят пользователей с Android на карты Google:
    http://maps.apple.com/?q=автомойка
    Ответ написан
    2 комментария
  • Как получить название метода внутри метода?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Уже никак.

    Раньше можно было – свойство arguments.callee содержало название текущей функции/метода. Но в ES5 от этого отказались, и поэтому в strict mode это вызовет ошибку.

    Без "use strict"; можно было бы написать в каждой функции console.log( arguments.callee);

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надеюсь, вас возьмут на работу : )

    function loadCurrencyJSON() {
    	return '{"AUD":44.95,"GBP":73.42,"BRL":18.8,"USD":58.85,"EUR":62.68,"ZZZ":79.91}';
    }
    function convertCurrency (amount, from, to) {
    	let rates = JSON.parse(loadCurrencyJSON());
    	return ( amount / rates[to] * rates[from]).toFixed(2); // вернуть число, округленное до сотых
    }
    
    let price1 = convertCurrency(7000, 'ZZZ', 'USD');
    console.log(`Сумма ${price1} USD`);
    // Сумма 9505.01 USD
    
    let price2 = convertCurrency(790, 'EUR', 'ZZZ');
    console.log(`Сумма ${price2} Q`);
    // Сумма 619.66 Q
    Ответ написан
    3 комментария
  • Что значит запись "$." в JQuery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    $ – это объект jQuery. Через точку к нему обращаются, чтобы вызвать его методы или получить свойства. В вашем примере вызывается метод hide()

    Для чего может быть нужно вызывать метод без выборки элементов. У метода hide() есть, среди прочего, параметр step – туда можно передать функцию, которая будет вызываться при каждом шаге анимации. Можно запустить «пустую» анимацию, которая не будет ничего прятать, но станет вызывать упомянутую функцию. Иногда и такое нужно.

    К примеру, jQuery.each() (он же $.each()) позволяет «пробежаться» как по массиву, так и по объекту, выполняя какое-то действие с каждым из элементов/свойств.
    Ответ написан
    Комментировать
  • JavaScript парсер даты и времени на естественном языке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «250 строк кода, распознающих дату на русском языке»

    Из тяжелой артиллерии можно посмотреть Яндекс Томита парсер есть в обёртках под nodejs. Хотя он вроде, под даты не заточен.
    Ответ написан
    Комментировать
  • Лучше больше кода, но лёгкого или меньше, но сложного?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    При каждом изменении поля (событие "input") выкидывать всё, кроме цифр (и знаков подчёркивания?), и форматировать в шаблон.
    Ответ написан
    Комментировать
  • Как убрать влияние часового пояса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Внутри, объект Date не хранит указание на временную зону, он считает время всегда в UTC и значением хранит только число миллисекунд с 1970-01-01 00:00:00 UTC. Он также в курсе временной зоны устройства, и может учитывать её при формировании вывода.

    Когда в конструктор Date передаётся только 1 аргумент (ваш случай), этот аргумент интерпретируется как время в зоне UTC; когда больше одного – в местной временной зоне.

    Как я понял, вы хотите создать объект Date, передав дату-время в UTC?

    Попробуйте так:
    function toDate(date, time) {
        return new Date( Date.UTC( date + ' ' + time));
    }


    Формат dd/mm/YYYY HH:mm можно получить, составляя из компонент. Опять же, по UTC получить, или в локальной временной зоне? Для UTC будет выглядеть так:
    function pad(n){ return ('0' + n).substr(-2) }
    function toUTCString(d) {
      return '' + pad( d.getUTCDate()) + '/' + pad(d.getUTCMonth()+1) + '/' + d.getUTCFullYear()
        +' ' + pad( d.getUTCHours()) + ':" + pad( d.getUTCMinutes());
    }


    В локальной временной зоне устройства – уберите 'UTC' из всех методов )
    Ответ написан
  • Как делают автоответчики на javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Посмотрите на wit.ai
    Ответ написан
    Комментировать
  • Как добавить в регулярное выражение флаги?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Предположение: под «массивом регулярок» вы имеете в виду просто массив слов, с одним из которых ищется совпадение. Тогда можно так:
    var r = ['купить','дешево','по ссылке'];
    var msg = "хотите купить гараж?";
    var re = new RegExp( r.join("|"), "gim"); // одно ИЛИ другое ИЛИ третье
    if( re.test( msg)) { // спам detected }
    Ответ написан
    Комментировать
  • Как остановить выполнение функции или цикла по истечению времени?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно, например, какой-то флаг поднимать, когда пора функции прекратить работу. А внутри функции, по возможности, смотреть, не поднят ли флаг, и если да – выходить.
    var flag = false; // когда будет true - тушите свет!
    function game() {
      var i;
      while(true) { // на самом деле из цикла так не выйти
           // пока он крутится, другие потоки не смогут запуститься и изменить значение флага
        i = i++;
        if(flag) return; // выход, когда пора
      }
    }
    setTimeout( function(){ flag = true;}, 60000}); // через минуту поднять флаг
    game();


    Другой вариант, более подходящий для цикла - заранее назначить время выхода и смотреть на часы:
    var timeToExit = (new Date).getTime() + 300000; // через 5 минут
    function game() {
      var i;
      while(true) {
        i = i++;
        if( (new Date).getTime() >= timeToExit) return; // выход, когда пора
      }
    }
    game();
    Ответ написан
    2 комментария
  • Как зашифровать строку методом "Железнодорожной изгороди"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для начала отдельное упражнение – как из индекса буквы в исходной строке получить индекс строки, в которую его положить.

    Обозначу число строк переменной rows. Период этой «пилы» от верхнего пика до следующего верхнего пика составляет 2 * (rows - 1). Остаток от деления на этот период будет означать позицию внутри одного «зуба»:
    остаток: 0 1 2 3 4 5
     строка: 0 1 2 3 2 1 – это хочется в итоге как-то получать


    Чтобы просчитать «отражение» – когда шли вниз и потом стали идти вверх – надо подогнать этот момент и сделать пересечением оси y = 0 и тогда отражение легко сделать, взяв абсолютное значение Math.abs():
    y  : 3  2  1  0 -1 -2
    abs: 3  2  1  0  1  2


    Остаток от деления будет всегда положительным и растущим: 0 1 2 3 4 5, а нужно получить из него 3 2 1 0 -1 -2. Умножить на -1 и добавить 3: Math.abs(rows - 1 - ost)

    Итого примерно такой код даст правильные номера строк, куда вставлять символ, получая на вход i – индекс буквы в исходной строке:
    var i, ost, row, rows=4, period = 2 * (rows - 1); //   0 0 0   |    6 0 0
    for(i = 0; i < 10; i++) {                         //   1 1 1   |    7 1 1
      ost = i % period;                               //   2 2 2   |    8 2 2
      row = rows - 1 - Math.abs(rows - 1 - ost);      //   3 3 3   |    9 3 3
      console.log( i, ost, row);                      //   4 4 2   |   10 4 2
    }                                                 //   5 5 1   |   11 5 1


    В сборе будет выглядеть примерно так:
    function encrypt( text, n) {
      var i, ost, period = 2 * (n-1), r, row, out = [];
      text = text.replace(/\s/g,""); // убрать пробелы
      for(r = 0; r < period; r++) out[r] = ""; // пустые строки
      for(i = 0; i<text.length; i++) {
        ost = i % period;
        row = n - 1 - Math.abs(n - 1 - ost)
        out[row] += text.substr(i,1);
      }
      return out.join("");
    }
    
    function test( text, rows) {
    	var pre = document.createElement("pre");
    	pre.innerHTML = encrypt(text, rows);
    	document.body.appendChild(pre);
    }
    
    test("этот текст зашифрован", 4); // экинтесшфаоттарвтзо

    jsFiddle

    Upd. чуть переписал это дело. Шифровка и расшифровка осуществляются на основе одной и той же «карты», которая зависит только от числа букв в тексте и числа строк. Поэтому сделал одну ф-ю, создающую эту карту. И слегка отличающиеся короткие функции шифровки и дешифровки. Фиддл с формой. Код шифровки/дешифровки такой:
    function makeMap( len, n) {
      var i, pip, period = 2 * ( n - 1);
      var rows = Array.apply( null, Array( n)).map( function(){ return []});
      for( i = 0; i < len; i++) {
        pip = i % period;
        r = pip < ( n - 1) ? pip : period - pip; 
        rows[ r].push( i);
      }
      return Array.concat.apply( null, rows);
    }
    
    function decrypt( text, n) {
      var map = makeMap( text.length, n);
      return text.split('').reduce(function(p,c,i,a){ return p + a[map.indexOf(i)]},'');
    }
    
    function encrypt( text, n) {
      var map = makeMap( text.length, n);
      return text.split('').reduce(function(p,c,i,a){ return p + a[map[i]]},'');
    }
    Ответ написан
    4 комментария
  • Что делают значения в функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Прочитайте, пожалуйста, https://learn.javascript.ru/function-basics – обратите внимание на «локальные переменные».

    Попробую разложить по полочкам.

    var a = 1, b = 2; // эти a, b – «глобальные», выше всех, «видны» везде
    function calculate(x, y, z) {
      // здесь определены локальные переменные x, y, z
      // и видны все переменные из уровней выше
      // напр. a и b
      // ждём, что x – это будет функция
      return x( y+a, z+b); // можно использовать и локальные и глобальные
    }
    
    function sum( a, b){ // а вот тут a,b – переопределены локально
      // и к тем, глобальным a и b не имеют никакого отношения!
      return a+b; // складывает те a и b, что передали при очередном вызове sum()
    }
    
    calculate( sum, 5, 6); // вызывает calculate, и там будет x = sum, y=5, z=6
    sum( 7, 8);  // вызывает напрямую sum, внутри которого будет a=7 и b=8
    // при этом глобальные a и b никак не пострадают.
    Ответ написан
    Комментировать
  • Как сделать простановку пробелов с конца в моей регулярке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регуляркой:
    var n = 12345678;
    n = n.toString(10).replace(/(\d)(?=(\d{3})+$)/g, '$1 '); // 12 345 678


    Можно и без регулярок. Строку разбить в массив, развернуть, к каждому третьему символу приделать пробел (идём с конца, получается), собрать в строку:

    var n = 123456789;
    
    var a = n
      .toString(10)
      .split('').reverse()
      .map(function(e,i){ return (i%3 ? e : ""+e+" ")})
      .reverse()
      .join('')
      .trim()
    ;
    // a = "123 456 789"


    Disclaimer: некорректно может обработать знак минус!
    Ответ написан
    2 комментария
  • Как в середине функции узнать какой метод был вызван?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Предположу, что в примере вызова у вас опечатка, и вы хотели вызывать test.on() – со скобками.

    Обернуть в Proxy, но это не будет работать в старых браузерах и IE и вообще сомнительно, что именно это вам требуется. Может, пересмотреть весь код?
    var test=function(){  
      console.log("method:", arguments[0]);
    };
    
    var handler = {
      get: function( target, name) {
        var _method;
        if(name in target) {
          return target[name];
        } else {
          return target.bind( null, name); // если не определено свойство, передаем его 1-м аргументом
        }
      }
    };
    
    test = new Proxy( test, handler);
    
    test.on(); // method: on
    test.blabla(); // method: blabla
    test(); // method: undefined
    Ответ написан
    Комментировать
  • Как делается текст из частиц (particles)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно такой текст отрисовать в SVG и дать атрибут stroke-dasharray, чтобы по периметру букв получился пунктир точками. Размножить слой и разнести по оси Z, чтобы получился небольшой объём.

    Более экспериментальный вариант, плохо поддерживаемый браузерами, CSS3 свойство text-stroke (-webkit-text-stroke). Смысл тот же – сделать обводку букв пунктиром и наделать копий слоя со смещением по Z.

    И, наконец, можно всё это отрисовать в canvas.
    Ответ написан
    Комментировать
  • Почему цикл не повторяется?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем коде цикл while не содержит в «теле» ничего – после скобок сразу закрывается точка-с-запятой.

    Вот так вы, наверное, имели в виду:
    var answer;
    do {
      answer = prompt("Скажи 'стоп'", "");
      document.write("Ты сказал '" + answer + "'.");
    } while (answer !== "стоп");


    Есть два варианта while-цикла:
    1. while( условие) { действия }
    2. do{ действия } while( условие )
    В этой задаче точно нужен второй: сначала надо выполнить действия (попросить сказать «стоп»), а потом уже проверить условие (что ввел пользователь?).
    Ответ написан
    3 комментария