Względne adresy URL dla plików Javascript

Mam trochę kodu w pliku javascript, który musi wysłać zapytania z powrotem do serwera. Pytanie brzmi, jak znaleźć adres URL dla skryptu, w którym jestem, więc mogę zbudować odpowiedni adres URL żądania dla ajax.

Tzn. ten sam skrypt znajduje się na /, /help, /whatever, i tak dalej, podczas gdy zawsze będzie musiał zażądać od /data.json. Dodatkowo, ta sama strona jest uruchamiana na różnych serwerach, gdzie / - folder może być umieszczony w inny sposób. Mam sposoby na rozwiązanie względnego adresu url, w którym Dołącz Javascript (szablon eZ-publish), ale nie w samym pliku javascript.

Czy istnieją małe skrypty, które będą działać na wszystkich przeglądarkach stworzonych do tego celu?

Author: Ulf Gjerdingen, 2008-09-20

5 answers

W tym celu Lubię umieszczać <link> elementy strony <head>, zawierające adresy URL do wykorzystania w żądaniach. Mogą być generowane przez język po stronie serwera, więc zawsze wskazują właściwy Widok:

<link id="link-action-1" href="${reverse_url ('action_1')}"/>

Staje się

<link id="link-action-1" href="/my/web/root/action-1/"/>

I może być pobrany przez Javascript za pomocą:

document.getElementById ('link-action-1').href;
 23
Author: John Millikin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 18:08:20

document.location.href poda ci bieżący adres URL, który możesz następnie manipulować za pomocą funkcji łańcuchowych JavaScript.

 3
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 17:46:50

Nie ma sposobu, aby klient mógł określić korzeń webapp bez wiedzy serwera, ponieważ nie ma wiedzy o konfiguracji serwera. Jedną z opcji, którą możesz wypróbować, jest użycie elementu podstawowego wewnątrz elementu head, aby serwer generował go dynamicznie, a nie na twardo (tak, aby wyświetlał odpowiedni adres URL dla każdego serwera): {]}

<base href="http://path/to/webapp/root/" />

Wszystkie adresy URL będą następnie traktowane jako względne. W związku z tym wystarczy złożyć wniosek do / data.json. Jednak potrzebujesz aby upewnić się, że wszystkie inne linki w aplikacji mają to na uwadze.

 3
Author: Luke Bennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 18:13:50

Jeśli skrypt zna własną nazwę pliku, możesz użyć dokumentu.getElementsByTagName (). Powtarzaj listę, aż znajdziesz skrypt pasujący do twojego i wyodrębnij w ten sposób pełny (lub względny) adres url.

Oto przykład:

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

Weź pod uwagę, że to podejście podlega kolizji nazw plików.

 2
Author: greg.kindel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-29 21:05:07

Dołączam następujący kod w moim punkcie wejścia głównego biblioteki (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 jest globalną tablicą zawierającą opcje konfiguracyjne. Tak więc site_suffix może wyglądać tak:" /sites_working/thesite/public_html "na twoim pudełku programistycznym i po prostu" / " na serwerze z wirtualnym hostem (nazwa domeny).

Ta metoda jest również dobra, ponieważ jeśli ktoś wpisze adres IP Twojego pola programistycznego, użyje tego samego adresu IP do zbudowania ścieżki do folderu javascript zamiast czegoś takiego jak "localhost", a jeśli użyjesz "localhost", użyje "localhost" do zbudowania adresu URL.

A ponieważ wykrywa również SSL, nie musisz się martwić o pogodę, twoje zasoby zostaną wysłane przez HTTP lub HTTPS, jeśli kiedykolwiek dodasz obsługę SSL do swojego serwera.

Następnie w szablonie użyj

<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/>

Lub

<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>
Przypuszczam, że ten drugi byłby szybszy.
 0
Author: nlaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 18:39:54