Относительные URL-адреса для файлов Javascript
-
01-07-2019 - |
Вопрос
У меня есть некоторый код в файле javascript, который должен отправлять запросы обратно на сервер.Вопрос в том, как мне найти URL-адрес скрипта, в котором я нахожусь, чтобы я мог создать правильный URL-адрес запроса для ajax.
То есть, тот же самый скрипт включен на /
, /help
, /whatever
, и так далее, в то время как ему всегда нужно будет запрашивать у /data.json
.Кроме того, один и тот же сайт запущен на разных серверах, где /
-папка может быть размещена по-другому.У меня есть средства для разрешения относительного URL, куда я включаю Javascript (шаблон ez-publish), но не внутри самого файла javascript.
Существуют ли небольшие скрипты, которые будут работать во всех браузерах, созданных для этого?
Решение
Для этого я хотел бы поставить <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;
Другие советы
document.location.href
выдаст вам текущий URL-адрес, которым затем вы можете манипулировать с помощью строковых функций JavaScript.
Клиент не может определить корневой каталог веб-приложения без уведомления сервера, поскольку он не имеет представления о конфигурации сервера.Один из вариантов, который вы можете попробовать, - использовать базовый элемент внутри элемента head, заставляя сервер генерировать его динамически, а не жестко кодировать (чтобы он показывал соответствующий URL-адрес для каждого сервера):
<base href="http://path/to/webapp/root/" />
Затем все URL-адреса будут обрабатываться как относящиеся к этому.Поэтому вам следует просто отправить свой запрос в /data.json.Однако вам необходимо убедиться, что все другие ссылки в приложении учитывают это.
Если скрипт знает свое собственное имя файла, вы можете использовать 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') );
Примите во внимание, что такой подход подвержен конфликтам имен файлов.
Я включаю следующий код в основную точку входа моих библиотек (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>
Я полагаю, что последнее было бы быстрее.