Ответ 1
<script>
var config=true;
</script>
<script src="myscript.js"></script>
Вы не можете передавать переменные в JS так, как вы пытались. Тег SCRIPT не создает объект Window (который имеет строку запроса), и это не код на стороне сервера.
В моем файле HTML я связался с JS с помощью
src="myscript.js?config=true"
Может ли мой JS прямо прочитать значение этого var, как это?
alert (config);
Это не работает, и FireFox Error Console говорит, что "config не определен". Как читать vars, переданные через атрибут src в JS файле? Это просто?
<script>
var config=true;
</script>
<script src="myscript.js"></script>
Вы не можете передавать переменные в JS так, как вы пытались. Тег SCRIPT не создает объект Window (который имеет строку запроса), и это не код на стороне сервера.
Да, вы можете, но вам нужно знать точное имя файла 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, где он работает.
Возможно, вы видели это, но на самом деле JS файл предварительно обрабатывается на стороне сервера, используя PHP или какой-либо другой язык. Код на стороне сервера будет печатать/эхо-код javascript с установленными переменными. Я видел, как ранее работала служба сценариев, и это заставляло меня заглядывать, можно ли это сделать с помощью простых ol 'js, но это невозможно.
Вам нужно использовать 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!
Однако ваш 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;
}
}
Должно ли это СЛЕДУЕТ быть, это справедливый вопрос, но если вы хотите это сделать, 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
Использование глобальных переменных не является таким чистым или безопасным решением, вместо этого вы можете использовать атрибуты 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" должны совпадать в двух источниках;)