Относительные URL-адреса для файлов Javascript

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
18
0
11 338
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Для меня это бесполезно, так как мне нужно найти корень веб-приложения, который может варьироваться от сервера к серверу (в данном случае это настройки машины разработчика).

Staale 20.09.2008 21:52

Какую серверную технологию использует веб-приложение?

John Topley 20.09.2008 22:01

apache, php и ez-publish в этом случае. Однако мне нужно что-то в чистом javascript, которое будет работать независимо от технологии servseride.

Staale 20.09.2008 22:06
Ответ принят как подходящий

Для этого мне нравится помещать элементы <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;

Это отличное использование тега ссылки.

Jonathan Arkell 20.09.2008 22:15

Я создавал решение, просматривая все теги сценария и находя свой собственный сценарий, а затем что-то относящееся к этому. Однако это намного проще.

Staale 20.09.2008 22:18

Если вам В самом деле нужна версия jQuery, $("#link-action-1")[0].href

Donal Fellows 13.06.2012 14:05

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

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

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

Похоже, этот элемент как раз и предназначен для решения проблемы в этом вопросе. MDN говорит, что он тоже хорошо поддерживается: developer.mozilla.org/en-US/docs/Web/HTML/Element/base

Phil 10.05.2014 09:01

Если присмотреться к <base> немного подробнее, кажется, есть некоторые серьезные оговорки, о которых следует помнить. Якорные ссылки, такие как <a href = "#top-of-page">, например, сломаются. См .: stackoverflow.com/a/1889898/1299695

Phil 10.05.2014 09:20

Я включаю следующий код в главную точку входа в мои библиотеки (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>

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

Если скрипту известно собственное имя файла, вы можете использовать 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.info( 'found ' + getScriptUrl('demo.js') );

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

Круто. Однако это не работает в сценариях без атрибута src. Если вы настроите условное выражение на if ( src && src.match(re)), оно будет работать. Спасибо за код!

Shane Daniel 30.08.2012 21:15

Хорошее решение. Насколько это надежно / кроссбраузерно?

dkamins 21.10.2012 05:46

Другие вопросы по теме