Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Safari, Chrome и «решётка»

У браузеров на движке WebKit какое-то своё, фашисткое отношение к «решётке» (#), после которой указывается локальный якорь в URL.

Во-первых, когда устанавливаешь location.hash, где более одной «решётки», Safari и Chrome иногда перезагружают страницу (зачем?).

Во-вторых, вторая и последующие «решётки» кодируются как «%23» (ни один браузер больше так не делает).

В-третьх, если постоянно что-то делать с частью после решётки (например, каждые 10 миллисекунд прибавлять и убавлять один символ), то эти два браузера-моих-кровопийцы не позволят редактировать адрес.

Иногда я верю, что один браузер это хорошо.

Иногда.

Добавлено 13 декабря 0:40: в комментариях мне подсказываю, что, кодируя «решётку» как «%23», WebKit поступает по RFC. То есть, формально, претензий никаких. По смыслу же, мне кажется, что «решётку» тут кодировать не надо.

14 комментариев
zencd.livejournal.com 2009

В том и проблема с одним браузером, что если попадётся не тот, то кабздец будет полным :-)

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

jankkhvej (jankkhvej.blogspot.com) 2009

Согласно http://labs.apache.org/webarch/uri/rev-2002/rfc2396bis.html#fragment этот хеш (символ решётки) в строке может быть только один. Нигде не написано явно, что нельзя указать второй хеш после первого, но то, что сам фрагмент в URI может быть только один, сомнений не не вызывает. Поэтому не совсем понятно, зачем использовать более одной решётки в URI?

Евгений Степанищев (bolknote.ru) 2009

Комментарий для jankkhvej.blogspot.com:

http://tools.ietf.org/html/rfc3986#section-3.5:

A fragment identifier component is indicated by the presence of a number sign («#») character and terminated by the end of the URI

То есть, «fragment» начинается с «#» и заканчивается концом строки. Никаких ограничений на использование символа решётки дальше RFC не накладывает. А что не запрещено, то разрешено.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для zencd.livejournal.com:

Целиком и мне ни один не нравится. Кроме того, я понимаю, что конкуренция это хорошо.

Александр Бабаев (bealex.moikrug.ru) 2009

Несколько хешей — это грубо говоря несколько позиций на странице. Скроллить в пять мест одновременно — это интересно. А то, что они используются не по назначению… дык, понятно, что будут глюки. /Мечтательно/ Вот бы новые урлы придумать и реализовать, с нормальными history (чтобы аяксом можно было пользоваться), убить хететепе-вевеве…

arty (arty.name) 2009

Комментарий для Евгения Степанищева:

fragment = *( pchar / «/» / «?» )
pchar = unreserved / pct-encoded / sub-delims / «:» / «@»
unreserved = ALPHA / DIGIT / «-» / «.» / «_» / «~»
pct-encoded = «%» HEXDIG HEXDIG
sub-delims = «!» / «$» / «&» / «’» / «(» / «)»
                  / «*» / «+» / «,» / «;» / «=»

легко видеть, что # не может быть частью fragment

Евгений Степанищев (bolknote.ru) 2009

Комментарий для bealex.moikrug.ru:

Какие несколько хешей? «#a#b» — это просто фрагмент с идентификатором «a#b» и только.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для arty.name:

Да, пожалуй, WebKit действует тут по RFC. Спасибо!

Александр Бабаев (bealex.moikrug.ru) 2009

Комментарий для Евгения Степанищева:

Уё… а зачем так сложно? Я как разделитель там дальше слэш использую. Хотя если надо, то тогда надо.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для bealex.moikrug.ru:

Ну, вот именно что надо. Делал адресацию для testlink, в fragment сохраняли состояния трёх его фреймов. Разделителем я выбрал «#» (слеши уже в адресах есть). В итоге, из-за WebKit пришлось сделать восклицательный знак.

jankkhvej (jankkhvej.blogspot.com) 2009

Как тут уже подсказали, RFC таки явно запрещает # в fragment. Так что это был плохой, негодный выбор. Я в своё время для аналогичной цели не замарачиваясь выбрал +, который легко преобразовывался в пробел и чудесно парсился.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для jankkhvej.blogspot.com:

Для моей цели «+» не подходит, так как легко может встретиться в обычном URL, а я сохраняю во fragment состояние фреймов. «#» был отличный выбор, пока мне не встретились браузеры WebKit, так как в Testlink нет «решётки» в URL.

jankkhvej (jankkhvej.blogspot.com) 2009

Комментарий для Евгения Степанищева:

Гм, но ведь в случае с ! он тоже может встретиться в обычном URL, как тут быть?

Евгений Степанищев (bolknote.ru) 2009

Комментарий для jankkhvej.blogspot.com:

Я же решаю конкретную задачу, о чём уже не раз упоминал. Там не встречаются «!» в URL.