2011-04-25 35 views
0

我想包括脚本标签,同时提供一个参数给它。这是我想出了迄今为止什么是最简单的<script>标签使用参数

  1. 提供一个参数脚本网址:脚本标签(利弊

    <script src="http://example.com/something.js?P=123" type="text/javascript"></script> 
    
  2. 隐藏参数(利弊生成多个JS文件):同#1 )

    <script src="http://example.com/scripts/123/something.js" type="text/javascript"></script> 
    
  3. 谷歌分析方法(缺点:丑陋的,复杂的,全局变量)

    <script type="text/javascript" charset="utf-8"> 
        var _something = _something || 123; 
        (function() { 
        var s = document.createElement('script'); 
        s.type = 'text/javascript'; 
        s.src = 'http://example.com/something.js'; 
        var ss = document.getElementsByTagName('script')[0]; 
        ss.parentNode.insertBefore(s, ss); 
        })(); 
    </script> 
    

回答

1

如果执行脚本的方式,取决于它是如何调用,您可以添加PARAMS喜欢你的选项1.

其他方式是:

<script params='{"abc": 123}' src="script.js"></script><!-- params is a non standard, non official attr that the script will read --> 

<script>var _abc = 123;</script> 
<script src="script.js"></script> 

甚至

<script src="script.js#abc=123"></script> 

我虽与@outis同意:加载同样的事情给大家,总是和/客户想(S)之后像你执行它。

+0

真棒,感谢第三个代码块! – pitr 2011-04-25 03:07:46

3

最好的事情是在外部脚本,定义的东西(功能& C),但执行任何操作。然后有一个内联脚本调用外部脚本中定义的函数/方法。

<script src="http://example.com/something.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    something(123); 
</script> 
+0

这仍然有我的#3(全局变量,过于复杂,包括)相同的缺点,尽管更短:) – pitr 2011-04-25 03:01:44

+0

@pitr:没有全局变量,调用函数并不完全复杂。这种方法与您在其他语言中使用的方法相同,其中外部脚本是库,内部是程序入口点。这也正是JS库的使用方式。 – outis 2011-04-25 07:55:54

+0

'something()'在全局命名空间中,不是吗?库通过全局变量(例如'$'或'_')公开其功能(因为这就是它们的功能)。然而,我不想不必要地污染命名空间(我在问题中没有提到的东西) – pitr 2011-04-25 20:29:53

1

我这样做了,我有一个跨子域XHR处理。我叫它为:

<script type="text/javascript" src="xd.js#subdomain"></script> 

,然后在脚本中,解析它本身(使用jQuery):

$('script').each(function(){ 
    if((src = this.src).indexOf('xd.js') < 0){ return; } 
    xds = src.substr(src.indexOf('#') + 1).split(','); 

    // do stuff with xds 
}); 
+0

不是我在找的东西,因为它需要在不同位置使用jQuery代码,但这个想法(类似于@Rudie)是我可能最终要做的。谢谢! – pitr 2011-04-25 03:04:11

+0

jQuery的作品与'document.getElementsByTagName('script')' – 2011-04-25 03:09:49

+0

相同我不是在谈论jQuery的依赖关系,但事实上有两个地方,代码在本质上。 – pitr 2011-04-25 03:41:40

1

你的第一个例子并不需要生成多个文件。它可以通过单独的JavaScript使用,通过检测window.location.href和解析它(你可能会发现的http://phpjs.org/functions/parse_url:485http://phpjs.org/functions/parse_str:484有用喜欢做这个:var queryString = parse_str(parse_url(window.location.href).query);)。

不过,如果你使用类似#P=123而不是?P=123,你会不会导致你的用户文件的另一个下载,所以我建议,而不是(在这种情况下,改变“查询”上面的代码示例中到“片段”)。

另一种可能性是使用HTML5保留数据 - *属性,在脚本中检测它们的值:

<script src="http://example.com/something.js" data-myOwnAttribute="someValue" data-anotherCustomAttribute="anotherValue"></script> 

然后,该脚本将沿着这些线路检测:

(function() { 
    function getScriptParam (attr) { 
     var scripts = document.getElementsByTagName('script'), 
      currentScript = scripts[scripts.length-1]; 
     return currentScript.getAttribute('data-' + attr); // in future, could just use the HTML5 standard dataset attribute instead: currentScript.dataset[attr] 
    } 
    var myOwnAttribute = getScriptParam('myOwnAttribute'); 
    // ... do stuff here ... 
}()); 

实谷歌丑陋的API的优势在于,它允许开发者在文档的<head>中放入代码(被认为是适当的形式),同时仍然以跨浏览器的方式异步执行。我认为如果他们将动态脚本标记技术与上述任何一种方法结合起来,他们确实可以避免全球化。

相关问题