Ответы пользователя по тегу JavaScript
  • Адаптивные модальные окна, лучшее решение. Какое оно?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    arcticlab.ru/arcticmodal - маленькая css и правильная обработка прокрутки. Вариант, предложенный @pchelovek, прокрутку вообще игнорирует.
    Ответ написан
    6 комментариев
  • Пишу html/css/js песочницу для будущих курсов по веб- разработки. Как с помощью JQuery связать div и iframe?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Содержимое не испаряется, а переносится. DOM-элемент не может быть одновременно в нескольких местах. Потому, когда ты делаешь append, происходит перемещение элемента из старого места в новое. Это не имеет никакого отношения к событию click.

    Сначала элемент необходимо клонировать (для чего в jQuery есть метод clone), а уже созданный клонированием новый элемент вставлять.

    И возьми за правило явно объявлять все локальные переменные посредством слова var - чтобы не выискивать потом по несколько часов причины непонятных глюков.
    Ответ написан
  • Как собрать многоуровневый массив?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Зачем такие сложности? Всё делается намного проще - без рекурсий и проверок множества дополнительных условий:

    $input = 'Шла Саша по шоссе и сосала сушку';
    
    $inp_arr = preg_split('#[[:space:]]+#s', trim($input)); // Список обрабатываемых слов
    $current = array(); // Список уже обработанных слов
    $result  = array(implode(' ', $inp_arr)); // Добавляем в результат исходную фразу
    while (count($inp_arr) > 1) { // Пока в списке обрабатываемых не менее 2 слов
      $head = array(); // Голова списка обрабатываемых слов
      $tail = $inp_arr; // Хвост списка обрабатываемых слов
      while (count($tail) > 1) { // Пока в хвосте не менее 2 слов
        $head[]   = array_shift($tail); // Перенос первого слова хвоста в конец головы
        // Добавляем комбинацию в результат
        $result[] = array_merge($current, array(implode(' ', $head), implode(' ', $tail)));
      }
      $current[] = array_shift($inp_arr); // Перенос первого слова обрабатываемых в уже обработанные
    }
    
    var_export($result);


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

    $input="Шла Саша по шоссе и сосала сушку";
    $result=generate(preg_split('#[[:space:]]+#s', trim($input)));
    var_export($result);
     
    function generate($inp){
      $out=array(implode(' ', $inp));
      $head=array();
      while(count($inp)>1){
        $head[]=array_shift($inp);
        foreach(generate($inp) as $val){
          $out[]=array_merge(array(implode(' ', $head)), (array)$val);
        }
      }
      return $out;
    }

    Если нужно сортировать по длинам строк, то достаточно изменить порядок обработки: предыдущий вариант начинает перебор с пустой головы и длинного хвоста, а надо с длиной головы и пустого хвоста:

    function generate($inp){
      $out=array(implode(' ', $inp));
      $tail=array();
      while(count($inp)>1){
        array_unshift($tail, array_pop($inp));
        foreach(generate($tail) as $val){
          $out[]=array_merge(array(implode(' ', $inp)), (array)$val);
        }
      }
      return $out;
    }

    Если же нужно отсортировать результат по длинам строк независимо от того, в какой позиции эта строка находится, то проще всего - как и сказал @Fesor - использовать отдельную сортировку результата. Например, вот так:

    usort($result, function($val_1, $val_2){
      // Получение кол-ва слов в строках сравниваемых вариантов
      $len_1=array_map(function($data){ return count(preg_split('#[[:space:]]+#s', $data)); }, (array)$val_1);
      $len_2=array_map(function($data){ return count(preg_split('#[[:space:]]+#s', $data)); }, (array)$val_2);
    
      // Массивы кол-ва слов, отсортированные по убыванию
      $sort_len_1=$len_1;
      $sort_len_2=$len_2;
      rsort($sort_len_1);
      rsort($sort_len_2);
    
      // Проверяем, что два варианта имеют разное кол-во слов в строках
      for($i=0; $i<count($sort_len_1); $i++){
        if($sort_len_1[$i]!=$sort_len_2[$i]){
          return $sort_len_2[$i]-$sort_len_1[$i];
        }
      }
    
      // К данному моменту варианты по длинам строк уже отсортированы
      // Этот цикл сортирует варианты с одинаковыми длинами по местоположению длинных строк
      // Если такая сортировка не требуется - удалить цикл
      for($i=0; $i<count($len_1); $i++){
        if($len_1[$i]!=$len_2[$i]){
          return $len_2[$i]-$len_1[$i];
        }
      }
    
      return 0;
    });
    Ответ написан
  • Как на jquery запретить всплывать событие scroll?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    event.stopPropagation() отключает другие пользовательские обработчики, повешенные на данное событие, но не влияет на всплытие. Всплытие события запрещается вызовом event.preventDefault(). Часто оба запрета используются одновременно:

    event.preventDefault();
    event.stopPropagation();
    Ответ написан
  • Как отобразить прогессбар для каждого загружаемого файла?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Прежде чем задавать подобные вопросы, советую хотя бы посмотреть демо-примеры. Там есть демки с прогресс-барами для каждого файла.
    Ответ написан
    1 комментарий
  • Как скопировать текст из переменной в буфер обмена Google Chrome?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Нажать F12 - откроется панель разработчика. Там перейти на вкладку Console (js-консоль).
    Ввести команду console.log(имя переменной);
    Отобразившееся содержимое переменной выделить мышкой и скопировать в буфер обмена стандартным образом (Ctrl+C, или из меню по правой кнопке мыши).

    Ещё лучше - непосредственно в js-коде вставить команду console.log(имя переменной); - тогда содержимое переменной автоматически выведется в вышеуказанную консоль.

    Если же нужно программно работать с буфером обмена, то можно установить, например, плагин jQuery zClip: habrahabr.ru/post/159879
    Ответ написан
    Комментировать