URLs relativos para arquivos Javascript
-
01-07-2019 - |
Pergunta
Eu tenho algum código em um arquivo javascript que as necessidades para enviar consultas de volta ao servidor. A pergunta é: como faço para encontrar o URL para o script que eu estou, para que eu possa construir um url pedido adequado para ajax.
i., O mesmo script está incluído no /
, /help
, /whatever
, e assim por diante, ao mesmo tempo que terá sempre necessidade de pedido de /data.json
. Além disso, o mesmo site é executado em servidores diferentes, onde a pasta-/
pode ser colocado de forma diferente. Eu tenho meios para resolver a URL relativa onde eu incluir o Javascript (ez-publicar template), mas não dentro do arquivo javascript si.
Existem pequenos scripts que irão trabalhar em todos os navegadores feitos para isso?
Solução
Por isso eu gostaria de colocar elementos <link>
em <head>
da página, que contém as URLs para usar para solicitações. Eles podem ser gerados por sua linguagem do lado do servidor para que eles sempre apontam para o entendimento correto:
<link id="link-action-1" href="${reverse_url ('action_1')}"/>
se torna
<link id="link-action-1" href="/my/web/root/action-1/"/>
e pode ser recuperado por Javascript com:
document.getElementById ('link-action-1').href;
Outras dicas
document.location.href
lhe dará a URL atual, que você pode então manipular usando funções de cadeia de JavaScript.
Não há nenhuma maneira que o cliente pode determinar a raiz webapp sem ser dito pelo servidor, uma vez que não tem conhecimento de configuração do servidor. Uma opção que você pode tentar é usar o elemento de base dentro do elemento de cabeça, recebendo o servidor para gerar dinamicamente em vez de codificar-lo (por isso mostra o URL relevante para cada servidor):
<base href="http://path/to/webapp/root/" />
Todos os URLs, então, ser tratados como relativos a esta. Você seria, portanto, basta fazer o seu pedido para /data.json. É, contudo, precisa garantir que todos os outros elos da bear aplicação isso em mente.
Se o script conhece a sua própria nome de arquivo, você pode usar documento. getElementsByTagName (). Percorrer a lista até encontrar o script que corresponde ao seu, e extrair o URL completo (ou relativo) dessa forma.
Aqui está um exemplo:
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') );
Leve em consideração que esta abordagem está sujeita a colisões de nome de arquivo.
I incluem o seguinte código no meu bibliotecas ponto de entrada principal (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 é uma matriz global contendo as opções de configuração. Então site_suffix pode parecer:. "/ Sites_working / thesite / public_html" na sua caixa de desenvolvimento, e apenas "/" em um servidor com um (nome de domínio) host virtual
Este método também é bom, porque se alguém digita o endereço IP da sua caixa de desenvolvimento, ele irá usar o mesmo endereço IP para construir o caminho para a pasta javascript em vez de algo como "localhost", e se você usar " localhost" ele vai usar "localhost" para construir a URL.
E porque também detecta SSL, você não terá que se preocupar com o tempo seus recursos serão enviados através de HTTP ou HTTPS, se você nunca adicionar o suporte SSL para o servidor.
Então, em seu modelo, tanto para uso
<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/>
ou
<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>
Eu suponho que este último seria mais rápido.