Relativa url per i file Javascript
-
01-07-2019 - |
Domanda
Ho un po ' di codice in un file javascript che ha bisogno di inviare una query al server.La domanda è, come faccio a trovare l'url dello script che ho, quindi posso costruire un proprio url di richiesta ajax.
I. e., lo stesso script è incluso nel /
, /help
, /whatever
, e così, mentre sarà sempre bisogno di chiedere /data.json
.Inoltre, lo stesso sito è gestito su server diversi, in cui il /
-cartella potrebbe essere posizionati in modo diverso.Non ho i mezzi per risolvere l'url relativo, dove io sono il Javascript (ez-publish modello), ma non in javascript file stesso.
Ci sono piccoli script che funziona su tutti i browser fatto per questo?
Soluzione
Per questo mi piace mettere <link>
elementi della pagina <head>
, contenente l'Url da utilizzare per le richieste.Essi possono essere generati dal tuo linguaggio server-side in modo da ottenere sempre il punto di vista a destra:
<link id="link-action-1" href="${reverse_url ('action_1')}"/>
diventa
<link id="link-action-1" href="/my/web/root/action-1/"/>
e può essere recuperato da Javascript con:
document.getElementById ('link-action-1').href;
Altri suggerimenti
document.location.href
ti fornirà l'URL corrente, che potrai quindi manipolare usando le funzioni stringa di JavaScript.
Non è possibile che il client sia in grado di determinare la radice di webapp senza che venga comunicato dal server in quanto non è a conoscenza della configurazione del server. Un'opzione che puoi provare è utilizzare l'elemento base all'interno dell'elemento head, facendo in modo che il server lo generi dinamicamente anziché codificarlo (in modo che mostri l'URL pertinente per ciascun server):
<base href="http://path/to/webapp/root/" />
Tutti gli URL verranno quindi trattati come relativi a questo. Pertanto, faresti semplicemente la tua richiesta a /data.json. È tuttavia necessario assicurarsi che tutti gli altri collegamenti nell'applicazione tengano conto di ciò.
Se lo script conosce il proprio nome file, è possibile utilizzare il documento. getElementsByTagName (). Scorri l'elenco fino a trovare lo script corrispondente al tuo ed estrai l'URL completo (o relativo) in quel modo.
Ecco un esempio:
function getScriptUrl ( name ) {
var scripts = document.getElementsByTagName('script');
var re = RegExp("(\/|^)" + name + "$");
var src;
for( var i = 0; i < scripts.length; i++){
src = scripts[i].getAttribute('src');
if( src.match(re) )
return src;
}
return null;
}
console.log( 'found ' + getScriptUrl('demo.js') );
Prendi in considerazione che questo approccio è soggetto a collisioni di nomi di file.
Includo il seguente codice nel punto di ingresso principale delle mie librerie (main.php):
/**
* Build current url, depending on protocal (http/https),
* port, server name and path suffix
*/
$site_root = 'http';
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on")
$site_root .= "s";
$site_root .= "://" . $_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80")
$site_root .= ":" . $_SERVER["SERVER_PORT"];
$site_root .= $g_config["paths"]["site_suffix"];
$g_config["paths"]["site_root"] = $site_root;
$ g_config è un array globale contenente opzioni di configurazione. Quindi site_suffix potrebbe apparire come: & Quot; / sites_working / thesite / public_html & Quot; sulla tua casella di sviluppo e solo " / " su un server con un host virtuale (nome di dominio).
Questo metodo è anche buono, perché se qualcuno digita l'indirizzo IP della tua casella di sviluppo, utilizzerà lo stesso indirizzo IP per costruire il percorso della cartella javascript invece di qualcosa come " localhost, quot; e se usi " localhost " utilizzerà " localhost " per creare l'URL.
E poiché rileva anche SSL, non dovrai preoccuparti del tempo in cui le tue risorse verranno inviate su HTTP o HTTPS se aggiungi mai il supporto SSL al tuo server.
Quindi, nel tuo modello, utilizza
<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/>
o
<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>
Suppongo che quest'ultimo sarebbe più veloce.