• Как называется эффект такого искажения? И есть ли готовые решения на js?

    lazalu68
    @lazalu68
    Salmon
    Подобное можно нагуглить по запросу "js text liquid distortion". На кодропс есть демка чего-то похожего, можно на её основе сделать то что вам нужно.
    Ответ написан
    1 комментарий
  • Где взять wysiwyg редактор?

    lazalu68
    @lazalu68
    Salmon
    Вот целый список действующих wysiwyg-редакторов: https://github.com/JefMari/awesome-wysiwyg
    Ответ написан
    Комментировать
  • Кто сталкивался с нарушением как принудительная перерисовка при выполнении JavaScript сценария в DOM?

    lazalu68
    @lazalu68
    Salmon
    Отвечая на вопрос "почему так происходит?": потому что у вас реализован достаточно сложный грид со сложными условиями, к элементам которого вы еще динамически применяете какие-то кастомные стили (конкретно речь о сдвиге), вынуждающие движок перерисовывать всё-всё-всё - как элементы после целевого, так и до. Решение - либо не юзать грид (не знаю насколько это адекватный выход), либо (что мне кажется более адекватным) реализовать сдвиг как-нибудь по-другому. Например сгруппировать ячейки в строки, и двигать уже эти строки, попутно не влияя на другие элементы; это полностью решит проблему тотальной перерисовки.

    Еще можно попытаться оптимизировать уже имеющийся код, ибо в нем дофига лишнего, но по сути это проблемы не решит.
    Ответ написан
  • Как привязать динамически созданный input к FormGroup?

    lazalu68
    @lazalu68 Автор вопроса
    Salmon
    В итоге я бросил идею генерировать элементы ввода с помощью document.createElement/append, теперь их генерацией занимается рекурсивно вызываемый сложный шаблон, в котором эти поля и привязаны к экземпляру FormGroup (решение описано тут).
    Ответ написан
    Комментировать
  • Как обработать XML в качестве шаблона?

    lazalu68
    @lazalu68 Автор вопроса
    Salmon
    В итоге задача решена почти так как и предложил Gennady S: данные из XML переведены в JSON, получившаяся структура обрабатывается с помощью компонентов, которые рекурсивно вызывают друг друга (сделано по материалам из статейки Ben Nadel: Playing With Recursive Components in Angular). В каждый из этих компонентов явно передается ссылка на экземпляр FormGroup, таким образом все поля ввода без проблем могут быть привязаны к одной форме.

    Пример структуры описывающей форму
    {
      "type": "Container",
      "id": "filter",
      "children": [
        {
          "type": "HorizontalLayout",
          "spacing": true,
          "children": [
            {
              "type": "TextField",
              "id": "code",
              "caption": "Код",
              "width": "100px"
            },
            {
              "type": "TextField",
              "id": "label",
              "caption": "Наименование",
              "width": "200px"
            },
            {
              "type": "TextField",
              "id": "days",
              "caption": "Дней",
              "width": "100px"
            },
            {
              "type": "TextField",
              "id": "months",
              "caption": "Месяцев",
              "width": "100px"
            },
            {
              "type": "Check3Box",
              "id": "isActive",
              "caption": "Активен",
              "height": "20px",
              "alignment": "bottom_left"
            },
            {
              "type": "Check3Box",
              "id": "isAbsDeleted",
              "caption": "Удален в АБС",
              "height": "20px",
              "alignment": "bottom_left"
            }
          ]
        }
      ]
    }

    Часть main.component.html

    <ng-template [ngIf]="filterForm">
        <form [formGroup]="my_awesome_form">
            <my-tree [rootNode]="elements" [form]="my_awesome_form"></my-tree>
        </form>
    </ng-template>

    Часть main.component.ts

    // создаём форму
    public my_awesome_form = new FormGroup({});
    
    // получаем описание лэйаута
    public elements = some_data_service.getLayout();
    
    // достаем из лэйаута только поля ввода
    const inputs = Utils.deepFind(this.elements, 'caption', '');
    
    // привязываем поля к форме
    inputs.forEach((input) => {
        this.filterForm.addControl(input.id, new FormControl(null));
    });

    TreeComponent
    import {Component} from "@angular/core";
    import {LayoutElement} from "@toolkit/models/layout.model";
    import {FormGroup} from "@angular/forms";
    
    @Component({
      selector: "my-tree",
      inputs: [
        "rootNode",
        "form"
      ],
      outputs: [],
      template: `<my-tree-node [node]="rootNode" [form]="form"></my-tree-node>`
    })
    export class TreeComponent {
      public rootNode: LayoutElement | null;
      public form: FormGroup;
    
      constructor() {
        this.rootNode = null;
      }
    }

    TreeNodeComponent

    import {Component} from "@angular/core";
    import {LayoutElement} from "@toolkit/models/layout.model";
    import {FormGroup} from "@angular/forms";
    
    @Component({
      selector: "my-tree-node",
      inputs: [
        "node",
        "form"
      ],
      outputs: [],
      template:
          `
          <ng-template [ngIf]="node && node.type">
              <span [ngSwitch]="node.type" [formGroup]="form">
                  <!-- пример создания контейнера -->
                  <div *ngSwitchCase="'Container'">
                      <div *ngIf="node.children">
                          <ng-template ngFor let-child [ngForOf]="node.children">
                              <my-tree-node [node]="child" [form]="form"></my-tree-node>
                          </ng-template>
                      </div>
                  </div>
                  <!-- пример создания поля ввода -->
                  <ng-template [ngSwitchCase]="'TextField'">
                      <input type="text" [attr.placeholder]="node.caption" [formControlName]="node.id"/>
                  </ng-template>
                  <!-- обработка не зарегистрированного типа -->
                  <div *ngSwitchDefault>
                      <div class="p-3 mb-2 bg-danger text-white">Element of type "{{ node.type }}" can't be processed!</div>
                  </div>
              </span>
          </ng-template>
        `
    })
    export class TreeNodeComponent {
      public node: LayoutElement | null;
      public form: FormGroup;
    
      constructor() {
        this.node = null;
      }
    }
    Ответ написан
    Комментировать
  • Как скачать много писем из gmail?

    lazalu68
    @lazalu68 Автор вопроса
    Salmon
    По мотивам переписки в комментариях: первый же попавшийся под руку thunderbird справился с задачей, так что его можно считать решением.
    Ответ написан
    Комментировать
  • Как вызвать метод getStepIndex?

    lazalu68
    @lazalu68
    Salmon
    Там есть примеры
    Ответ написан
    Комментировать
  • Почему ошибка в template?

    lazalu68
    @lazalu68
    Salmon
    Комментировать
  • Почему не отображается результат JS?

    lazalu68
    @lazalu68
    Salmon
    Не знаю почему у вас не работает, собрал по быстрому, вроде все норм.
    Ответ написан
    2 комментария
  • Будет ли забиваться память при таком коде и правильно ли организован класс?

    lazalu68
    @lazalu68
    Salmon
    Может остальным все понятно, а для меня тут какая-то сатана необъяснимая происходит. Если отбросить глобальные вопросы типа "зачем нужно чтоб блок посылал себя сам" и "почему функция отправки не реализована вне класса", то остаётся еще много:
    1. Зачем в create вообще таймаут,
    2. Зачем в экземпляре хранится current_block?
    3. Зачем еще один блок создаётся в init?
    4. Вопрос связан с предыдущим: зачем нужно внутри метода класса создавать еще один экземпляр этого класса?
    5. Зачем create отдаёт current_block который нигде не используется?

    Отвечая на ваш вопрос: я вижу тут кучу вроде как лишних действий, но не вижу ничего, что бы не мог собрать GC. Есть какие-то конкретные причины думать, что GC не справится? Собственно, я даже проверил (это можно сделать за несколько секунд из консоли), память не забивается

    ЗЫ: если отвечаете, то нажимайте кнопку "ответить", а то я ваш ответ чисто случайно заметил. И код лучше закатать либо в спойлеры, либо в интерактивные примеры в песочнице (codepen, jsfiddle).
    Ответ написан
  • Как сделать скролл по блокам?

    lazalu68
    @lazalu68
    Salmon
    Из комментариев: fullpage.js
    Ответ написан
    Комментировать
  • Как сделать такие летающие сердечки?

    lazalu68
    @lazalu68
    Salmon
    Элемент #leafContainer, реализация в кеше autoptimize, начиная с 2769 строки. Все достаточно просто и читаемо.
    Ответ написан
  • Как «заставить» терминал VS Code выполнять команды php сервера XAMPP?

    lazalu68
    @lazalu68
    Salmon
    По мотивам переписки в комментариях: полагаю у вас просто нету в PATH ссылки на директорию с php. Попробуйте её добавить вручную и проверить, доступен ли php из cmd.
    Ответ написан
    Комментировать
  • Как работает Array.prototype.slice.call?

    lazalu68
    @lazalu68
    Salmon
    call это метод который позволяет вызвать функцию и явно указать её контекст, то есть объект к которому эта функция будет иметь доступ по идентификатору this. Slice это метод массива с помощью которого можно получить копию части или всего массива.

    Node.children принадлежит классу HTMLCollection, поэтому у него нету методов доступных массивам, хоть он и по структуре идентичен массиву. А slice копирует эту коллекцию только уже в виде массива, в результате чего к этому же самому набору элементов мы можем применить методы присущие массивам.

    Зы: если у вас в переменной index должен лежать актуальный порядковый номер элемента, то совсем не обязательно для этого гонять slice+indexOf; для этого в объекте элемента есть соответствующее свойство. Хотя это говорят быстрее работает
    Ответ написан
    1 комментарий
  • Как вы используете фреймворки Vue/Angular/React?

    lazalu68
    @lazalu68
    Salmon
    Ну вот например мне недавно понадобилось параметризовать существующее ng приложение, мне сразу ответили что для этого нужно связать с CMS. Так что полагаю один кейс уже найден: это может быть нужно чтобы организовать простой графический интерфейс управления данными.
    Ответ написан
    Комментировать
  • Как достать из css файла все уникальные цвета используемые там?

    lazalu68
    @lazalu68
    Salmon
    Hsl/a, rgb/a, hex3/4/6/8 можно собрать относительно простыми регулярками, а цвета прямо по ключевым словам придётся таскать из таблицы наверное. Можно подойти с другой стороны: не конкретные форматы искать, а просто пройтись по списку всех нужных цветовых свойств, например искать только цвета указанные в color, background-color, border-color

    UPD: оказывается существует некий css-color-extractor который этим и занимается
    Ответ написан
    Комментировать
  • Какой язык можно использовать вместо JavaScript на фронтенде?

    lazalu68
    @lazalu68
    Salmon
    Зависит от того, что конкретно вы хотите. Если просто нужен транспайлер из одного языка в JS, то таких тысячи и тысячи. Да, все правильно: существует транспайлер и из питона в JS, и из brainfuck в JS. В конечном счете все равно это будет JS, но по сути писать вы можете на чем хотите. Emscripten for the win!

    Dart - это вкусно.

    Еще можно выкрутиться с помощью wasm, он почти что для этого и существует. Подавляющее большинство возникших поначалу проблем в нем уже решены.
    Ответ написан
    Комментировать
  • Как правильно во vue вставить svg?

    lazalu68
    @lazalu68
    Salmon
    Был похожий вопрос, вот , на который сам же автор ответил настолько исчерпывающе, что его можно использовать как готовый мануал по теме, причем мануал хорошего уровня кошерности, ибо xlink во все поля.
    Ответ написан
    Комментировать
  • Лента новостей, как ее вывести в расширение Mozilla?

    lazalu68
    @lazalu68
    Salmon
    По мотивам переписки в комментариях:

    Если вы не знаете как работают расширения в огнелисе, то читайте официальные мануалы или смотрите примеры (вот этот кстати почти ваш случай описывает, вам останется только убрать лишний функционал и добавить вывод своих данных). Получение фида RSS очень мало чем отличается от получения любых других данных, так что трудностей возникнуть не должно.

    "И непонятно используется там phph или это js" - добрый вечер) Extension это расширение для браузера, оно реализовано полностью на веб-технологиях, то есть js+css+html.
    Ответ написан
    1 комментарий