Путь к включенной странице Javascript - PullRequest
2 голосов
/ 07 декабря 2009

Как получить абсолютный или относительный к сайту путь для включенного файла JavaScript.

Я знаю, что это можно сделать в PHP, (__file__, я думаю). Даже для включенной страницы можно проверить путь (к включенному файлу). Есть ли способ иметь это самосознание в Javascript?

Я знаю, что могу получить URL страницы, но мне нужно получить URL JS.

Например. Javascript необходимо изменить источник изображения на странице. Я знаю, где изображение относительно файла JavaScript. Я не знаю, где Javascript относительно страницы.

<body>
  <img id="img0" src="">
  <script src="js/imgMaker/myscript.js"></script>
</body>

function fixPath(){ 
  $$("#img0")[0].set('src','js/imgMaker/images/main.jpg');
}

Пожалуйста, не говорите мне реструктурировать мою функцию - пример упрощен, чтобы объяснить необходимость. В действительности же класс Mootools распространяется, и люди могут поместить его в любую папку по своему усмотрению.

Я бы просто прочитал src элемента script, но класс может быть частью любого числа файлов javascript, поэтому я не могу знать, как выглядит этот элемент.

Ответы [ 7 ]

3 голосов
/ 07 декабря 2009

JavaScript ( not JScript) не имеет понятия имен файлов. Он был разработан для Netscape еще в те времена. Поэтому есть нет __file__ или что-то подобное.

Самое близкое, что вы можете сделать, это две возможности:

  1. То, что вы уже упомянули: собрать все src атрибуты всех файлов JS и попытаться выяснить, какой из них правильный.

  2. Сделайте необходимой опцию, чтобы путь к изображениям указывался во встраиваемом HTML-файле. Если не установлено, используйте разумное и хорошо документированное значение по умолчанию:


<script type="text/javascript">
var options = {
  'path_to_images': '/static/images/' // defaults to '/js/img/'
};
</script>
2 голосов
/ 07 декабря 2009

На основании http://ejohn.org/blog/file-in-javascript/

(function(){
  this.__defineGetter__("__FILE__", function() {
    return (new Error).stack.split("\n")[2].split("@")[1].split(":").slice(0,-1).join(":");
  });
})();

(function(){
  this.__defineGetter__("__DIR__", function() {
    return __FILE__.substring(0, __FILE__.lastIndexOf('/'));
  });
})();

Потом позже

img.setAttribute('src', __DIR__ + '/' + file);
0 голосов
/ 16 июля 2010

Найден другой подход, возможно, кто-то с большим количеством ниндзя JS сможет избавиться от этого.

Таблица стилей CSS может найти узел, который вызвал их, используя document.stylesheets.ownernode.

Мне не удалось найти аналогичный вызов для файлов JavaScript.

Но, в некоторых случаях, если можно включить файл CSS вместе с javascript и дать первому правилу некоторый уникальный идентификатор. Можно перебрать все таблицы стилей, пока они не найдут тот, у которого есть идентификатор [if (document.stylsheets [i] .cssRules [0] == thisIs: myCSS)], чем использовать ownerNode для получения пути к этому файлу и принять то же самое для JS.

Извилистый и не очень полезный, но другой его подход - может вызвать у кого-то лучшую идею.

0 голосов
/ 12 июля 2010

Я знаю, что этот вопрос задавали некоторое время назад, но у меня ситуация, аналогичная Сэму.

В моем случае у меня есть две причины для ситуации:

  1. Пользователь может получить доступ к различным поддоменам, каждый со своей страницей указателя.
  2. Пользователь может ввести пароль, который заставляет index.php корректировать пути.

Большинство ссылок указывают на те же местоположения src для сценариев, но некоторые - нет. Например, для тех, кто находится на другом уровне дерева, потребуется другой путь.

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

<script id='scriptLocation' type='text/javascript' language='javascript' src='../scripts.test/script.js'></script>

Мой JavaScript может читать путь ...

var myPath = document.getElementById("scriptLocation").src;
0 голосов
/ 07 декабря 2009

Я использую следующий метод, чтобы получить базовый URL и использовать его для загрузки других протипов, возможно, это то, что вам нужно. Допустим, текущее имя скрипта - clone.js.

    /*
     * get the base URL using current script
     */

    var baseURL = '';
    var myName = 'clone.js';
    var myPattern = /(^|[\/\\])clone\.js(\?|$)/;

    var scripts = document.getElementsByTagName("script");

    for (var i = 0; i < scripts.length; i++) {
        var src;
        if (src = scripts[i].getAttribute("src")) {
            if (src.match(myPattern)) {
                baseURL =  src.replace(myName, '');
                break;
            }
        }
    }

Var baseURL должен содержать то, что вам нужно.

0 голосов
/ 07 декабря 2009

Путь к JS не имеет значения; ссылки в файле HTML всегда относятся к файлу HTML, даже если вы изменяете их из внешнего JS.

[РЕДАКТИРОВАТЬ] Если вам нужно построить путь относительно текущей веб-страницы, вы можете найти его путь в document.location.pathname. Этот путь относителен к корню сети, но вы сможете найти известный подпуть и затем работать с ним.

Например, для этой страницы pathname будет /posts/1858724. Вы можете найти posts и затем построить относительный путь оттуда (например, posts/../images/smiley.png)

0 голосов
/ 07 декабря 2009

если у вас есть папки:

/webroot
  /images
  /scripts

Тогда изображения будут абсолютным путем /images/whwhat.jpg, а сценарии - абсолютным путем /scripts/js.js

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