2010-04-14 4 views
21

Ich möchte eine Bestätigung in einem bestimmten Punkt haben.Erhalten Sie den vollständigen URI aus der Eigenschaft href eines Links

Mein Ziel ist es, immer die gleiche Zeichenfolge (die in meinem Fall der URI ist) zu erhalten, während Sie die href-Eigenschaft von einem Link lesen. Beispiel:

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

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

<a href="http://domain.name/test.htm" /> mit base_url = beliebige Ordner aus http://domain.name/

Ich brauche oben http://domain.name/test.htm aus den drei Situationen zu bekommen (oder jede andere identische Zeichenfolge).

Nach einigen Tests scheint es, dass my_a_dom_node.href immer die voll qualifizierte URI zurückgeben, einschließlich der http://domaine.name, die in Ordnung sein sollte für das, was ich will.

jQuery hat ein anderes Verhalten und $(my_a_dom_node).attr('href') gibt den Inhalt (Text) zurück, der in HTML angezeigt wird. Also mein Trick ist, $(my_a_dom_node).get(0).href zu verwenden, um den vollen URI zu erhalten.

Die Frage ist: kann ich mich darauf verlassen?

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 
} 
+3

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

Antwort

21

JA, können Sie sich verlassen:

+0

Ja, ich habe die Fragen, über die Sie sprechen, gefunden, als ich meine Frage schrieb. Danke für die Antwort. – Savageman

+0

Warum liefern Sie ein zweites Argument mit dem Wert '2'? 'getAttribute' hat nur ein Argument. – Noitidart

+0

@Noitidart: getAttribute kommt mit zwei Argumenten, das zweite Argument ist optional: http://msdn.microsoft.com/en-us/library/ms536429(v=vs.85).aspx –

1

Sie konnten die vollständige URL mit ein wenig Javascript neu zusammenstellen!

Sobald Leute mit einfachem Javascript (keine jQuery) viele das Gegenteil von dem, was Sie gefragt haben gefragt, wollten sie die echte URL wie im href-Attribut geschrieben und nicht die volle, in diesem Fall sie einmal zu erhalten einfach tun:

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

Dann jQuery kam es, dass die Menschen nicht dazu beigetragen, ihre Zeit zu verschwenden, herauszufinden sie die reale uRL solchen Code und jQuery immer wieder müssten wie im href-Attribut geschrieben.

Es ist lustig, dass jetzt jemand fragt, wie man die volle URL bekommt, weil jQuery das im href-Attribut geschriebene zurückgibt.

+0

Würde das wirklich für jeden Unterordner und relativen Pfad funktionieren? Nach meinem Verständnis ist das nicht der Fall. – Savageman

+0

Ich denke schon, die BaseUrl-Sache ist ziemlich geradlinig. Vielleicht jemand um mich zu verzeihen? – rnaud

+0

Funktioniert nicht an Unterordnern –

10

Ja, darauf können Sie sich verlassen.

Blick durch die jQuery (1.4.2) Quellcode sehe ich die jQuery.attr() Funktion verwendet wird (zu den entsprechenden Teilen kondensiert):

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

So it'effectively ruft elem.getAttribute('href'), die die tatsächliche Attributwert zurückgibt , während die href Eigenschaft von Entwurf die kanonische URL zurückgibt.

Allerdings gibt es einen Hinweis auf jQuery.support.hrefNormalized, von denen die jQuery-Support-Site zu sagen hat:

  • hrefNormalized: true Ist gleich, wenn die .getAttribute() Methode ruft die href Attribute von Elementen unverändert statt es zu normalisieren zu einer voll qualifizierten URL. (Es ist derzeit falsch in IE, die URLs sind normalisiert). DOM l3 spec

Das bedeutet im Wesentlichen, dass jQuery aus Browserverhalten auf seinem eigenen findet und paßt dementsprechend ein konsistentes Ergebnis zu liefern.

+0

Großartig, danke für die Antwort. Ich wünschte ich könnte hier 2 angenommene Antworten geben. Ich habe Marco Demaio gewählt, weil er der Erste war und grundsätzlich dasselbe sagte. – Savageman

+0

@Savageman: Ja ... dauerte eine Weile, um den Quellcode zu durchforsten. ;) – Tomalak

10

Ich weiß, es ist eine alte Frage, aber da es sich tatsächlich um den ersten Eintrag handelt, glaube ich, dass es gut ist, eine zusätzliche Lösung hinzuzufügen. Seit jQuery die „Stütze“ -Funktion eingeführt wurde, ist die vollständige URL immer so einfach wie:

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

Ich hoffe, dass noch jemand hilft.

Verwandte Themen