Safari, Chrome и «решётка»
У браузеров на движке WebKit какое-то своё, фашисткое отношение к «решётке» (#), после которой указывается локальный якорь в URL.
Во-первых, когда устанавливаешь location.hash, где более одной «решётки», Safari и Chrome иногда перезагружают страницу (зачем?).
Во-вторых, вторая и последующие «решётки» кодируются как «%23» (ни один браузер больше так не делает).
В-третьх, если постоянно что-то делать с частью после решётки (например, каждые 10 миллисекунд прибавлять и убавлять один символ), то эти два браузера-моих-кровопийцы не позволят редактировать адрес.
Иногда я верю, что один браузер это хорошо.
Иногда.
Добавлено 13 декабря 0:40: в комментариях мне подсказываю, что, кодируя «решётку» как «%23», WebKit поступает по RFC. То есть, формально, претензий никаких. По смыслу же, мне кажется, что «решётку» тут кодировать не надо.
В том и проблема с одним браузером, что если попадётся не тот, то кабздец будет полным :-)
Мне, кстати ни один целиком не нравится. Даже у тех что можно подшкурить есть свои фундаментальные «особенности».
Согласно http://labs.apache.org/webarch/uri/rev-2002/rfc2396bis.html#fragment этот хеш (символ решётки) в строке может быть только один. Нигде не написано явно, что нельзя указать второй хеш после первого, но то, что сам фрагмент в URI может быть только один, сомнений не не вызывает. Поэтому не совсем понятно, зачем использовать более одной решётки в URI?
Комментарий для jankkhvej.blogspot.com:
http://tools.ietf.org/html/rfc3986#section-3.5:
То есть, «fragment» начинается с «#» и заканчивается концом строки. Никаких ограничений на использование символа решётки дальше RFC не накладывает. А что не запрещено, то разрешено.
Комментарий для zencd.livejournal.com:
Целиком и мне ни один не нравится. Кроме того, я понимаю, что конкуренция это хорошо.
Несколько хешей — это грубо говоря несколько позиций на странице. Скроллить в пять мест одновременно — это интересно. А то, что они используются не по назначению… дык, понятно, что будут глюки. /Мечтательно/ Вот бы новые урлы придумать и реализовать, с нормальными history (чтобы аяксом можно было пользоваться), убить хететепе-вевеве…
Комментарий для Евгения Степанищева:
fragment = *( pchar / «/» / «?» )
pchar = unreserved / pct-encoded / sub-delims / «:» / «@»
unreserved = ALPHA / DIGIT / «-» / «.» / «_» / «~»
pct-encoded = «%» HEXDIG HEXDIG
sub-delims = «!» / «$» / «&» / «’» / «(» / «)»
/ «*» / «+» / «,» / «;» / «=»
легко видеть, что # не может быть частью fragment
Комментарий для bealex.moikrug.ru:
Какие несколько хешей? «#a#b» — это просто фрагмент с идентификатором «a#b» и только.
Комментарий для arty.name:
Да, пожалуй, WebKit действует тут по RFC. Спасибо!
Комментарий для Евгения Степанищева:
Уё… а зачем так сложно? Я как разделитель там дальше слэш использую. Хотя если надо, то тогда надо.
Комментарий для bealex.moikrug.ru:
Ну, вот именно что надо. Делал адресацию для testlink, в fragment сохраняли состояния трёх его фреймов. Разделителем я выбрал «#» (слеши уже в адресах есть). В итоге, из-за WebKit пришлось сделать восклицательный знак.
Как тут уже подсказали, RFC таки явно запрещает # в fragment. Так что это был плохой, негодный выбор. Я в своё время для аналогичной цели не замарачиваясь выбрал +, который легко преобразовывался в пробел и чудесно парсился.
Комментарий для jankkhvej.blogspot.com:
Для моей цели «+» не подходит, так как легко может встретиться в обычном URL, а я сохраняю во fragment состояние фреймов. «#» был отличный выбор, пока мне не встретились браузеры WebKit, так как в Testlink нет «решётки» в URL.
Комментарий для Евгения Степанищева:
Гм, но ведь в случае с ! он тоже может встретиться в обычном URL, как тут быть?
Комментарий для jankkhvej.blogspot.com:
Я же решаю конкретную задачу, о чём уже не раз упоминал. Там не встречаются «!» в URL.