Передать vars на JavaScript через атрибут SRC

В моем файле HTML я связался с JS с помощью

src="myscript.js?config=true"

Может ли мой JS прямо прочитать значение этого var, как это?

alert (config);

Это не работает, и FireFox Error Console говорит, что "config не определен". Как читать vars, переданные через атрибут src в JS файле? Это просто?

Ответ 1

<script>
var config=true;
</script>
<script src="myscript.js"></script>

Вы не можете передавать переменные в JS так, как вы пытались. Тег SCRIPT не создает объект Window (который имеет строку запроса), и это не код на стороне сервера.

Ответ 2

Да, вы можете, но вам нужно знать точное имя файла script в script:

var libFileName = 'myscript.js',
    scripts = document.head.getElementsByTagName("script"), 
    i, j, src, parts, basePath, options = {};

for (i = 0; i < scripts.length; i++) {
  src = scripts[i].src;
  if (src.indexOf(libFileName) != -1) {
    parts = src.split('?');
    basePath = parts[0].replace(libFileName, '');
    if (parts[1]) {
      var opt = parts[1].split('&');
      for (j = opt.length-1; j >= 0; --j) {
        var pair = opt[j].split('=');
        options[pair[0]] = pair[1];
      }
    }
    break;
  }
}

У вас есть переменная 'options', в которой переданы аргументы. Я не тестировал его, я немного изменил его из http://code.google.com/p/canvas-text/source/browse/trunk/canvas.text.js, где он работает.

Ответ 3

Возможно, вы видели это, но на самом деле JS файл предварительно обрабатывается на стороне сервера, используя PHP или какой-либо другой язык. Код на стороне сервера будет печатать/эхо-код javascript с установленными переменными. Я видел, как ранее работала служба сценариев, и это заставляло меня заглядывать, можно ли это сделать с помощью простых ol 'js, но это невозможно.

Ответ 4

Вам нужно использовать Javascript для поиска атрибута src для script и проанализировать переменные после '?'. Используя Framework Prototype.js, он выглядит примерно так:

var js = /myscript\.js(\?.*)?$/; // regex to match .js

var jsfile = $$('head script[src]').findAll(function(s) {
    return s.src.match(js);
}).each(function(s) {
    var path = s.src.replace(js, ''),
    includes = s.src.match(/\?.*([a-z,]*)/);
    config = (includes ? includes[1].split('=');
    alert(config[1]); // should alert "true" ??
});

Мои навыки Javascript/RegEx ржавые, но это общая идея. Снято прямо из файла scriptaculous.js!

Ответ 5

Однако ваш script может найти свой собственный script node и изучить атрибут src и извлечь любую информацию, которая вам нравится.

  var scripts = document.getElementsByTagName ('script');
  for (var s, i = scripts.length; i && (s = scripts[--i]);) {
    if ((s = s.getAttribute ('src')) && (s = s.match (/^(.*)myscript.js(\?\s*(.+))?\s*/))) {
      alert ("Parameter string : '" + s[3] + "'");    
      break;
    } 
  }

Ответ 6

Должно ли это СЛЕДУЕТ быть, это справедливый вопрос, но если вы хотите это сделать, http://feather.elektrum.org/book/src.html действительно показывает, как, Предполагая, что ваш браузер блокирует рендеринг тэгов script (в настоящее время это правда, но может и не быть будущим доказательством), вопрос script всегда является последним script на странице до этой точки.

Затем, используя некоторую фреймворк и плагин, такие как jQuery и http://plugins.jquery.com/project/parseQuery, это становится довольно тривиальным. Удивленный там еще не плагин.

В некоторой степени связано с тем, что Джон Ресиг унижает теги script, но запускает код ПОСЛЕ внешнего script, а не как часть инициализации: http://ejohn.org/blog/degrading-script-tags/

Кредиты: Передача параметров в файлы JavaScript, Передача параметров в файлы JavaScript

Ответ 7

Использование глобальных переменных не является таким чистым или безопасным решением, вместо этого вы можете использовать атрибуты data-X, он чище и безопаснее:

<script type="text/javascript" data-parameter_1="value_1" ... src="/js/myfile.js"></script>

Из myfile.js вы можете получить доступ к параметрам данных, например, с помощью jQuery:

var parameter1 = $('script[src*="myfile.js"]').data('parameter_1');

Очевидно, что "myfile.is" и "parameter_1" должны совпадать в двух источниках;)