2012-12-12 10 views
8

La base è impostato in modo dinamico in PHP quando una pagina HTML è costruito:Get BASE in HTML dopo che è stato impostato, ma non utilizzando l'URL della pagina

$base_line = '<base href="' . $some_path . '/" /> '; 
echo $base_line; 

Ora che sono nella pagina HTML ho bisogno di accedi a queste informazioni ($ some_path) e dopo aver cercato per qualche ora non riesco a trovare una risposta. Si noti che la pagina HTML caricata ha un URL non correlato alla base e non ho accesso al codice PHP per modificarlo. La pagina caricata potrebbe avere un URL come: http://xyz.com/index.php, ma tutti gli altri link nella pagina saranno basati sul valore impostato dalla base, quindi non posso ottenere la base usando l'URL della pagina.

Suppongo che potrei prendere uno degli elementi come un'immagine e sezionarlo usando DOM per trovare la base, ma ci dovrebbe essere un modo più semplice per farlo. Qualche idea?

L'utilizzo di window.location non funziona in questa situazione in quanto restituirà ciò che è correlato all'URL della pagina caricata e non quello che è stato impostato come base all'interno di esso.

+0

Hai provato 'document.getElementsByTagName ('base')'? In ogni caso, 'BASE' è qualcosa che dovresti cercare di evitare. Ha strani effetti in vari browser, incluso provare a caricare JS due volte dalla posizione BASE e non BASE. –

risposta

21

Se si desidera ottenere il valore dell'elemento di base, si può fare qualcosa di simile:

var baseHref = document.getElementsByTagName('base')[0].href 

o per essere un po 'più sicuro:

var bases = document.getElementsByTagName('base'); 
var baseHref = null; 

if (bases.length > 0) { 
    baseHref = bases[0].href; 
} 
+0

Questo ha fatto il trucco. Grazie! – Rasul

+0

Assegnerei semplicemente un id al '' come '' e quindi 'document.getElementById ('myBase'). Href'. – Blaise

+0

@Blaise Perché dovresti aggiungere l'HTML superfluo? – samanime

0

Si può provare a utilizzare javascript window.location.hostname se non si ha accesso a PHP

Se si desidera qualcosa di simile

http://www.example.com/blahblah/blah.html 

Than queste 3 cose viene in azione

window.location.protocol = "http" 
window.location.host = "example.com" 
window.location.pathname = "blahblah/blah.html" 

var url = window.location.protocol + "://" + window.location.host + "/" + window.location.pathname; 

È può guardare questo article per una funzione di url di base

+0

Non capisco come questo ti dirà cos'è la BASE. –

+0

@Alien, che restituirebbe la base per la pagina non quella impostata per la base. – Rasul

+0

@Rasul Hai bisogno del dominio di base giusto? –

0

Se si utilizza jqLite (L'impostazione predefinita angularjs) , il codice è simile:

base = angular.element(document.querySelector('base')).attr('href') 

Vedere angular document per maggiori dettagli.

+0

Ma la soluzione fornita utilizza http://vanilla-js.com/ che è meglio del bisogno angolare per un compito così semplice. La soluzione funziona anche quando usi angolare nella tua app, come tutte le soluzioni vanilla-js :) –

+0

Un modo più conciso se usi angolare: 'base = $ document.find ('base'). Attr ('href') ' –

5

Nessuna necessità di jQuery, jqlite o API obsolete. Utilizzare il più recente querySelector API:

var base = document.querySelector('base'); 
var baseUrl = base && base.href || ''; 
+1

puoi aggiungere qualche spiegazione? –

+0

@AdrianCidAlmaguer vedere questo https://caniuse.com/#search=querySelector – m1ld

2

Un problema che ho incontrato è che l'utilizzo element.href non restituisce esattamente ciò che viene impostato.Ad esempio, se si dispone di questo:

<base href="/some/sub/directory/" /> 

Poi element.href vi darà:

document.getElementsByTagName('base')[0].href 
# http://example.com/some/sub/directory/ 

ho scoperto che si può evitare questo utilizzando la funzione jQuery attr:

$("base").attr("href") 
# /some/sub/directory/ 

Se vuoi evitare jQuery, puoi anche utilizzare la funzione getAttribute:

document.getElementsByTagName('base')[0].getAttribute("href") 
# /some/sub/directory/ 
Problemi correlati