17

在我的 HTML 文件中,我已链接到 JS:

src="myscript.js?config=true"

我的 JS 可以像这样直接读取这个 var 的值吗?

alert (config);

这不起作用,FireFox 错误控制台显示“未定义配置”。如何读取通过 JS 文件中的 src 属性传递的变量?就这么简单吗?

4

9 回答 9

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

您不能按照您尝试的方式将变量传递给 JS。SCRIPT 标记不会创建 Window 对象(具有查询字符串),它不是服务器端代码。

于 2009-06-19T11:16:44.040 回答
6

是的,您可以,但您需要知道脚本中的确切脚本文件名:

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;
  }
}

您现在有一个传递参数的“选项”变量。我没有测试它,我从http://code.google.com/p/canvas-text/source/browse/trunk/canvas.text.js对其进行了一些更改。

于 2009-06-19T11:26:00.247 回答
4

您可能已经看到这样做了,但实际上 JS 文件是首先使用 PHP 或其他语言在服务器端进行预处理的。服务器端代码将打印/回显带有变量集的 javascript。我以前见过一个脚本广告服务这样做,它让我想看看它是否可以用普通的 ol'js 来完成,但它不能。

于 2009-06-19T11:25:51.837 回答
4

您需要使用 Javascript 查找脚本的 src 属性并解析“?”之后的变量。使用 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 文件中提取!

于 2009-06-19T11:26:14.723 回答
1

但是,您的脚本可以找到自己的脚本节点并检查 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;
    } 
  }
于 2009-06-19T11:28:07.917 回答
0

是否应该这样做,这是一个公平的问题,但如果你想这样做, http: //feather.elektrum.org/book/src.html确实显示了如何。假设您的浏览器在渲染脚本标签时阻塞(目前是正确的,但可能不是未来的证明),有问题的脚本始终是页面上的最后一个脚本。

然后使用一些框架和插件,如 jQuery 和http://plugins.jquery.com/project/parseQuery ,这变得非常简单。很惊讶还没有插件。

有点相关的是 John Resig 的降级脚本标签,但它在外部脚本之后运行代码,而不是作为初始化的一部分: http: //ejohn.org/blog/degrading-script-tags/

致谢:向 JavaScript 文件传递​​参数,向 JavaScript 文件传递​​参数

于 2011-02-11T23:23:29.227 回答
0

使用全局变量不是一个干净或安全的解决方案,相反,您可以使用 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”必须在 2 个源中匹配;)

于 2017-10-23T08:17:04.130 回答
0

你可以用一行代码做到这一点:

new URL($('script').filter((a, b, c) => b.src.includes('myScript.js'))[0].src).searchParams.get("config")
于 2020-03-27T13:25:24.703 回答
0

如果传递不带名称的参数会更简单,就像函数调用一样。

在 HTML 中:

<script src="abc.js" data-args="a,b"></script>

然后,在 JavaScript 中:

const args=document.currentScript.dataset.args.split(',');

现在 args 包含数组 ['a','b']。

于 2021-06-26T15:07:49.633 回答