LINUX.ORG.RU

Плохо работают якоря

 , ,


0

2

Я не отлавливал дату и время когда это началось. И даже могу неверно описать что там в каком порядке происходило, какие изменения вносились. И, конечно, я не смотрел в историю коммитов. Пишу как вижу.

Некоторое время назад перестали нормально работать якоря.

Якорь — это:

(1) Когда что-то типа:

<a name="cid123456789"></a>
Над блоком с комментарием.

(2) В любом месте ссылка:

<a href="/forum/talks/987654?cid=123456789">Ссылка</a>

(3) Расчёт номера страницы на которой будет в искомом треде искомый комментарий, затем редирект туда:

/forum/talks/987654?cid=123456789#cid123456789

Так вот. Сейчас у нас имеется только второй пункт. Первого нет. Третий есть, но без якоря. Вернее так. Якорь, там, в строке запроса, на доли секунды появляется, а затем бесследно исчезает.

Я не помню, были ли когда-либо якоря именно такими, обычными, или никогда не были. Не обращал внимания. Они просто работали.

Теперь, при посещении ЛОРа со старого браузера при переходе по «якорю» не работает докрутка до самого комментария. Сообщение то выделяется. Но скролл не приходит к комментарию. Надо доматывать руками ища этот красный бордюрчик. Ладно. Пусть браузер старый. Тут я, типа, смирился.

Но сегодня я словил несколько раз то же самое с мобильного хрома. Т.е. потенциально, эта проблема возникает не только на старых браузерах.

Ситуации, при которых ломается «якорь», разнообразны. Это может быть уход на внешний ресурс, а затем возврат по истории посещения обратно на ЛОР, но, уже не на то место скролла. Это случается и при внутренних переходах даже при кликах на «Ответ на комментарий».

Пожалуйста, уберите все эти ненужные редиректы, жаваскрипт -хистори, -скроллы и прочую чушь, если таковая имеется. И сделайте простые обычные якоря в ссылке. Якорь тут сам докрутит до комментария. И это будет гарантированно работать на любом утюге.

А если у нас и так простые якоря — тогда разберитесь почему оно так криво работает.

Заранее спасибо.

maxcom

+++, бесит. Не работает на последнем Chrome, и PaleMoon.

stasolog ()

Подтверждаю в ропере на винде и на андроиде; не подтверждаю ни в фф, ни в опере на онтопике. От чего зависит для меня до сих пор загадка, но один стабильный сценарий точно есть: если при клике на «Ответ на» случается переход на предыдущую страницу, то возврат по Back не отрабатывает перемотку на якорь.

leave ★★★★★ ()

Это начало происходить после того, как клоун BrainFucker aka @pyroman aka @Ya_gnu_linux или как там его, который постоянно тут регался и донимал @Pinkbyte’а, закоммитил вот это (см. первые коммиты):

https://github.com/maxcom/lorsource/commits?author=rekcuFniarB

При этом он ещё и умудрился знатно обосраться, добавив какой-то там loop без sleep’а, который выжирал 100% ресурсов CPU у пользователей LOR при посещении сайта:

Firefox сходит с ума на удалённых ссылках

Вот такой он нынче этот ваш JavaScript Development.

@maxcom +1 за git revert.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Firefox сходит с ума на удалённых ссылках

О! И сюда уже добрались «chrome only developers»!

deep-purple ★★★★★ ()

Подтверждаю странное поведение с некоторого момента.

aquadon ★★★★★ ()

Подтверждаю.

Простейший способ воспроизвести:

1. Открываем тему «Ссылки на некоректные сообщения».

2. Переходим по ссылке на любой коментарий.

3. Жмём «назад» и попадаем на тему. К коментарию, в котором была ссылка не проматывается, хотя он выделяется красным.

shell-script ★★★★★ ()

Цель этого изменения была в том, чтобы получить ссылки на комментарии которые не зависят от настроек у пользователя.

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom

