Относительные URL для файлов Javascript - PullRequest
18 голосов
/ 20 сентября 2008

У меня есть некоторый код в файле JavaScript, который должен отправлять запросы обратно на сервер. Вопрос в том, как мне найти URL для скрипта, в котором я нахожусь, чтобы я мог создать правильный URL-адрес запроса для ajax.

Т.е., тот же скрипт включен в /, /help, /whatever и т. Д., В то время как он всегда должен запрашивать у /data.json. Кроме того, один и тот же сайт работает на разных серверах, где папка / может размещаться по-разному. У меня есть средства для разрешения относительного URL, где я включаю Javascript (шаблон ez-publish), но не в самом файле javascript.

Существуют ли небольшие скрипты, которые будут работать во всех браузерах, созданных для этого?

Ответы [ 5 ]

23 голосов
/ 20 сентября 2008

Для этого я хотел бы поместить <link> элементы в <head> страницы, содержащие URL-адреса для использования в запросах. Они могут быть сгенерированы вашим языком на стороне сервера, поэтому они всегда указывают на правильное представление:

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

становится

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

и может быть получен с помощью Javascript с помощью:

document.getElementById ('link-action-1').href;
3 голосов
/ 20 сентября 2008

Невозможно, чтобы клиент мог определить корень веб-приложения, не сообщив об этом серверу, так как он не знает о конфигурации сервера. Один из вариантов, который вы можете попробовать, - это использовать базовый элемент внутри элемента head, чтобы сервер генерировал его динамически, а не жестко кодировал его (поэтому он показывает соответствующий URL для каждого сервера):

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

Все URL будут рассматриваться как относящиеся к этому. Поэтому вы просто сделаете запрос в /data.json. Однако вам необходимо убедиться, что все остальные ссылки в приложении учитывают это.

3 голосов
/ 20 сентября 2008

document.location.href предоставит вам текущий URL, которым вы можете затем управлять, используя строковые функции JavaScript.

2 голосов
/ 30 августа 2011

Если скрипт знает свое имя файла, вы можете использовать document. getElementsByTagName (). Итерируйте по списку, пока не найдете сценарий, который соответствует вашему, и извлеките полный (или относительный) URL таким образом.

Вот пример:

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

Примите во внимание, что этот подход подвержен конфликтам имен файлов.

0 голосов
/ 20 сентября 2008

Я включаю следующий код в основную точку входа моих библиотек (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 - это глобальный массив, содержащий параметры конфигурации. Поэтому site_suffix может выглядеть следующим образом: "/ sites_working / thesite / public_html" в вашем окне разработки и просто "/" на сервере с виртуальным хостом (именем домена).

Этот метод также хорош, потому что, если кто-то вводит IP-адрес вашего окна разработки, он будет использовать тот же IP-адрес для создания пути к папке javascript вместо чего-то вроде «localhost», и если вы используете « localhost "будет использовать localhost" для создания URL.

И поскольку он также обнаруживает SSL, вам не нужно беспокоиться о том, будут ли отправляться ваши ресурсы по HTTP или HTTPS, если вы когда-нибудь добавите поддержку SSL на свой сервер.

Затем в вашем шаблоне либо используйте

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

Или

<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>

Полагаю, последний будет быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...