Привет! Я поклонник Discourse, представляю небольшое сообщество, которое обсуждает переход с vBulletin5. Один человек выступал против Discourse, заявив: «Хищническое перенаправление Ctrl+f — это зло». После того как я понял, что он имел в виду, вынужден согласиться. В текущей реализации Discourse есть серьёзная проблема с удобством использования, связанная с обработкой сочетания клавиш Ctrl+f, которое в браузере служит для поиска текста на странице.
Проблема
- Иногда Ctrl+f работает как положено: Discourse использует встроенную функцию поиска браузера, и страница прокручивается к первому совпадению сразу по мере ввода. Переход к следующему совпадению осуществляется через Ctrl+G.
- Всё отлично.
- Иногда Ctrl+f не работает, а вместо этого отображается список результатов поиска по базе данных.
- Страница не прокручивается к первому совпадению по мере ввода.
- Искомая фраза подсвечивается только если она уже находится на экране.
- Невозможно искать слишком короткие термины, например «UX».
- Не работает переход к следующему совпадению через Ctrl+G.
- При этом отображаются результаты по нерелевантным темам, которые Ctrl+f не показал бы, если бы не нашёл термин на странице.
- Причина сбоя полностью невидима для пользователей, но это крайне раздражает. Они чувствуют, что возможность поиска по странице исчезла без каких-либо объяснений.
- Не помогает и совет нажать Ctrl+f дважды для запуска поиска браузера, так как это не найдёт посты, которые фактически существуют на странице.
Корень проблемы
Это не косметическая проблема, а фундаментальная issue с удобством использования, которую Discourse необходимо решить на корню: иллюзия того, что вся переписка находится в DOM браузера, тогда как на самом деле она загружается динамически.
Когда в теме больше двадцати постов, Discourse отправляет их в браузер только по мере необходимости. Вы можете просмотреть тему с более чем 1000 сообщений практически без нагрузки на сервер, поскольку большая часть DOM состоит из пустых заглушек. Это блестящая идея, но именно она приводит к тому, что Ctrl+f загадочным образом перестаёт работать.
Я не предлагаю отказываться от этой иллюзии, так как считаю её ценной. Discourse правильно поступил, отказавшись от старого способа разбивки переписки на произвольные страницы по 40 сообщений.
Discourse просто должен лучше обеспечивать бесшовность этой иллюзии.
Решения
Честно говоря, я не знаю лучшего решения, но у меня есть несколько идей, которые, надеюсь, окажутся полезными.
Осознанное нарушение иллюзии
Во-первых, вот несколько простых и разумных идей, если Discourse всё же решит нарушить иллюзию, переключившись на поиск по базе данных:
- Сообщить пользователю, что происходит. Добавить небольшую заметку там, где обычно появляется окно поиска браузера, с извинениями и объяснением.
- «Извините, но в этой теме 1002 сообщения, а ваш браузер загрузил только 7 из них, поэтому поиск по странице, скорее всего, не сработает. Если хотите попробовать, нажмите Ctrl+f ещё раз».
- Предоставить пользователю некоторый контроль. При нажатии Ctrl+f показывать кнопку, позволяющую вручную загрузить текст всех постов темы в DOM.
- Если это невозможно из-за ограничения в 100 постов, кэшируемых в браузере одновременно, показать кнопку, позволяющую вернуться к старому способу просмотра тем: разбитым по страницам.
- «Нажмите здесь, чтобы просмотреть эту тему способом, совместимым с Ctrl+f: [Страница 1] [2] [3] [4] [5] [6] [7] [8] [9] […] [>>]».
- Увеличить значение по умолчанию с 20 до 100 постов. Это может быть не слишком сложно реализовать, поскольку Discourse уже способен кэшировать такое количество постов в DOM.
Восстановление иллюзии
Конечно, эти идеи неидеальны, и я рассматриваю их лишь как временные меры. В конечном итоге лучшим решением будет реализация в Discourse функционала Ctrl+f, работающего так, как ожидают пользователи. Повторение в Discourse того, что делает браузер для интерактивного поиска, того стоит, хотя, вероятно, это сложно.
Однако, возможно, существует (относительно) простое решение.
Не удалять текст из DOM
Я считаю, что лучшее решение для Discourse — удалять из постов только медиаобъекты, но не текст. Тогда не будет необходимости «хищнически перенаправлять» Ctrl+f и заменять его поиском по базе данных.
Поиск по странице ищет только текст, поэтому браузеру не обязательно иметь полностью загруженный DOM для его выполнения. Текст передаётся крайне эффективно, особенно если на HTTP-сервере включено сжатие gzip. Кроме того, текст занимает мало памяти в веб-браузере.
Вы, конечно, знаете это лучше меня, но у меня есть несколько предположений:
- Средний размер поста: 5 КиБ текста.
- Средняя длина темы: 50 ответов.
- Средний объём передаваемого текста: 250 КиБ, что кажется разумным.
Конечно, каждый байт важен для отзывчивости. Если мои оценки неверны и размер текста станет проблемой, заполнение DOM текстом можно выполнить как фоновый процесс после отправки основных частей страницы. Если к моменту нажатия пользователем Ctrl+f DOM ещё не полностью заполнен текстом, может появиться индикатор, сообщающий пользователю подождать и показывающий прогресс по мере поступления текста.
Спасибо
Хотя проблема с неработающим Ctrl+f серьёзно нарушает иллюзию, созданную Discourse, я впечатлён потрясающей работой разработчиков Discourse по созданию этой иллюзии изначально. Я уверен, что они в конечном итоге найдут правильное решение и для этой проблемы.
Спасибо за то, что уделили время рассмотрению моих предложений.
С уважением,
Мкс. Ф.Н.