Ответы пользователя по тегу JavaScript
  • Как вычислить сумму значений из последних 5 записей?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    JavaScript там не нужен, судя по вашему коду. Обойдёмся одним PHP:
    <?php
    $id	= 2743;	// ID заданной рубрики
    $n	= 5;	// количество выводимых записей
    $recent = new WP_Query("cat=$id&showposts=$n");
    $sum = 0;
    
    while($recent->have_posts()) {
    
    	$recent->the_post();
    
    	if( get_field("result") === 'Win') {
    		$value = get_field('koff') * get_field('summa');
    		$sum += $value;
    		$out = sprintf( '%01.2f', $value); // 1.23
    	} elseif( get_field("result") === 'open') {
    		$out = "&hellip;"; // троеточие
    	} else {
    		$out = '0.00';
    	}
    	
    	echo $out . ' рублей.';
    }
    
    printf( "<p>Сумма: %01.2f рублей.</p>", $sum);
    Ответ написан
    4 комментария
  • Почему some отрабатывает, а every нет?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    every()каждый») – более строгий, чем some()некоторые»)

    every() вернёт true только, когда по всем элементам выполнено условие.
    some() вернёт true, как только хотя бы в одном встретится выполнение условия.

    В вашем примере можно переписать без some() старым добрым indexOf():
    const availableVersions = versions.filter(
      version => !!~item.version_ids.indexOf( version.id )
    );

    Fiddle

    !!~ из любого значения, кроме -1, вернёт true, а для -1 вернёт false.
    Ответ написан
    Комментировать
  • Какой порог вхождения в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы начать, у вас уже всё есть: в любом браузере можно прямо сейчас написать простое выражение на JS типа 5 + 6 и получить результат. Например, в FireFox это можно сделать в Консоли разработчика (Ctrl + Shift + K) или в интерактивном блокноте (Scratchpad Shift + F4). Т.е. устанавливать на комп ничего не нужно.

    Что делать дальше, чтобы было интересно – слишком индивидуально, чтобы предлагать. Меня, например, увлекает генерируемая графика. Написал формулу, правила, и генерируется красивый узор. Для этого стоит погуглить про canvas, или разобраться с Processing JS.

    Можно делать простейшие, для начала совсем примитивные HTML5 игры, которые выкладывать в ВК или Телеграм, чтобы другие могли их пробовать. Делать что-то востребованное другими – тоже отличная мотивация развиваться.
    Ответ написан
    1 комментарий
  • Как опубликовать запись на стене в iframe vk с телефона?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Disclaimer я не сталкивался пока с публикацией на стену из мобильного клиента, поэтому не знаю решения, работающего наверняка.

    не пробовали JavaScript SDK использовать? В документации про окно подтверждения, откуда ваша цитата, этот вариант выглядит предпочтительнее. См. Вызов методов API ВК в JS SDK.
    Ответ написан
  • Как вывести javascript в зависимости от условий?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    См. задание строк heredoc синтаксом, форматированный вывод printf() и его спецификации формата в sprintf()
    <?php
    if( the_field('result') === 'Win') {
        $tmpl = <<<EOFSCRIPT
    <script type="text/javascript">
    var kof1 = %f, kof2 = %f, total_Sum;
    total_Sum = kof1 * kof2;
    document.write(total_Sum);
    </script>
    EOFSCRIPT;
      printf( $tmpl, the_field('koff'), the_field('summa')); 
    } else {
      echo '0';
    }
    ?>
    Ответ написан
  • Как написать данное условие на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    if( !~document.body.className.indexOf('home_body')) {
      // do something for non-homepage
    }
    Ответ написан
  • JS, как сделать поиск в строке и выполнить условие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Брать каждое из проверочных слов и по очереди искать в данном тексте.

    text.indexOf(keyword) вернёт -1 если ключевое слово не найдено в тексте. Или его позицию от 0 и больше, если нашлось. См. indexOf()

    Выражение !!~x вернёт true для x == 0 или больше, и false только для x == -1.

    Примерно так:
    function areYouThere(str) {
      var i, j, found = 0, filters = [
        "яблоко, лимон, груша".split(', '),
        "вишня, арбуз, клубника".split(', '),
        "каштан, тарелка, борщ".split(', ')
      ];
      
      for( i = 0; i < filters.length; i++) {
        for( j = 0; j < filters[i].length; j++) {
          if( !!~str.indexOf(filters[i][j])) found = found | 1 << i;
        }
      }
      
      return found;
    }
    
    var mask = areYouThere("арбуз вам не яблоко!");
    if( mask & 1 << 0) alert (1);
    if( mask & 1 << 1) alert (2);
    if( mask & 1 << 2) alert (3);
    Ответ написан
    2 комментария
  • Как выбрать элемент по значению?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Перебирать все HTML узлы, и сравнивать их значения с образцом..
    Ответ написан
    Комментировать
  • Максимальное число в массиве, как правильнее?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Конечно же, второй вариант: list[0].
    Доказательство: найти максимум в массиве отрицательных чисел.

    А быстрее встроенным методом Math.max():
    Math.max.apply(null, list)
    Ответ написан
    2 комментария
  • Как с помощью js удалить часть текста из атрибута href?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Например, есть ссылка
    <a href="http://site.ru/en/post" id="myLink">click me</a>

    Тогда путём нехитрой замены подстроки в свойстве href получится желаемое:
    var a = document.getElementById("myLink");
    a.href = a.href.replace( '/en/', '/');

    (и не нужны тут регулярные выражения)
    Ответ написан
    3 комментария
  • Версия OS и браузера?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. HTTP заголовок User-Agent.

    Например, готовая реализация: faisalman/ua-parser-js. Её демо.
    Ответ написан
    Комментировать
  • Какие сервисы для продажи js скриптов, вы знаете?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    github, за «звёзды» : )
    Ответ написан
    Комментировать
  • Как сделать, чтобы при наведении мышкой на элемент, его цвет менялся случайным образом каждый раз?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция, меняющая цвет, всего в две строчки:
    var randomColor = function(e){
      var r = () => Math.round(Math.random()*255);
      e.target.style.color = "rgb(" + [r(),r(),r()].join(',') + ")";
    }


    С jQuery её повесить, например, на заголовок вопроса тут:
    $('H1.question__title').on('mouseover', randomColor);

    Или на чистом JavaScript:
    document.querySelector('h1.question__title')
      .addEventListener('mouseover', randomColor);
    Ответ написан
    Комментировать
  • Как получить токен вк из строки iframe?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Никак, не поднявшись «над» браузером:
    • установленное в браузер расширение;
    • полностью подконтрольный безголовый браузер типа PhantomJS;
    • web view в вашем приложении
    Ответ написан
    2 комментария
  • Говнокод или нет?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Код г-но неидеален, и вот, почему:
    см. комменты в коде
    let a = prompt("Enter a value", 10); // a, b, c дальше не меняются
    let b = prompt("Enter b value", 10); // поэтому можно
    let c = prompt("Enter c value", 10);  // const
    let result;
    let discr = (b * b ) - 4 * a * c;
    let sqrtDiscr = Math.sqrt(discr); // при отрицат. discr здесь NaN
    if(a === 0 && b === 0 && c === 0) { // проверяем уже после вычислений
      throw new Error("The values must be bigger than 0");
    } else if(discr < 0 ){ // проверяем уже после вычисления sqrtDiscr
      throw new Error("This Equation have not solution");
    } else if(discr === 0 ){
      console.log("This Equation have only 1 solution")
      result = (-b) / (2 * a);
    } else if (discr > 0){
      console.log("This Equation have 2 solution");
      result = (- b + sqrtDiscr) / (2 * a) + ";     " + (- b - sqrtDiscr) / (2 * a);
    }
    
    console.log(result);


    По функциям разбивать есть смысл если из нескольких мест идёт обращение, код повторяется более двух раз. Тут можно в двух последних случаях считать два корня одной формулой, и при нулевом дискриминанте брать только одно из двух равных значений. Но это излишняя, дурная, вредная переоптимизация.

    Ещё вы не проверили случай, когда a === 0: у вас будет деление на ноль.
    Ответ написан
    2 комментария
  • Как составить все возможные комбинации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Рекурсивный алгоритм:
    1. На первой позиции должна побывать каждая из букв.
    2. Выбрали первую – надо всеми возможными способами перебрать оставшиеся. Смотрим на задачу точно так же: из (n - 1) букв надо перебрать все варианты. Go to 1)
    мопед – мой
    function permut8(arr, prepend) {
      var i, version, el, result = [];
      prepend = prepend || [];
      if(arr.length === 1) return [arr];
      for( i=0; i<arr.length; i++) {
        if( arr.length === 2) {
          result.push( prepend.concat( [arr[i], arr[(i+1)%2]] ));
        } else {
          version = arr.slice();
          el = version.splice(i,1);
          result = result.concat( permut8( version, prepend.concat(el)));
        }
      }  
      return result;
    }
    
    var test = permut8( 'abcd'.split('') );
    test.map( e=>e.join(' ')).join("\n")
    /*
    a b c d
    a b d c
    a c b d
    a c d b
    a d b c
    a d c b
    b a c d
    b a d c
    b c a d
    b c d a
    b d a c
    b d c a
    c a b d
    c a d b
    c b a d
    c b d a
    c d a b
    c d b a
    d a b c
    d a c b
    d b a c
    d b c a
    d c a b
    d c b a
    */
    Его минус в том, что он не учитывает значения элементов. Если встретятся повторяющиеся – создадутся дублирующиеся варианты. Например, из ["a", "a"] получим два одинаковых [["a", "a"], ["a", "a"]]

    Нерекурсивный алгоритм.
    longclaps говорит, давай, мол, напишем, чтобы корректно без повторов генерил и при повторяющихся элементах.

    Использовал известный с 14 века нерекурсивный алгоритм индуса Нарайана Пандита. Из любого порядка в массиве генерится следующая итерация, учитывая лексикографический (по алфавиту) порядок сортировки.
    Мопед – мой, мыт
    function nextLexInPlace(arr){
      var i, a = -1, b = -1;
      for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
      if( !~a) return; // no more permutations
      for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
      swap(arr, a, b);
      a++;
      b = arr.length - 1;
      while( a < b) swap(arr, a++, b--);
      return true;
    }
    
    function swap( arr, a, b) {
      var xx = arr[a];
      arr[a] = arr[b];
      arr[b] = xx;
    }
    
    function allMutations( source) {
      var result = [], arr = source.slice();
      result.push( arr.sort().slice());
      while( nextLexInPlace(arr)) result.push(arr.slice());
      return result;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]

    И тот же мопед, но
    с генератором
    function* permutator(arr) {
      var i, a, b;
    
      function swap( arr, a, b) {
    		var xx = arr[a];
    		arr[a] = arr[b];
    		arr[b] = xx;
    	}
      
      yield arr.slice();
    
      while(true) {
        a = -1, b = -1;
    		for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
    		if( !~a) return;
    		for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
    		swap(arr, a++, b);
    		b = arr.length - 1;
    		while( a < b) swap(arr, a++, b--);
    		yield arr.slice();
      }
    }
    
    function allMutations( source) {
      var all = [], result, G = permutator(source.slice().sort());
      while(true) {
        result = G.next();
        if(result.done) break;
        all.push( result.value);
      }
      return all;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]
    Ответ написан
    Комментировать
  • Как реализовать Вращение объекта за хвостик Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Math.atan2() возвращает угол в радианах. Их же можно потом использовать в transform: rotate( 123rad);

    Потом, не забывайте, что изначально ваш угол больше на 1/8 оборота, поэтому из полученного угла надо вычесть PI/4.

    Сделал по-своему пример.

    Хотел было добавить transition: transform 0.08 для плавности, но появляется проблема перескок при пересечении нуля. Когда угол вдруг меняется с минус-Пи на плюс-Пи, глупый transition проводит крутилку через полный оборот.
    Ответ написан
    5 комментариев
  • Как перебрать массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сделать объект, где ключами будут эти значения id (при повторном назначении дубля не возникает).
    Потом забрать ключи (как строки) и отдать их как массив чисел.
    Object
      .keys(
        groups.reduce((p,c) => { c.items_ids.map(e => p[e] = e); return p; }, {})
      )
      .map(
        s => parseInt(s)
      )
    Ответ написан
    Комментировать
  • Как правильней сложить дробные числа?

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

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Плагин jQuery marquee (демо)
    Ответ написан
    Комментировать