Ответы пользователя по тегу JavaScript
  • Есть список слов, как найти слова которые начинаются с буквы P?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var items = $("li").filter( function() {
       return this.innerHTML.indexOf("P") === 0;
    });
    Ответ написан
    Комментировать
  • Как написать JS цикл выводящий от 1 до 100, имеющий 2 дополнительных условия?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я понял задачу так, что нужно выводить все числа, но кратные – как текст, а не число:
    var n = 0;
    while( ++n <= 100) console.log( ( !(n & 1) || n % 3 === 0) ? n.toString() : n);


    Для проверки делимости на 3 можно тоже воспользоваться битовым фокусом. Сосчитать 1 в нечетных позициях, вычесть число 1 в чётных – если разница делится на 3, то и число делится. Например, 99 (01100011) – разница = 0, делится.
    Ответ написан
  • Как рандомно вывести три элемента из array в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function getRandom(arr, n) {
        var result = new Array(n),
            len = arr.length,
            taken = new Array(len);
        if (n > len)
            throw new RangeError("getRandom: more elements taken than available");
        while (n--) {
            var x = Math.floor(Math.random() * len);
            result[n] = arr[x in taken ? taken[x] : x];
            taken[x] = --len;
        }
        return result;
    }

    Отсюда.
    Ответ написан
    2 комментария
  • Какой создать хеш при передачи api?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Например, как это реализовано у ВКонтакте. Посетитель авторизуется на основном сайте. Для выполнения запросов к api он получает токен – хэш от его id, иногда ip адреса или подсети, «секрета» самого ВК, «секрета» приложения. С любым запросом к api идёт этот хэш, который гарантирует только то, что запрос пришёл от имени такого-то пользователя (и с валидного IP, а не «вдруг» с другого континента).

    Кроме этого, при запросе вычисляется хэш от параметров запроса и «секрета» приложения. Это позволяет убедиться в том, что параметры запроса не подделаны в клиенте – т.к. «секрет» приложения не покидает серверов и не попадает в клиент.
    Ответ написан
    Комментировать
  • Регулярка рационального числа, javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регулярка не нужна, вероятно. Когда отпускают клавишу на этом инпуте, всё переводите в число без точки (в 100 раз бОльшее задуманного) и отрисовываете с точкой в нужном месте, добивая нулями при необходимости:

    var $el = $('#calc');
    
    $el.on('keyup', function(){
      var s = parseInt(
    	  $el.val().replace(/[^0-9-]/g,'')
    	).toString(10);
    	s = ('0000' + s).substr(-Math.max(4,s.length));
      $el.val('' + s.substr(0, s.length - 2) + '.' + s.substr(-2));	
    });


    Fiddle
    Ответ написан
    4 комментария
  • Как одновременно клонировать 3 id?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Копии – после всех оригиналов:
    var src = $("#clone_1,#clone_2,#clone_3");
    src.last().after( src.clone());


    После каждого оригинала – его копия:
    $("#clone_1,#clone_2,#clone_3").each( function(){
        $(this).after( $(this).clone());
    });
    Ответ написан
  • Как спарсить людей состоящих в группе во вконтакте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Конечно, надо использовать API ВКонтакте. Разберитесь, это несложно. Вам понадобится метод groups.getMembers().

    Выкладывал на github пример скачивания списка Участников групп ВКонтакте. Демо. Там используется web worker для скачивания, учитывается лимит в 3 запроса в секунду. Запросы группируются в пачки по 25 в метод execute() для скорости скачивания списков Участников крупных групп.
    Ответ написан
    Комментировать
  • Как решить задачку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    document.write((function(n){
      var html='', i=0;
      while(i++<n) html+=i.toString().repeat(i)+"<br>";
    	return html;
    })(9));
    Ответ написан
    Комментировать
  • Как назначить событие при добавлении нового класса JQuery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Через MutationObserver можно. Пример (не мой).
    Ответ написан
    Комментировать
  • Как отрисовать многострочный текст svg?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В SVG можно вставить foreignObject – в частности, html, где перенос строк решается просто.

    Если вы новичок в SVG, для скорейшего получения результата лучше воспользоваться библиотекой, например, D3js. Вот пример, как вставлять в SVG кусок HTML контента в D3js. И другой подход – пример автоматической генерации SVG-элементов под каждую строку текста.

    В вашем случае, как я понял, график не динамический, раз нарисовали и забыли. В таком случае можно поручить отрисовать его в векторе вашему дизайнеру, и вывести статичный SVG код. Вы с ним легко разберётесь и навесите логику при наведении. Например, Adobe Illustrator умеет экспортировать графику в SVG.

    Кроме того, раз лейблы статичные, можно просто отрисовать по одному элементу <text> на каждую из строк.
    Ответ написан
    Комментировать
  • Как укоротить createElement в javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Коротко в смысле записи – сделайте алиас метода:
    var dc = document.createElement.bind(document,'div');
    var div1=dc(), div2=dc(), div3=dc();


    Если есть список, вы говорите, то как-то так:
    'div,div1,div2,div3,div4,div5'  // имена переменных через запятую
      .split(',') // сделали из строки массив, разбив по запятой
      .map( (e)=>{ this[e]=document.createElement("div")}) // наделали переменных в текущем контексте
    ;


    То же для старых браузеров:
    var context = this;
    'div,div1,div2,div3,div4,div5'  // имена переменных через запятую
      .split(',')
      .map( function(e){ context[e]=document.createElement("div") })
    ;
    Ответ написан
    Комментировать
  • Как перебрать массив у которого индекс состоит из строки?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Когда вы создаёте строковые «индексы» у объекта массива, это просто создаёт новые свойства у этого объекта, но они не являются индексами массива. Иногда говорят, «в JavaScript всё является объектом» (что не совсем так). Но массив – это как раз вполне себе объект.
    var a = new Array(3); // [null,null,null]
    a['aaa'] = 'AAA';
    a['bbb'] = 'BBB';
    a.length // по-прежнему 3


    Т.е. такое обращение с массивом некорректно. Все методы массива, напр. map(), reduce(), проигнорируют добавленные вами свойства.

    Для вашей задачи правильнее создать вместо массива пустой объект:
    var ne_array = {};
    ne_array['one'] = 1;
    ne_array['two'] = 2;
    ne_array['three'] = 3; 
    
    for( var property in ne_array) {
      console.log( property,  ne_array[ property]);
    }
    Ответ написан
    Комментировать
  • Как удалить соединение в случае если пользоваетеь перещел на другую страницу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    повесить в window.onbeforeunload код, отправляющий какой-то unsubscribe?

    Или удвоить траффик – ожидать обязательного ответа от клиента на каждое сообщение с сервера – заодно это поможет очень примерно оценивать скорость связи с этим клиентом.
    Ответ написан
    Комментировать
  • Как правильно подсчитать количество определенных символов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Поможет метод substr(). Например "Lorem".substr(1,1) === 'o' это true.
    function count( char, str) {
      var i, n;
      for(i=0, n=0; i<str.length; i++) {
        // здесь вы самостоятельно напишете магию!
      }
      return n;
    }
    console.log( count( "q", "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perferendis, quo voluptatum. Alias quisquam et ad aperiam illo earum debitis unde ipsa doloremque, tempore animi qui amet ullam accusamus quidem, ducimus."));

    Вот, я разогрел публику для вас! : )
    Ответ написан
    Комментировать
  • Как сделать ник в виде брута?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Разбить строку посимвольно в массив, заменять символы на случайные. По ходу времени двигать слева направо позицию, до которой строка «отгадана» – там уже символы не заменять. Накрученный массиво снова собрать в строку и показать. Эту процедуру расчёта одного «кадра» повторить через небольшую задержку по времени. Повторять до тех пор, пока вся строка не «разгадается».

    (function( nick, el) {
      var L = nick.length
        ,cursor = 0
        ,arr
        ,timeout
        ,prob = 0.05 // вероятность "разгадывания" очередной позиции
        ,rate = 25  // частота "кадров" в секунду
        ,delay = 1000 / rate
      ;
    
      function tweak() {  
        arr = nick.split('');
        for(pos = cursor; pos < L; pos++) {
          arr[pos] = String.fromCharCode(
            1024 + Math.round( (1279 - 1024) * Math.random() )
          );
        }
        el.innerText = arr.join('');
        
        if( cursor === L) return; // done
        
        if( Math.random() < prob) cursor++;
        timeout = window.setTimeout( tweak, delay);
      }
    
      tweak();
      
    })( "Sergei Sokolov", document.getElementById("effect") )


    fiddle
    Ответ написан
    8 комментариев
  • Как синхронизировать время на таймере между сервером и браузером с помощью JS?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Наверное, надо написать что-то похожее на cинхронизацию времени между клиентом и серверами в NTP. Это потребует нескольких запросов к серверу, чтобы оценить время отклика – т.е. не сразу с загрузки страницы удастся точно запустить таймер. Показать его можно сразу, и в течение следущих секунд скорректировать. Есть готовое решение: NTPJS, не пробовал.

    В простейшем варианте можно обойтись одним AJAX запросом после полной загрузки страницы. Запомнить текущее локальное время var tPing = (new Date).getTime();, запросить ajax'ом с сервера его текущее время tServ, получить ответ и запомнить локальное время tPong, когда ответ получен. И положиться на очень грубую гипотезу, что сервер ответил точно посередине интервала tPing..tPong. Т.е. решить, что разница серверного времени и локального составляет ровно tDiff = tServ - tPing + (tPong - tPing) / 2;

    Теперь для получения предполагаемого серверного «точного» времени, просто прибавлять к текущему локальному времени этот tDiff.
    Ответ написан
    1 комментарий
  • Как реализовать "ожидание" события?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    События. Когда буква встаёт на место, она запускает событие. Слушатель этого события должен проверить, правильно ли собрано всё слово, и если да – перейти к следующему.

    Вероятно, вы ещё сделаете минимальную анимацию ликования по поводу очередного собранного слова, чтобы в игре был какой-то ритм и не было суеты.

    Для слов – вести какой-то счётчик. Удобно задавать предложения просто текстовой строкой, бить её на слова по пробелу, затем работать с каждым словом по очереди, обновляя указатель на «текущее» слово.
    Ответ написан
    6 комментариев
  • Можно ли как нибудь разблокировать выделение на сайте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно в консоли выполнить функцию отменяющую злодейства блокировки:
    (function(e) {
    	if (typeof e.onselectstart != "undefined") e.onselectstart = null;
    	else if (typeof e.style.MozUserSelect != "undefined") e.style.MozUserSelect = "text";
    	else e.onmousedown = null;
    	e.style.cursor = "default"
    })(document.body)
    Ответ написан
    3 комментария
  • Как найти в двух массивах объектов одинаковые значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для двух массивов строк или чисел алгоритм был бы такой:
    1. отсортировать оба по возрастанию;
    2. взять нулевые элементы и сравнить, кто больше;
    3. брать следующее значение из того массива, где было мЕньшее;
    4. так двигаться до конца одного из массивов или первого найденного равенства.


    Можно применить алгоритм, зная особенности именно этой задачи. Известно, что полей два, называются id и item, значения у них целые. Сделаем из каждого массив псевдо-хэшей, чтобы вместо массива объектов иметь дело с массивом строк.

    function haveCommon(a,b) {
        var phash = function(e){ return '' + e.id + '.' + e.item }
           ,ha = a.map(phash).sort()
           ,hb = b.map(phash).sort()
           ,ia = 0
           ,ib = 0
        ;
        while( ia<ha.length  &&  ib<hb.length) {
            if( ha[ia] > hb[ib]) ib++;
            else if( ha[ia] < hb[ib]) ia++;
            else return true;
        }
        return false;
    }
    
    haveCommon( [{"id":1, "item": 213}]
        ,[{"id":1, "item":  213}, {"id":78, "item":  21}, {"id":19, "item":  13}]
    ) // true
    Ответ написан
    Комментировать
  • Как распарсить строку и проверить, входит ли в нее число?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function isin( v, sInterval) {
      var ranges;
      try{ ranges = JSON.parse('[' + sInterval + ']') }
      catch( e) {
        console.log("Error parsing json: " + e.message);
        return -1;
      }
      
      for( i=0; i<ranges.length; i++) {
        pair = ranges[i];
        if( v >= pair[0] && v <= pair[1]) return 1;
      }
      return 0;
    }
    
    isin( 42, "[1,250],[251,500]"); // 1 – найден, 0 – не найден, -1 – ошибка.
    Ответ написан
    Комментировать