Opened 3 years ago

Closed 2 weeks ago

#1064 closed улучшение (готово)

Использовать методы .text() / .val() вместо escapeHtml()

Reported by: alx Owned by: Denis_N
Priority: minor Component: БД изделий АДС
Keywords: Cc:

Description

В r133/base в файл script.js добавлена функция escapeHtml(), заменяющая определенные символы текста в HTML entities, которая потом используется для добавления произвольных строк текста в HTML-код.

Данный подход не очень хорош, так как, во-первых, требует чтобы каждый раз, когда к коду HTML добавляется произвольный текст, вызывать для него escapeHtml(), а во-вторых, само нагромождение таких вызовов затрудняет чтение кода (строка получается очень длинной, и в ней перемешаны и разметка HTML, и отображаемый текст, и вызовы функций)...

Предлагаю по возможности использовать немного другой подход: сначала создавать элемент документа, содержащий только структуру (разметку) без контента, а потом добавлять в его дочерние элементы контент методами text()/val()/prop(). Например вместо такого:

let div = $('<div class="InputField"><label>' + escapeHtml(labelText) + '</label><input type="text" name="recipient" class="recipient" maxlength="25" value="' + escapeHtml(recipient) + '"></div>');

писать так:

let div = $('<div class="InputField"><label/><input type="text" name="recipient" class="recipient" maxlength="25"></div>');
div.find('label').text(labelText);
div.find('input').val(recipient);

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

Этот тикет - просто как замечание-рекомендация к коммиту (к сожалению в trac нельзя добавить комментарий к коммиту, как, например, это можно сделать в github, поэтому пришлось создать тикет). Можно закрыть по прочтении... :)

Change History (10)

comment:1 by Denis_N, 3 weeks ago

Спасибо, Алексей. Замечание рекомендация принята. Попробую текущие файлы, где используется подправить

comment:2 by Denis_N, 3 weeks ago

В r605/base была удалена не используюема на текущий момент функция escapeHtml() из script.js.

А в других файлах есть свои отдельные функции с таким же именем:

js/main.js
js/universal_panel.js
js/orders.js
js/admin_panel.js
js/newscan.js

comment:3 by Denis_N, 3 weeks ago

In 606/base:

Убрано использование escapeHtml в admin_panel.js

  • таблица номенклатуры в админ-панели переведена на создание DOM-элементов
  • список сотрудников для QR-бейджей заполняется через .val() и .text()
  • таблица полок при массовом перемещении заполняется через .text()
  • превью QR-бейджа собирается DOM-элементами без HTML-строк с данными

See #1064

comment:4 by Denis_N, 3 weeks ago

In 607/base:

Убрана HTML-сборка строк в orders.js

  • таблица заказов, пагинация и сообщения состояния переведены на создание DOM-элементов
  • карточки состава заказа и скрытые поля S/N собираются через .text(), .val() и .attr()
  • preview серийных номеров, сводка состава, статусы и прогресс заказа переведены на DOM-сборку
  • удалены больше не используемые escapeHtml() и escapeAttr()

Данные из backend теперь вставляются как текст или значения полей, а не как HTML-строки.

See #1064

comment:5 by Denis_N, 3 weeks ago

In 608/base:

Убрана HTML-сборка строк в universal_panel.js

  • карточка изделия, журнал событий и панель действий переведены на создание DOM-элементов
  • таблица закрытия несоответствий и список протоколов собираются через .text(), .val() и .attr()
  • комментарии, статусы, события и данные изделия вставляются как текст, а не как HTML
  • удалены больше не используемые escapeHtml() и HTML_ENTITIES

See #1064

comment:6 by Denis_N, 2 weeks ago

In 610/base:

Убрана HTML-сборка строк в main.js

  • таблицы изделий и журнала событий переведены на создание DOM-элементов
  • экспорт CSV, timeline, протоколы и служебные состояния собираются через .text(), .val() и .attr()
  • события, комментарии, статусы, ссылки и данные изделий вставляются как текст, а не как HTML
  • удалены больше не используемые escapeHtml() и HTML_ENTITIES

See #1064

comment:7 by Denis_N, 2 weeks ago

In 611/base:

Убрана HTML-сборка строк в newscan.js

  • таблица смены версии переведена на создание DOM-элементов
  • поля режимов сканирования собираются через .text(), .val() и .attr()
  • подсказки сканера переведены на DOM-сборку
  • поиск строки по S/N больше не собирает CSS-селектор из данных
  • удалена больше не используемая функция escapeHtml

See #1064

comment:8 by Denis_N, 2 weeks ago

In 612/base:

Убраны оставшиеся HTML-вставки в script.js

See #1064

comment:9 by Denis_N, 2 weeks ago

In 613/base:

Убраны оставшиеся HTML-вставки в script.js

  • метка в фильтре трансформации создается DOM-элементом
  • контейнер списка автодополнения создается DOM-элементом

See #1064

comment:10 by Denis_N, 2 weeks ago

Resolution: готово
Status: newclosed

Выполнена переработка по замечанию: в рабочих JS-файлах проекта ручное экранирование через escapeHtml() заменено на создание DOM-элементов и заполнение данных через .text(), .val(), .attr().

Проверены и обновлены script.js, main.js, universal_panel.js, orders.js, admin_panel.js, newscan.js. Функции escapeHtml()/HTML_ENTITIES удалены, в этих файлах не осталось .html(), innerHTML и строковых HTML-вставок через append/prepend/before/after.

Закрываю как "Готово"

Note: See TracTickets for help on using tickets.