примечание: это не правильный ответ! Но я оставлю это здесь на случай, если он будет полезен другим пользователям Sizzle.
Это ошибка в Sizzle (библиотека селектора, используемая jQuery).
Проблема в том, что при доступе к link.href
в JavaScript вы не получаете текст атрибута href
, вы получаете разрешенный абсолютный URL. Естественно, это начинается с http://
, а не #
.
Когда вы звоните link.attr('href')
jQuery обнаруживает особый случай и применяет обходной путь. Когда вы используете селектор, Sizzle нет. Он пытается:
attrHandle: {
href: function(elem){
return elem.getAttribute("href");
}
},
но этот обходной путь не работает в IE до версии 7, так как они делают getAttribute
равным простому получению свойства JavaScript. [Правильный обходной путь - использовать getAttributeNode
вместо этого, или анализировать IE и использовать проприетарное расширение getAttribute('href', 2)
.]
Таким образом, механизм выбора получает http://...
для атрибута href, и, конечно, он никогда не совпадает с ^=#
.
Если вы делаете это самостоятельно с функцией фильтра, она должна работать:
$('a.foo, a.bar').filter(function() {
return $(this).attr('href').substring(0, 1)==='#';
})...