чтобы получить ссылки на комментарии которые не зависят от настроек у пользователя

Они и так не зависят. Я знаю про кол-во комментариев на странице.

deep-purple ★★★★★ ()
Ответ на: комментарий от XoFfiCEr

эти якоря давно уже не валидны! теперь такие якоря <div id=

Ну через жаваскрипт — да. Только нихрена они не работают как надо, как выяснилось. Поэтому — надо сделать нормальные через <a name=

deep-purple ★★★★★ ()
Ответ на: комментарий от maxcom

Как оно может работать без жаваскриптов:

Блок комментария (кратко, только важное):

<div class="comment">
    <a name="comment-15671546"></a>
    <div class="comment-text">Текст комментария</div>
    <a href="/go?cid=15671546">Ссылка</a>
</div>

Логика на бекенде при клике на «Ссылка» (кратко, только важное, псевдокод):

// проверили что комментарий существует и не удалён

// name - имя форума
// tid - айди треда
// cid - айди комментария

// айди треда и имя форума получаем из cid,
// номер страницы рассчитывается самостоятельно,
// в контексте настроек того пользователя,
// который запросил этот урл

commentPageNum = getCommentPageNum(tid, cid, user->commentsPerPage);

redirectTo('/forum/{name}/{tid}/page{commentPageNum}#comment-{cid}');

// в случае первой страницы часть роута /page{commentPageNum} отсутствует

ВСЁ!!!

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Так оно и работает, только в этом случае в адресной строке остается ссылка с якорем. Если её скопировать то она будет корректно работать только с теми же настройками (и даже с ними может сломаться при удалении комментов).

maxcom ★★★★★ ()
Ответ на: комментарий от EXL

Это начало происходить после того, как клоун BrainFucker aka @pyroman aka @Ya_gnu_linux или как там его, который постоянно тут регался и донимал @Pinkbyte’а

Потому что тот его (@firestarter) забанил. Помню, как тут ещё безуспешно под виртуалами пытался свой сабреддит рекламировать…

theNamelessOne ★★★★★ ()
Ответ на: комментарий от maxcom

только в этом случае в адресной строке остается ссылка с якорем

Вот так и должно. Но сейчас там подмена history через жаваскрипт. От этого положение якоря теряется.

и даже с ними может сломаться при удалении комментов

Не сломается — коммента нет, в расчёте общего кол-ва комментов он не участвует. Так, расчёт происходит в момент обращения к «/go?cid=15671546» то и редирект будет корректен.

deep-purple ★★★★★ ()
Ответ на: комментарий от maxcom

Что до ссылки, которая уже получилась после редиректа, а затем коммент был удалён, и только теперь мы обновили страницу — вот тут жаваскрипт уже к месту, чтобы, если не нашелся якорь на указанной странице — отправить его на «/go?cid=N» и тот уже либо сделает редирект на правильную, либо покажет страницу что коммент удалён.

Но вообще это как-то не очень. Ну удалили коммент. Ну и всё. По сути ничего тут уже делать и не надо.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Хочу напомнить, что сообщение о бане в профиле пользователя с которого всё началось( firestarter) гласит: «Блокирован 23.07.13 16:55:31, модератором Pinkbyte по причине: Троллинг и провокации в адрес модераторов. Забанен по результатам голосования»

Pinkbyte ★★★★★ ()
Ответ на: комментарий от maxcom

Ничего не мешает решить вопрос, куда слать клиента, на бекенде (при наличии cid, проверить правильный ли номер страницы указан), а не на фронте.

По факту, жаваскрипт на фронте либо не работает как надо вообще, либо работает, но коряво.

В любом случае что-то с этим делать надо. И моё предложение — сделать на бекенде, удалив все эти жаваскрипты на фронте.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 3)

Ещё бы пофиксить что когда от комментария к коментарию переходишь, а потом кнопку назад жмешь, выделение у комментария к которому ты переходил остаётся. Хотя, наверное, голосование надо.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от XoFfiCEr

