2010-04-14 10 views
21

Chciałbym mieć potwierdzenie w pewnym punkcie.Uzyskaj pełny identyfikator URI z właściwości href linku

Moim celem jest uzyskanie zawsze tego samego ciągu znaków (który jest identyfikatorem URI w moim przypadku) podczas odczytywania właściwości href z linku. Przykład:

<a href="test.htm" /> z base_url = http://domain.name/

<a href="../test.htm" /> z base_url = http://domain.name/domain/

<a href="http://domain.name/test.htm" /> z base_url = folder z http://domain.name/

Muszę http://domain.name/test.htm od 3 sytuacjach powyżej (lub innego identyczny ciąg).

Po kilku testach okazało się, że my_a_dom_node.href zawsze zwraca pełny, kwalifikowany identyfikator URI, w tym http://domaine.name, co powinno być w porządku dla tego, co chcę.

jQuery ma inne zachowanie i $(my_a_dom_node).attr('href') zwraca zawartość (tekst), która pojawia się wewnątrz HTML. Więc moją sztuczką jest użycie $(my_a_dom_node).get(0).href, aby uzyskać pełny URI.

Pytanie brzmi: czy mogę na tym polegać?

+3

BTW: '$ (my_a_dom_node) .get (0) .href' ==' $ (my_a_dom_node) [0] .href' – Tomalak

Odpowiedz

21

TAK, można polegać!

Kiedy ludzie używali prostego javascript (bez jQuery), wielu zadawało coś przeciwnego do tego, o co prosisz, chcieli uzyskać prawdziwy URL, jak napisano w atrybucie href, a nie pełny, w takim przypadku użyli po prostu zrobić:

my_a_dom_node.getAttribute('href', 2); //works both IE/FF 

Potem przyszedł jQuery, który pomógł ludziom, aby nie tracić czasu na znalezienie się oni potrzebują takiego kodu i jQuery zawsze zwraca rzeczywisty URL jak napisany w atrybucie href.

To zabawne, że teraz ktoś pyta, jak uzyskać pełny adres URL, ponieważ jQuery zwraca ten napisany w atrybucie href.

+0

Tak, znalazłem pytania, o których mówisz, kiedy pisałem moje pytanie. Dziękuję za Twoją odpowiedź. – Savageman

+0

Dlaczego podajesz drugi argument o wartości '2'? 'getAttribute' ma tylko jeden argument. – Noitidart

+0

@Noitidart: getAttribute zawiera dwa argumenty, drugi argument jest opcjonalny: http://msdn.microsoft.com/en-us/library/ms536429(v=vs.85).aspx –

1

Można recompose pełny adres URL przy użyciu trochę 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 
} 
+0

Czy to naprawdę działa dla KAŻDEJ podkatalogu i ścieżki względnej? Z mojego rozumienia tak nie jest. – Savageman

+0

Myślę, że tak, sprawa baseUrl jest całkiem prosta. Może ktoś mi udowodni, że się mylę? – rnaud

+0

Nie działa w podfolderach –

10

Tak, możesz na tym polegać.

Patrząc przez (1.4.2) kod źródłowy jQuery, widzę funkcji jQuery.attr() używanej (skrócone do odpowiednich części):

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;  
    } 
}); 

Więc it'effectively wywołuje elem.getAttribute('href') która zwraca aktualną wartość atrybutu , podczas gdy właściwość href według projektu zwraca kanoniczny adres URL.

Jednakże, istnieje odniesienie do jQuery.support.hrefNormalized, którego strona wsparcie jQuery ma do powiedzenia:

  • hrefNormalized: Czy równa true, jeśli metoda .getAttribute() pobiera atrybut elementów niezmienionych href , zamiast normalizować go, aby uzyskać pełny adres URL. (Jest to aktualnie nieprawidłowa w IE, adresy URL są znormalizowane ). DOM L3 Spec

Oznacza, że ​​jQuery dowie zachowanie przeglądarki na własną rękę i dostosowuje odpowiednio do zapewnienia spójnego rezultatu.

+0

Świetnie, dziękuję za odpowiedź. Chciałbym dać tutaj 2 zaakceptowane anwser. Głosowałem Marco Demaio, ponieważ był pierwszy i zasadniczo powiedział to samo. – Savageman

+0

@Savageman: Tak ... zabrało mi trochę czasu, zanim przejrzałem kod źródłowy. ;) – Tomalak

10

Wiem, że to stare pytanie, ale to jest pierwszy wpis, który pojawił się, uważam, że dobrze jest dodać dodatkowe rozwiązanie. Odkąd wprowadzono funkcję jQuery „prop”, coraz pełny adres URL jest tak proste, jak:

$(my_a_dom_node).prop('href'); 

Mam nadzieję, że nadal pomaga kogoś.

Powiązane problemy