Відносні шляхи у Javascript у зовнішньому файлі


84

Отже, я запускаю цей javascript, і все працює нормально, крім шляхів до фонового зображення. Він працює в моєму локальному середовищі ASP.NET Dev, але НЕ працює при розгортанні на сервері у віртуальному каталозі.

Це у зовнішньому файлі .js, структура папок -

Site/Content/style.css
Site/Scripts/myjsfile.js
Site/Images/filters_expand.jpg
Site/Images/filters_colapse.jpg

тоді звідси включено файл js

Site/Views/ProductList/Index.aspx

$("#toggle").click(function() {
    if (left.width() > 0) {
        AnimateNav(left, right, 0);
        $(this).css("background", "url('../Images/filters_expand.jpg')");
    }
    else {
        AnimateNav(left, right, 170);
        $(this).css("background", "url('../Images/filters_collapse.jpg')");
    }
});

Я намагався використовувати, '/Images/filters_collapse.jpg'і це теж не працює; однак, здається, це працює на сервері, якщо я використовую '../../Images/filters_collapse.jpg'.

В основному, я хочу мати таку ж функціональність, як і ASP.NET тильда - ~.

оновлення

Чи є шляхи у зовнішніх файлах .js відносно сторінки, на яку вони включені, або фактичне розташування файлу .js?


Чи відрізняється ваш каталог програм у розробці порівняно з сервером? Visual Studio у вбудованому веб-сервері встановлює шлях за замовчуванням до '/', якщо на вашому сервері сказано '/ MyApp', ви можете мати непослідовну поведінку. Спробуйте встановити шлях для візуальної студії на '/ MyApp'
sarvesh

Саме в цьому проблема! Залежно від того, де знаходиться віртуальний каталог, я не хочу оновлювати свій javascript кожного разу, коли я переходжу з dev на виробництво ...
Nate,

Схоже , це те, що ви шукаєте , superexpert.com/blog/archive/2009/02/18/… .
sarvesh

Я використовую javascript для динамічної зміни фонового зображення тегу div. Я хотів би уникати повернення коду у файл головної сторінки, оскільки він набагато чистіший за власний зовнішній файл .JS ...
Nate

Існує нічого подібного ~ для javascript. Ви можете мати допоміжну функцію в JS. Наприклад, ви зателефонуєте MyJs.Url ('Images / filters.jp') і додасте цей префікс до вашого віртуального каталогу і повернете рядок. Таким чином вам потрібно буде змінити його лише в одному місці при розгортанні.
sarvesh

Відповіді:


136

Шляхи до файлів JavaScript

Коли це сценарій, шляхи відносяться до відображеної сторінки

щоб полегшити ситуацію, ви можете роздрукувати таку просту декларацію js, використовуючи цю змінну у всіх сценаріях:

Рішення, яке було застосовано на StackOverflow близько лютого 2010 року:

<script type="text/javascript">
   var imagePath = 'http://sstatic.net/so/img/';
</script>

Якщо ви відвідували цю сторінку приблизно в 2010 році, ви могли б просто поглянути на HTML-джерело StackOverflow , ви можете знайти цей поганий однокласник [відформатований на 3 рядки :)] у <head />розділі


7
У підсумку я зробив це, за винятком того, що використовую Url.Content, щоб згенерувати значення imagePath.Дякую!
Нейт

2
Ха-ха, я зробив те саме, потім повернувся і прочитав ваш коментар.
Chev

1
Це працює, але це однозначно обхідний шлях, а не належне рішення. Відповідь @ schory дала мені рішення проблеми OP.
daniloquio

7
Раніше я Url.Content("~")отримував корінь програми . hth
GraehamF

3
Я також люблю робитиvar imagePath = window.location.protocol + "//" + window.location.host + "/"
JeanValjean

48

отримати розташування вашого файлу javascript під час роботи за допомогою jQuery, проаналізувавши DOM для атрибута 'src', який посилався на нього:

var jsFileLocation = $('script[src*=example]').attr('src');  // the js file path
jsFileLocation = jsFileLocation.replace('example.js', '');   // the js folder path

