Подтвердить что ты не робот

Получить полный 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.

Вопрос в том, могу ли я полагаться на это?

4b9b3361

Ответ 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
}