Ответ 1
this.hash
вернет "#foo"
, который также является допустимым идентификатором [docs]. Следовательно, $(this.hash)
совпадает с $("#foo")
и выберет элемент с ID foo
.
Во втором примере у вас нет элемента с идентификатором bar
. Таким образом, $(this.hash)
не будет выбирать какой-либо элемент, а target.length
будет 0
.
Возможно, вас смущает тот факт, что браузер все еще перескакивает на <a name="bar"></a>
, хотя alert
не отображается. Браузер не ведет себя так же, как jQuery.
Из спецификации HTML об атрибуте name
:
Этот атрибут называет текущий якорь, чтобы он мог быть местом назначения другой ссылки. Значение этого атрибута должно быть уникальным именем привязки. Область действия этого имени - текущий документ. Обратите внимание, что этот атрибут имеет то же пространство имен, что и атрибут id.
Итак, если браузер распознает хэш (идентификатор фрагмента) в URL-адресе, он пытается найти первый элемент с этим идентификатором или первым элементом a
с этим именем.
В отличие от селекторов CSS ID (то, что использует jQuery), выполняется поиск только элементов с этим идентификатором, а не для элементов (a
) с этим именем. Внутри jQuery использует document.getElemenById
.
Если хэш-значение всегда ссылается либо на идентификатор, либо на имя, вы можете использовать множественный селектор, чтобы сделать только один выбор:
$(this.hash + ', a[name="' + this.hash.substr(1) + '"]')
В случае, если будет элемент с этим идентификатором и якорь с этим именем, вы должны выбрать все из них.