в комментариях написано почему

Там чушь написана. Совсем не поэтому. А потому, что пустые теги депрекейтед. Да и вообще если у тега «a» тупо не указать атрибут «href» он станет обычным элементом. Сечёшь? Другое дело — вместо name=«x» можно юзать id=«x».

без всякого жабоскрипта зачем усложнять

Ну да — я и прошу удалить нахрен этот жаваскрипт.

deep-purple ★★★★★ ()
Ответ на: комментарий от maxcom

на backend она решена

А там её, походу и не было никогда.

нужен cid в ссылке, проблема чисто на фронте

Да. Поэтому я создал тред. И предлагаю решить «проблему фронта» на бекенде (cid туда попадает, можно перенаправить на любое место). Кстати, возможно будет даже лучше, если вопрос редиректа будет решать бекенд — поисковик пойдёт по ссылкам с новыми, актуальными, номерами страниц при выкашивании модераторами целых веток.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

я тоже делал такие якоря на странице а валидатор выдал что они уже устарели. Учи html не позорься так.

XoFfiCEr ★★★★ ()
Ответ на: комментарий от maxcom

А что мешает просто выпарсивать на бэкенде cid из якорей вместо того, чтобы много лет упорно орать пользователям, что они дураки и должны копировать ссылку из ссылки «Ссылка» вместо адресной строки, и в итоге прогнуться, всунув хисториапишный костыль?

К слову, это и проблему с уже запощёнными в старых тредах ссылками в формате tid#якорь или tid/page<n>#якорь решит, если перепрогнать по ним парсер lorcode->HTML.

Ещё минимальное решение: просто расширить хисториапишный костыль, генерируя ссылки и с якорем, и с cid. Но это выглядеть будет некузяво.

mertvoprog ()
Ответ на: комментарий от mertvoprog

Браузер не отправляет якоря в HTTP запросах.

Мне кажется единственная альтернатива существующему решению – в JS проверять наличие несуществующих якорей и делать редирект куда надо. Но такое решение сложнее и наверняка у него какие-то свои косяки вылезут.

Мне кажется надо существующий вариант забагфиксить, только пока не знаю как.

maxcom ★★★★★ ()
Последнее исправление: maxcom (всего исправлений: 2)
Ответ на: комментарий от maxcom

Браузер не отправляет якоря в HTTP запросах

Так и не нужно. Речь о ссылках, которые в посты копипастят.

Впрочем, если решать проблему на уровне парсинга поста, а адресную строку не трогать, то возникает другая проблема: ссылку с якорем и без cid могут скопировать куда-то вне ЛОРа, и потом по этой ссылке прийдут…

mertvoprog ()
Ответ на: комментарий от maxcom

я на выхах более подробно опишу принцип работы. ну, то как вижу как можно и рыбку сьесть и косточкой не подавиться.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от mertvoprog

А, видимо это только для LORCODE сделано. В markdown я забыл про это.

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom
<div id="comment-{commentId}"
        class="comment">
    <!--
        если будут проблемы со скроллом
        при использовании айдишника блока,
        при возврате на предыдущую страницу,
        всё же стОит проставить это:

        <a name="comment-{commentId}"></a>

    -->
    <div class="comment-text">Текст комментария</div>
    <a href="/forum/{forumName}/{topicId}[/page{pageNum}]?cid={commentId}#comment-{commentId}">Ссылка</a>
</div>

Квадратные скобки означают, что этот кусок урл не обязателен, если страница и так первая.

Часть урл «cid={commentId}» обеспечивает уникальность ссылки в пределах страницы для любого пользователя, вне зависимости от форума, топика и номера страницы. А уж все вместе эти параметры — тем более.

Ссылка формируется как есть с учётом настроек того пользователя, который просматривает эту страницу.

