Получить полный URI из свойства href ссылки
Я хотел бы получить подтверждение в какой-то момент.
Моя цель - всегда получать одну и ту же строку (это URI в моем случае) при чтении свойства href из ссылки. Пример:
<a href="test.htm" />
с base_url = http://domain.name/
<a href="../test.htm" />
с base_url = http://domain.name/domain/
<a href="#" onclick="location.href='http://domain.name/test.htm'; return false;" />
с base_url = любая папка из http://domain.name/
Мне нужно получить http://domain.name/test.htm
из трех вышеперечисленных ситуаций (или любой другой идентичной строки).
После некоторых тестов кажется, что my_a_dom_node.href
всегда возвращает полный URI, включая http://domaine.name, что должно быть в порядке для чего я хочу.
jQuery имеет другое поведение, а $(my_a_dom_node).attr('href')
возвращает содержимое (текст), которое появляется внутри HTML. Поэтому мой трюк заключается в использовании $(my_a_dom_node).get(0).href
для получения полного URI.
Вопрос в том, могу ли я полагаться на это?
Ответы
Ответ 1
ДА, вы можете положиться!
Когда люди использовали простой javascript (без jQuery), многие спрашивали противоположное тому, что вы просите, они хотели получить настоящий url, как написано в атрибуте href, а не полный, в таком случае они просто использовали сделать:
my_a_dom_node.getAttribute('href', 2); //works both IE/FF
Затем появилось jQuery, которое помогло людям не тратить время на то, чтобы узнать, что им нужен такой код, и jQuery всегда возвращает реальный url, как указано в атрибуте href.
Забавно, что теперь кто-то спрашивает, как получить полный url, потому что jQuery возвращает тот, который написан в атрибуте href.
Ответ 2
Да, вы можете положиться на это.
Просматривая исходный код jQuery (1.4.2), я вижу используемую функцию jQuery.attr()
(сконденсированную в соответствующие части):
jQuery.extend({
// ...
attr: function( elem, name, value, pass ) {
// ...
var attr = !jQuery.support.hrefNormalized && notxml && special ?
// Some attributes require a special call on IE
elem.getAttribute( name, 2 ) :
elem.getAttribute( name );
// Non-existent attributes return null, we normalize to undefined
return attr === null ? undefined : attr;
}
});
Таким образом, it'effectively вызывает elem.getAttribute('href')
, который возвращает фактическое значение атрибута, а свойство href
по дизайну возвращает канонический URL.
Однако есть ссылка на jQuery.support.hrefNormalized
, о которой должен сказать сайт поддержки jQuery:
-
hrefNormalized
: равен true, если метод .getAttribute()
извлекает атрибут href
элементов без изменений, а не нормализации на полный URL-адрес. (Это в настоящее время false в IE, URL-адреса нормированная). DOM l3 spec
В основном это означает, что jQuery самостоятельно обнаруживает поведение браузера и соответственно адаптируется для обеспечения согласованного результата.
Ответ 3
Я знаю, что это старый вопрос, но на самом деле это первая запись, которая появилась, я считаю, что полезно добавить дополнительное решение. С тех пор как jQuery ввел функцию "prop", получение полного URL-адреса так же просто, как:
$(my_a_dom_node).prop('href');
Я надеюсь, что все-таки поможет кому-то.
Ответ 4
Вы можете перекомпоновать полный URL-адрес, используя немного javascript:
function parseLink(link) {
var baseUrl = location.href.substring(0,location.href.lastIndexOf('/'));
if (link.indexOf('/') != -1) {
link = link.substring(link.lastIndexOf('/'));
} else {
link = "/"+ link;
}
var fullUrl = baseUrl + link;
return fullUrl
}