2010-04-14 12 views
21

Vorrei avere una conferma su un punto.Ottieni l'URI completo dalla proprietà href di un collegamento

Il mio obiettivo è ottenere sempre la stessa stringa (che è l'URI nel mio caso) durante la lettura della proprietà href da un collegamento. Esempio:

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

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

<a href="http://domain.name/test.htm" /> con base_url = qualsiasi cartella da http://domain.name/

ho bisogno di ottenere http://domain.name/test.htm dai 3 situazioni di cui sopra (o qualsiasi altro stringa identica).

Dopo alcuni test, sembra che my_a_dom_node.href restituisca sempre l'URI completo completo, incluso lo http://domaine.name, che dovrebbe essere ok per quello che voglio.

jQuery ha un comportamento diverso e $(my_a_dom_node).attr('href') restituisce il contenuto (testo) visualizzato all'interno dell'HTML. Quindi il mio trucco è usare $(my_a_dom_node).get(0).href per ottenere l'URI completo.

La domanda è: posso contare su questo?

+3

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

risposta

21

SI, si può contare!

Una volta quando le persone utilizzavano il javascript semplice (senza jQuery) molti chiedevano il contrario di ciò che si chiede, volevano ottenere l'url reale come scritto nell'attributo href e non quello completo, in tal caso erano soliti semplicemente:

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

Poi è venuto jQuery che ha aiutato le persone a non sprecare il loro tempo a scoprire che avrebbero bisogno di tale codice e jQuery restituisce sempre il vero URL come scritto nel href.

È strano che ora qualcuno stia chiedendo come ottenere l'url completo perché jQuery restituisce quello scritto nell'attributo href.

+0

Sì, ho trovato le domande di cui si sta parlando quando ho scritto la mia domanda. Grazie per la risposta. – Savageman

+0

Perché stai fornendo un secondo argomento di valore '2'? 'getAttribute' ha solo un argomento. – Noitidart

+0

@Noitidart: getAttribute viene fornito con due argomenti, il secondo argomento è facoltativo: http://msdn.microsoft.com/en-us/library/ms536429(v=vs.85).aspx –

1

Si potrebbe ricomporre l'URL completo con un po 'di 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

Potrebbe davvero funzionare per QUALSIASI sottocartella e percorso relativo? Dalla mia comprensione, non è il caso. – Savageman

+0

Penso di sì, la cosa di baseUrl è piuttosto semplice. Forse qualcuno che mi dimostri sbagliato? – rnaud

+0

Non funziona su sottocartelle –

10

Sì, puoi fare affidamento su questo.

Guardando attraverso la (1.4.2) il codice sorgente jQuery, vedo la funzione jQuery.attr() utilizzata (condensato alle parti interessate):

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

Così chiamate it'effectively elem.getAttribute('href') che restituisce il valore di attributo reale , mentre la proprietà href di design restituisce l'URL canonico.

Tuttavia, v'è un riferimento a jQuery.support.hrefNormalized, di cui il sito di supporto jQuery ha da fare:

  • hrefNormalized: è uguale a true se il metodo .getAttribute() recupera l'attributo href di elementi invariati , piuttosto che normalizzarlo su con un URL completo. (È attualmente falso in IE, gli URL sono normalizzati). DOM spec l3

Ciò significa che jQuery scopre il comportamento del browser da solo e si adatta di conseguenza per fornire un risultato coerente.

+0

Grande, grazie per la risposta. Vorrei poter dare 2 amici accettati qui. Ho votato Marco Demaio, perché era il primo e sostanzialmente lo stesso. – Savageman

+0

@ Savageman: Sì ... mi ci è voluto un po 'per scavare nel codice sorgente. ;) – Tomalak

10

So che è una vecchia domanda, ma essendo questa la prima voce che è comparsa, credo sia opportuno aggiungere una soluzione in più. Da quando jQuery ha introdotto la funzione "prop", ottenendo l'URL completo è semplice come:

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

Spero che aiuta ancora qualcuno.

Problemi correlati