(припускаючи, що ваш файл javascript має ім'я 'example.js')


$ ("# FkngDiv"). Load (jsFileLocation + "../ FkngFolder / FkngPage.aspx") Для мене це спрацювало як шарм. Я використовую його таким чином, щоб повернутися назад на один рівень папки, а потім я просто вказую на бажаний шлях.
daniloquio

6
дуже хороша відповідь. Я б змінив .replaceвираз на jsFileLocation.replace(/example\.js.*$/, '')випадок, якщо після.js
yitwail

1
Ви шановний сер, ви мій найновіший герой! Використовував це рішення для пошуку мого шляху css на сервері в додатку ASP.NET MVC, який динамічно завантажується з папки вбік від моєї папки javascript ...
Hutjepower

27

Правильним рішенням є використання класу css замість написання src у js-файлі. Наприклад, замість використання:

$(this).css("background", "url('../Images/filters_collapse.jpg')");

використання:

$(this).addClass("xxx");

а у файлі css, який завантажується на сторінці, напишіть:

.xxx {
  background-image:url('../Images/filters_collapse.jpg');
}

5
Це не працює, якщо я використовую атрибут non-css. Наприклад: <img src="/codes/imgs/a.png">. Я не можу встановити цей атрибут src за допомогою css.
Реза

14

Хороше питання.

  • У файлі CSS URL-адреси будуть відносно файлу CSS.

  • Під час написання властивостей за допомогою JavaScript, URL-адреси завжди повинні бути відносно сторінки (запитується основний ресурс).

У tildeJS немає жодної вбудованої функціональності, про яку я знаю. Звичайним способом буде визначення змінної JavaScript із зазначенням базового шляху:

<script type="text/javascript">

  directory_root = "http://www.example.com/resources";

</script> 

і посилатися на цей корінь щоразу, коли ви динамічно призначаєте URL-адреси.


13
Жорстке кодування root не працює на вашому розробнику, тестовому сервері тощо
RickAndMSFT

5

Для програми MVC4, над якою я працюю, я помістив елемент сценарію в _Layout.cshtml і створив глобальну змінну для необхідного шляху, наприклад:

<body>

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

<div class="page">
    <div id="header">

       <span id="title">

        </span>
    </div>
    <div id="main">


        @RenderBody()
    </div>
    <div id="footer">
        <span></span>
    </div>
</div>


4

Я використав візерунок пекки. Я думаю, ще одна закономірність.

<script src="<% = Url.Content("~/Site/Scripts/myjsfile.js") %>?root=<% = Page.ResolveUrl("~/Site/images") %>">

і проаналізовано рядок запитів у myjsfile.js.

Плагіни | Плагіни jQuery


2

Будь ласка, використовуйте наступний синтаксис, щоб насолодитися розкішшю asp.net tilda ("~") у javascript

<script src=<%=Page.ResolveUrl("~/MasterPages/assets/js/jquery.js")%>></script>

2

Я виявив, що це працює для мене.

    <script> document.write(unescape('%3Cscript src="' + window.location.protocol + "//" +     
    window.location.host + "/" + 'js/general.js?ver=2"%3E%3C/script%3E'))</script>

Звичайно, між тегами сценарію ... (я не впевнений, чому теги сценарію не з'явилися в цій публікації) ...


Не знаю, чому ваша відповідь отримала позитивний голос. Це те, що спрацювало у мене після годин боротьби ... (Y)
Zia Ul Rehman Mughal

Я думаю, оскільки це вказує на ім'я сервера / js, а не на ім'я сервера / ім'я програми / js , яке, на мою думку, нічим не відрізняється від "/ js"
user1566694,

0

Вам потрібно додати runat="server"і і призначити ідентифікатор для нього, а потім вказати абсолютний шлях таким чином:

<script type="text/javascript" runat="server" id="myID" src="~/js/jquery.jqGrid.js"></script>]

З коду позаду ви можете програмно змінити src, використовуючи ідентифікатор.


0

Це добре працює у веб-формах ASP.NET.

Змініть сценарій на

<img src="' + imagePath + 'chevron-large-right-grey.gif" alt="'.....

У мене є головна сторінка для кожного рівня каталогу, і це відбувається у події Page_Init

  Dim vPath As String = ResolveUrl("~/Images/")
    Dim SB As New StringBuilder
    SB.Append("var imagePath = '" & vPath & "'; ")
    ScriptManager.RegisterClientScriptBlock(Me, Me.GetType(), "LoadImagePath", SB.ToString, True)

Тепер незалежно від того, запущено додаток локально чи розгорнуто, ви отримуєте правильний повний шлях

http://localhost:57387/Images/chevron-large-left-blue.png
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.