Если пользователь находится на этой странице и кликает на ссылку, то браузер совершает переход по якорю в пределах страницы не делая запросов к сайту.

Если пользователь скопировал эту «ссылку» и поместил её в любом месте, то, браузеры других пользователей, кликнувших на эту ссылку, в случае разных настроек кол-ва комментариев на страницу, будут обращаться к сайту (ЛОРу). Да и в любом случае, при получении этой ссылки каким-либо, отличным от первого, способом, браузер будет делать запрос.

Запросы обрабатывает единая точка входа: «/forum»(?).

Бекенд, получив следующие параметры:

forumName
topicId
pageNum
commentId

проверяет наличие форума, топика и комментария, и их контекст (удалён, не достаточно прав доступа и прочее что нужно).

Если контекст не удался — отвечаем как отвечали (404 и что там ещё есть/было).

Если контекст удался — рассчитываем номер страницы в соответствии с настройками обратившегося к бекенду пользователя (в том числе гостя или поискового бота).

Если старый (указанный в гет запросе) номер страницы равен рассчитаному — рендерим хтмл-страницу как обычно.

Если номер страницы не равен рассчитаному — формируем урл для редиректа:

/forum/{forumName}/{topicId}[/page{NEWPAGENUM}]?cid={commentId}#comment-{commentId}

Пользователь переходит редиректом на правильную для него страницу и его браузер корректно скроллит до якоря.

Никаких жаваскриптов с подменой истории не требуется.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от maxcom

В текущем варианте cid также имеются, в том или ином виде.

Не одуреют, склеют. И это касается только тех ссылок, у которых есть якорь и зависимость от пагинации (конкретный комментарий). Остальное же мы не трогаем.

Да и — сейчас тоже ж редирект есть. Только ссылка иначе выглядит. Поисковики склеивают же. В моем варианте тоже только один редирект, а ссылка всегда полная и всегда одного формата.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от maxcom

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

Вот webarchive в последние годы стал заметно хуже архивировать ЛОР, уже не связано ли это с какой-то инновацией в ссылках…

mertvoprog ()
Ответ на: комментарий от maxcom

Мысля: отрубить автоматический scrollRestoration и заменить его scrollTo() к нужному комментарию.

Только не факт, что всем такое понравится. Кто-то может, наоборот — взвыть, что при возврате на страницу вместо старой прокрутки опять прыгает к якорю. Обычный кейс: листаем после комментария тред дальше, видим ссылку, переходим, возвращаемся. По ходу, лучше оставить как есть, а @deep-purple не слушать ;)

mertvoprog ()
Ответ на: комментарий от mertvoprog

Ссылки с разным значением GET-параметра ведут, по факту, на одну страницу. Причём не всегда на одну, и не всегда стабильно

Это решается легко: https://support.google.com/webmasters/answer/139066?hl=ru

заменить его scrollTo() к нужному комментарию

Категорически НЕТ. Мой вариант вообще без жаваскриптов работает.

а @deep-purple не слушать ;)

Ататат!

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Это решается легко

Ну дык canonical тут и есть.

Мой вариант вообще без жаваскриптов работает.

Без жепьскриптов тут уже даже зарегистрироваться или оставить анонимный комментарий нельзя. ЛОР не торт.

Ататат!

Смотрите, Вы писали, что такое происходит, когда:

уход на внешний ресурс, а затем возврат по истории посещения обратно на ЛОР, но, уже не на то место скролла

Рассмотрим типичный кейс: пользователь попадает на страницу по ссылке на комментарий и листает её дальше. В каком-то из дальнейших комментариев видит внешнюю ссылку, переходит по ней в той же вкладке, потом возвращается. Ожидаемое поведение здесь — страница отмотана к тому же месту, где находится комментарий с этой внешней ссылкой. Вы же предлагаете вместо этого опять отпрыгнуть к комментарию, с которого начато чтение. Вредительство какое-то получается.

mertvoprog ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)