Pull to refresh

Comments 26

В старом Firefox (в районе 3.5) был баг. То ли "#", то ли "/", выдавался как обычно или закодированный (как в encodeURIComponent), в зависимости от способа получения: через полный href или hash: location.href.split('#').slice(1).join('#') или location.hash.replace(/^#/, '');

Но сейчас это неактуально, наверное. Во всяком случае, в FF9 не воспроизводится.
Значит, я на это скорее всего нарвусь. У нас сейчас разработка под Fx3.6.12.
«нашла… видела… пропустила...»
Мицгол, с вами все в порядке?..
Вы делаете вид, что Вам не заметно, что это перевод и что автор первоисточника — женщина?
От примеров волосы встали дыбом. Неужели кто-то умудряется такое писать? О_о
Если Вы про значение хеша с уникодом и прочим, то да. В бизнес приложениях адресующих страницы через хеш такое, и не только, возможно.
Нет, я про примеры способов отрезания диеза
Расстрою Вас: в этойнашей стране даже приговоры пишутся с грамматическими ошибками, а Вы тут про быдлокод…
никогда бы не додумался первый символ регэкспами убирать.

И помниться в какой-то опере хеш возвращался без решетки. так что приходилось делать так:

var hash=location.hash;
if(hash.indexOf('#')==0) hash=hash.substr(1);
ах, забыл. та же опера (к сожалению версий не помню, давно это было) выдавала ошибку при работе с переменной hash, аргументируя это тем, что вообще-то это не строка, и неплохо было бы сделать объявление так:
var hash=location.hash.toString();
Читая первую половину статьи, думал что неужели я что-то не понимаю, и почему бы просто не сделать substr().
Но нет, оказывается всё ок, а проблема просто высосана из пальца.
Он тоже может состоять из любых символов, например.
и что? любая строка может состоять из любых символов. но в нём же нет из браузера в браузер '#' в начале
От тестового хэша «#foo@o#bar$%huh hello» останется кусок «foo@o».

Незачёт.
/^#?([^#]+)(.*)/
Ну и брать $1 + $2
Ужé лучше.

Но слишком много возёхаться придётся.

Проще тогда сразу записать /^#?(.*)$/ что и предлагает Lea Verou.
А вы уверены что такой хеш валиден?
Согласно w3c «the value of the hash attribute the value of this attribute MUST be the string concatenation of the hash mark(#) and the fragment identifier».
По rfc, на который опирается док (не, как ни странно не более новая версия):
      fragment = *uric
      uric          = reserved | unreserved | escaped
      reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                      "$" | ","
      unreserved    = alphanum | mark
      mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
                      "(" | ")"

      escaped       = "%" hex hex
      hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                              "a" | "b" | "c" | "d" | "e" | "f"

      alphanum      = alpha | digit
      alpha         = lowalpha | upalpha

      lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
                 "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
                 "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
      upalpha  = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
                 "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
                 "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
      digit    = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
                 "8" | "9"


Во-первых я не вижу здесь '#', а во-вторых — юникода.
Да, в w3c это лишь WD (уже 5 с лишним лет, а вы говорите чтоб проприетарщину не тащили без обсуждения!), но всё равно есть же еще rfc, которые являются стандартом.
Так что те кто тащит такие символы в хэш — ССЗБ.
Вот введёт хром/IE/FF полноценную валидацию урла, и порушится код.
Этот стандарт говорит не о том, что идентификатор фрагмента не может содержать символ «#», а о том, что идентификатор фрагмента, когда записывается в URLе, обязан содержать этот символ в %-кодированном виде.

Что отнюдь не отменяет доступа к нему через DOM в сыром виде.

Вот пример:

<a href="#%74%65%73%74%31%23%74%65%73%74%32">test</a>

Вот итог интерпретации этого примера:

test

↑ Нажимаем на эту гиперссылку, затем в консоли Файерфокса (Ctrl+Shift+K) смотрим значение location.hash и видим "#test1#test2".

Проверяем location.hash.match(/^#?([^#]+)/)[1] и видим "test1".

Проверяем location.hash.match(/^#?(.*)$/)[1] и видим "test1#test2".

Всё, эксперимент окончен.
> Нажимаем на эту гиперссылку, затем в консоли Файерфокса (Ctrl+Shift+K) смотрим значение location.hash и видим "#test1#test2".

Нажимаю на эту гиперссылку, затем в консоли Хрома (Ctrl+Shift+I) смотрим значение location.hash и видим "#%74%65%73%74%31%23%74%65%73%74%32".
Эксперимент можно и не начинать, ибо сразу видно искажение стандарта FF.
Sign up to leave a comment.

Articles