Comments 26
В старом Firefox (в районе 3.5) был баг. То ли "#", то ли "/", выдавался как обычно или закодированный (как в encodeURIComponent), в зависимости от способа получения: через полный href или hash: location.href.split('#').slice(1).join('#') или location.hash.replace(/^#/, '');
Но сейчас это неактуально, наверное. Во всяком случае, в FF9 не воспроизводится.
Но сейчас это неактуально, наверное. Во всяком случае, в FF9 не воспроизводится.
Значит, я на это скорее всего нарвусь. У нас сейчас разработка под Fx3.6.12.
Наверное, вот это оно: bugzilla.mozilla.org/show_bug.cgi?id=483304
«нашла… видела… пропустила...»
Мицгол, с вами все в порядке?..
Мицгол, с вами все в порядке?..
От примеров волосы встали дыбом. Неужели кто-то умудряется такое писать? О_о
никогда бы не додумался первый символ регэкспами убирать.
И помниться в какой-то опере хеш возвращался без решетки. так что приходилось делать так:
var hash=location.hash;
if(hash.indexOf('#')==0) hash=hash.substr(1);
И помниться в какой-то опере хеш возвращался без решетки. так что приходилось делать так:
var hash=location.hash;
if(hash.indexOf('#')==0) hash=hash.substr(1);
Читая первую половину статьи, думал что неужели я что-то не понимаю, и почему бы просто не сделать substr().
Но нет, оказывается всё ок, а проблема просто высосана из пальца.
Но нет, оказывается всё ок, а проблема просто высосана из пальца.
С хэшем всё понятно, а что делать с document.title?
а как по поводу?
/^#?([^#]+)/
От тестового хэша «#foo@o#bar$%huh hello» останется кусок «foo@o».
Незачёт.
Незачёт.
/^#?([^#]+)(.*)/
Ну и брать $1 + $2
А вы уверены что такой хеш валиден?
Согласно 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, на который опирается док (не, как ни странно не более новая версия):
Во-первых я не вижу здесь '#', а во-вторых — юникода.
Да, в w3c это лишь WD (уже 5 с лишним лет, а вы говорите чтоб проприетарщину не тащили без обсуждения!), но всё равно есть же еще rfc, которые являются стандартом.
Так что те кто тащит такие символы в хэш — ССЗБ.
Вот введёт хром/IE/FF полноценную валидацию урла, и порушится код.
Согласно 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 в сыром виде.
Вот пример:
Вот итог интерпретации этого примера:
test
↑ Нажимаем на эту гиперссылку, затем в консоли Файерфокса (Ctrl+Shift+K) смотрим значение location.hash и видим"#test1#test2".
Проверяем location.hash.match(/^#?([^#]+)/)[1] и видим"test1".
Проверяем location.hash.match(/^#?(.*)$/)[1] и видим"test1#test2".
Всё, эксперимент окончен.
Что отнюдь не отменяет доступа к нему через DOM в сыром виде.
Вот пример:
<a href="#%74%65%73%74%31%23%74%65%73%74%32">test</a>
Вот итог интерпретации этого примера:
test
↑ Нажимаем на эту гиперссылку, затем в консоли Файерфокса (Ctrl+Shift+K) смотрим значение location.hash и видим
Проверяем location.hash.match(/^#?([^#]+)/)[1] и видим
Проверяем location.hash.match(/^#?(.*)$/)[1] и видим
Всё, эксперимент окончен.
> Нажимаем на эту гиперссылку, затем в консоли Файерфокса (Ctrl+Shift+K) смотрим значение location.hash и видим "#test1#test2".
Нажимаю на эту гиперссылку, затем в консоли Хрома (Ctrl+Shift+I) смотрим значение location.hash и видим "#%74%65%73%74%31%23%74%65%73%74%32".
Эксперимент можно и не начинать, ибо сразу видно искажение стандарта FF.
Нажимаю на эту гиперссылку, затем в консоли Хрома (Ctrl+Shift+I) смотрим значение location.hash и видим "#%74%65%73%74%31%23%74%65%73%74%32".
Эксперимент можно и не начинать, ибо сразу видно искажение стандарта FF.
Sign up to leave a comment.
Считываем hash: пуленепробиваемый способ