通过 SRC 属性将变量传递给 JavaScript

IT技术 javascript html url variables src
2021-01-12 11:20:51

在我的 HTML 文件中,我已通过以下方式链接到 JS:

src="myscript.js?config=true"

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

alert (config);

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

6个回答
<script>
var config=true;
</script>
<script src="myscript.js"></script>

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

不错的选择,虽然它没有回答我的问题:)
2021-03-24 11:20:51
是的: 问题“我的 JS 可以像这样直接读取这个 var 的值吗?” 回答“你不能像你尝试的那样将变量传递给 JS”
2021-03-25 11:20:51
虽然, src attr 可以指向 php(或任何其他服务器端技术)并完成此操作。
2021-03-25 11:20:51
安全人员和 CSP 似乎希望我们永远不要给我们内联 JavaScript。
2021-04-06 11:20:51

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

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在它工作的地方稍微改变了它。

为了使脚本更容易集成。Personnaly 我发现传递一些 http 参数(不是真正的参数)比在另一个脚本标签中声明一些变量更容易。
2021-04-06 11:20:51
我正在努力思考一个现实世界的用例,这比 Itay Moav 的答案更有益。
2021-04-09 11:20:51

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

这也是 JSONP ( en.wikipedia.org/wiki/JSONP#JSONP ) 的工作原理。您传递一个函数的名称,服务器会在正文中回显它。
2021-03-13 11:20:51
事实上,因为 JSONP 是由服务器端语言(如 PHP 或 ASP)处理的。
2021-03-27 11:20:51

您需要使用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 文件中撕下!

但是,您的脚本可以找到自己的脚本节点并检查 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;
    } 
  }
是的,如果您是脚本和调用它的网页的作者。我的代码片段来自一个通用库文件,我不希望它的用户必须在随后的问题中使用一个 id,如果它指定不正确。
2021-03-23 11:20:51
给脚本标签一个 ID 并在其中使用 document.getElementById 不是更简单吗?
2021-03-29 11:20:51