~ / эквивалент в JavaScript - PullRequest
43 голосов
/ 21 мая 2009

Любой умный способ сделать ссылку на корневой путь в JavaScript, просто как у нас ~/ в ASP.NET?

.

Ответы [ 12 ]

46 голосов
/ 21 мая 2009

Пусть ваша страница сгенерирует тег с чем-то вроде:

<link rel="home" id="ApplicationRoot" href="http://www.example.com/appRoot/" />

Затем, в JavaScript есть функция, которая извлекает значение, такое как:

function getHome(){
    return document.getElementById("ApplicationRoot").href;
}
38 голосов
/ 21 мая 2009

Использование база тег:

<head>
   <base href="http://www.example.com/myapp/" />
</head>

...

отныне любая ссылка, используемая на этой странице, неважно в javascript или html, будет относиться к базовому тегу, который равен "http://www.example.com/myapp/".

10 голосов
/ 21 мая 2009

Вы также можете использовать функцию asp.net VirtualPathUtility:

<script>
var basePath = '<%=VirtualPathUtility.ToAbsolutePath("~/")%>';
</script>

Примечание: я не кодирую путь к JSON -строке (escape-кавычки, управляющие символы и т. Д.). Я не думаю, что это большое дело (например, кавычки не разрешены без экранирования в URL), но никто никогда не знает ...

8 голосов
/ 21 мая 2009

Обычно я создаю переменную в верхней части файла js и назначаю ему корневой путь. Затем я использую эту переменную при обращении к файлу.

var rootPath = "/";
image.src = rootPath + "images/something.png";
6 голосов
/ 26 сентября 2011

Ответ Камарея может быть улучшен для поддержки динамического базового пути:

<head>    
      <base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />    
</head> 

Это обеспечит правильный корневой путь независимо от конфигурации развертывания.

Если честно, это не отвечает на первоначальный вопрос, но устраняет большинство потребностей для получения корневого пути из javascript. Просто используйте относительные URL везде, без префикса с косой чертой.

Если вам по-прежнему требуется доступ к нему из javascript, добавьте атрибут id и используйте document.getElementFromId(), как предложено MiffTheFox, - но с базовым тегом.

6 голосов
/ 21 мая 2009

~ / - корень приложения, а не буквальный корень, он интерпретирует ~ /, что означает <YourAppVirtualDir>/

Чтобы сделать буквальный корень в JavaScript, просто /, т.е. "/root.html". В JavaScript нет способа получить путь уровня приложения, подобный этому.

Вы можете взломать его в файле ASPX и вывести в виде тега, но я бы учел последствия этого для безопасности.

5 голосов
/ 09 сентября 2013

Еще один вариант, который немного проще и универсальнее, заключался бы в следующем:

<script src="/assets/js/bootstrap.min.js"><script>

и используйте Page.ResolveClientUrl примерно так:

<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>

тогда независимо от того, в каком подкаталоге URL-адреса всегда будут отображаться правильно.

2 голосов
/ 11 октября 2014

Следующая функция вычислит корень запущенного в данный момент приложения. Я использую его для определения абсолютного местоположения ресурсов, когда он вызывается откуда-то глубоко в дереве приложения.

    function AppRoot() {
        //
        // Returns the root of the currently running ASP application.
        // in the form: "http://localhost/TRMS40/"
        //
        //   origin: "http://localhost"
        // pathname: "/TRMS40/Test/Test%20EMA.aspx"
        //
        // usage:
        //           window.open( AppRoot() + "CertPlan_Editor.aspx?ID=" + ID);
        //

        var z = window.location.pathname.split('/');

        return window.location.origin + "/" + z[1] + "/";
    }
1 голос
/ 23 декабря 2016

Решение для приложений ASP.NET MVC

Это работает при использовании IIS, а также IIS Express в VS.

Поместите этот фрагмент до загрузки всех сценариев, чтобы корневая переменная URL-адреса "Approot".

к вашим услугам в скриптах:

<script>
        var approot = "@Url.Content("~")";
</script>

 --> other scripts go here or somewhere later in the page.

Затем используйте его в своем скрипте или скрипте страницы. Пример:

var sound_root_path = approot + "sound/";
var img_root_path = approot + "img/";

подходящая переменная будет либо:

"/ YourWebsiteName /" <- IIS </p>

или просто:

"/" <- IIS Express </p>

1 голос
/ 17 марта 2011

В PreRender вашей базовой страницы .NET добавьте:

 protected override void
 OnPreRender(EventArgs e) {
     base.OnPreRender(e);

     if (Page.Header != null)
     {
         //USED TO RESOLVE URL IN JAVASCRIPT
         string baseUrl = String.Format("var baseUrl='{0}';\n", 
           HttpContext.Current.Request.ApplicationPath);
         Page.Header.Controls.Add(new LiteralControl(String.Format(Consts.JS_TAG,
           baseUrl)));
     }
}

Затем в вашей глобальной функции JavaScript добавьте следующее:

 function resolveUrl(url) {
   if (url.indexOf("~/") == 0) {
     url = baseUrl + url.substring(2);
   }
 return url; }

Теперь вы можете использовать его так:

 document.getElementById('someimage').src = resolveUrl('~/images/protest.jpg');

Может быть немного для некоторых проектов, но отлично работает для полноценных приложений.

...