将参数传递给 JavaScript 文件

IT技术 javascript parameter-passing
2021-01-13 01:17:55

通常我会有一个我想使用的 JavaScript 文件,它需要在我的网页中定义某些变量。

所以代码是这样的:

<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
   var obj1 = "somevalue";
</script>

但我想做的是:

<script type="text/javascript" 
     src="file.js?obj1=somevalue&obj2=someothervalue"></script>

我尝试了不同的方法,最好的方法是像这样解析查询字符串:

var scriptSrc = document.getElementById("myscript").src.toLowerCase();

然后搜索我的value观。

我想知道是否有另一种方法可以在不构建函数来解析我的字符串的情况下做到这一点。

大家知道其他方法吗?

6个回答

如果可能,我建议不要使用全局变量。使用命名空间和 OOP 将您的参数传递给一个对象。

此代码属于 file.js:

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function() {
            alert('Hello World! -' + _args[0]);
        }
    };
}());

在你的 html 文件中:

<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
   MYLIBRARY.init(["somevalue", 1, "controlId"]);
   MYLIBRARY.helloWorld();
</script>
这个表达是什么意思?var MYLIBRARY = MYLIBRARY || (function(){}());? 为什么要MYLIBRARY设置为布尔值?
2021-03-23 01:17:55
@Naeem - 当 MYLIBRARY.init(["somevalue", 1, "controlId"]); 时,file.js 加载 100% 被处决?也许我们需要准备好放在文档上?
2021-03-26 01:17:55
1) 如果 MYLIBRARY 存在,则使用它或定义一个新对象。目的是创建一个全局命名空间,通常我会使用子命名空间,所以这一行有助于避免重新定义顶级命名空间。2)是的,它创建了一个单例。
2021-03-30 01:17:55
我举了一个这个想法的例子:http : //plnkr.co/edit/iE0Vr7sszfqrrDIsR8Wi?p=preview
2021-03-31 01:17:55
@Alexander,请参阅我上面的评论stackoverflow.com/questions/2190801/...
2021-03-31 01:17:55

您可以传递具有任意属性的参数。这适用于所有最近的浏览器。

<script type="text/javascript" data-my_var_1="some_val_1" data-my_var_2="some_val_2" src="/js/somefile.js"></script>

在 somefile.js 中,您可以通过以下方式获取传递的变量值:

…………

var this_js_script = $('script[src*=somefile]'); // or better regexp to get the file name..

var my_var_1 = this_js_script.attr('data-my_var_1');   
if (typeof my_var_1 === "undefined" ) {
   var my_var_1 = 'some_default_value';
}
alert(my_var_1); // to view the variable value

var my_var_2 = this_js_script.attr('data-my_var_2');   
if (typeof my_var_2 === "undefined" ) {
   var my_var_2 = 'some_default_value';
}
alert(my_var_2); // to view the variable value

...等等...

$(..)语法是jQuery的,不要忘了把它列入。
2021-04-01 01:17:55
旧但对于那些使用谷歌搜索的人:如果您需要解决 CSP(内容安全策略),这很好。我们使用了很多脚本,其中我们将根据语言资源和 API 密钥等确定的字符串传递到 JS 文件中。
2021-04-02 01:17:55
请注意,您也可以使用document.currentScript,请参阅caniuse.com/#feat=document-currentscript以获得兼容性(或使用polyfill
2021-04-03 01:17:55
非常好的解决方案,这甚至适用于 async 属性。
2021-04-08 01:17:55

我遇到的另一个想法是id<script>元素分配一个并将参数作为data-*属性传递结果<script>标签看起来像这样:

<script id="helper" data-name="helper" src="helper.js"></script>

然后脚本可以使用 id 以编程方式定位自身并解析参数。给定前一个<script>标签,可以像这样检索名称:

var name = document.getElementById("helper").getAttribute("data-name");

我们得到name=helper

@jvannistelrooy 我还没有尝试过,但我相信应该能够通过 jquery 和一个像这样的聪明选择器来访问脚本:(var this_js_script = $('script[src*=somefile]');上面复制
2021-03-16 01:17:55
如果你不想依赖 id 属性,你也可以让你的helper.js脚本循环遍历script页面上的所有标签,寻找带有 的那个scr="helper.js",然后提取data-name
2021-03-23 01:17:55

看看这个网址。它完全符合要求。

http://feather.elektrum.org/book/src.html

非常感谢作者。为了快速参考,我粘贴了以下主要逻辑:

var scripts = document.getElementsByTagName('script');
var myScript = scripts[ scripts.length - 1 ];

var queryString = myScript.src.replace(/^[^\?]+\??/,'');

var params = parseQuery( queryString );

function parseQuery ( query ) {
  var Params = new Object ();
  if ( ! query ) return Params; // return empty object
  var Pairs = query.split(/[;&]/);
  for ( var i = 0; i < Pairs.length; i++ ) {
    var KeyVal = Pairs[i].split('=');
    if ( ! KeyVal || KeyVal.length != 2 ) continue;
    var key = unescape( KeyVal[0] );
    var val = unescape( KeyVal[1] );
    val = val.replace(/\+/g, ' ');
    Params[key] = val;
  }
  return Params;
}
@Darius.V 这适用于非异步脚本。我更喜欢使用选项 1 和选项 5 作为后备
2021-03-24 01:17:55
最好使用 Use decodeURI() 或 decodeURIComponent() 而不是 unescape ,因为该函数已被弃用。
2021-03-25 01:17:55
哦,我发现把 JSON 放在那里是可行的,只要你对它进行 urlencode。
2021-04-04 01:17:55
@ user378221 - 您确定这将始终获得正确的文件吗?我的意思是假设这个文件是最后一个。如果在执行之前加载了更多脚本标签怎么办?我不知道这是否可行,但我认为文档不会等待代码执行完成以加载其他标签?
2021-04-05 01:17:55
我喜欢这个解决方案,但稍微修改了一下,以使用片段标识符,这样它就不会破坏缓存: var frag = myScript.src.replace(/^[^\#]+\#?/,'') ;
2021-04-08 01:17:55

您使用全局变量:-D。

像这样:

<script type="text/javascript">
   var obj1 = "somevalue";
   var obj2 = "someothervalue";
</script>
<script type="text/javascript" src="file.js"></script">

'file.js' 中的 JavaScript 代码可以访问obj1并且obj2没有问题。

编辑只想补充一点,如果“file.js”想要检查是否obj1并且obj2甚至已经声明,您可以使用以下函数。

function IsDefined($Name) {
    return (window[$Name] != undefined);
}

希望这可以帮助。

您可以省略var.
2021-03-20 01:17:55
是的,但按我的JavaScript的经验,我会用全局变量只为module命名空间和暴露程度不亚于需要什么(如初始化代码,一些属性),如图所示这里在复杂的项目中很容易出现命名冲突……花费数小时的时间,然后发现您已经在项目的其他地方使用了该变量。
2021-04-03 01:17:55
这将在 IE 中引发未引用错误。该函数的首选主体是return typeof window[$Name] !== 'undefined';. 请注意,您将向该函数传递一个包含变量名称的字符串。通过if (typeof var !== 'undefined').
2021-04-05 01:17:55