Javascript 什么';这是最简单的<;脚本>;用params标记

Javascript 什么';这是最简单的<;脚本>;用params标记,javascript,script-tag,Javascript,Script Tag,我想包括一个脚本标记,同时为其提供一个参数。这就是我到目前为止想到的 为脚本URL提供一个参数(缺点:生成多个JS文件) 在脚本标记中隐藏参数(缺点:与#1相同) 谷歌分析方式(缺点:丑陋、复杂、全局变量) var _something=_something | 123; (功能(){ var s=document.createElement('script'); s、 类型='text/javascript'; s、 src='1〕http://example.com/somethi

我想包括一个脚本标记,同时为其提供一个参数。这就是我到目前为止想到的

  • 为脚本URL提供一个参数(缺点:生成多个JS文件)

    
    
  • 在脚本标记中隐藏参数(缺点:与#1相同)

    
    
  • 谷歌分析方式(缺点:丑陋、复杂、全局变量)

    
    var _something=_something | 123;
    (功能(){
    var s=document.createElement('script');
    s、 类型='text/javascript';
    s、 src='1〕http://example.com/something.js';
    var ss=document.getElementsByTagName('script')[0];
    ss.parentNode.insertBefore(s,ss);
    })();
    

  • 最好是在外部脚本中定义东西(函数&c),但不执行任何操作。然后使用一个内联脚本调用外部脚本中定义的函数/方法

    <script src="http://example.com/something.js" type="text/javascript"></script>
    <script type="text/javascript">
        something(123);
    </script>
    
    
    某物(123);
    
    最好是在外部脚本中定义内容(函数和c),但不执行任何操作。然后使用一个内联脚本调用外部脚本中定义的函数/方法

    <script src="http://example.com/something.js" type="text/javascript"></script>
    <script type="text/javascript">
        something(123);
    </script>
    
    
    某物(123);
    
    如果脚本的执行方式取决于调用方式,则可以添加选项1之类的参数

    其他途径包括:

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

    var\u abc=123;
    
    甚至

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

    不过,我必须同意@outis的观点:始终为每个人加载相同的内容,然后按照您/客户希望的方式执行。

    如果脚本的执行方式取决于调用方式,您可以添加参数,如选项1

    其他途径包括:

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

    var\u abc=123;
    
    甚至

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

    不过,我必须同意@outis的观点:始终为每个人加载相同的内容,然后像您/客户希望的那样执行它。

    我这样做是为了我拥有的跨子域XHR处理程序。我称之为:

    <script type="text/javascript" src="xd.js#subdomain"></script>
    
    
    
    然后在脚本中对其进行解析(使用jQuery):

    $('script')。每个(函数(){
    if((src=this.src.indexOf('xd.js')<0){return;}
    xds=src.substr(src.indexOf('#')+1).split(',');
    //使用xds做一些事情
    });
    
    我为我拥有的跨子域XHR处理程序执行此操作。我称之为:

    <script type="text/javascript" src="xd.js#subdomain"></script>
    
    
    
    然后在脚本中对其进行解析(使用jQuery):

    $('script')。每个(函数(){
    if((src=this.src.indexOf('xd.js')<0){return;}
    xds=src.substr(src.indexOf('#')+1).split(',');
    //使用xds做一些事情
    });
    
    您的第一个示例不需要生成多个文件。JavaScript可以单独使用它,通过检测
    window.location.href
    并对其进行解析(您可能会发现类似的方法,并在这方面有所帮助:
    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>
    

    谷歌丑陋API的真正优势在于,它允许开发人员在文档的
    中插入代码(被认为是正确的形式),同时仍然以跨浏览器的方式异步操作。我认为,如果他们将动态脚本标记技术与上述任何一种方法结合起来,他们确实可以避免全局错误。

    您的第一个示例不需要生成多个文件。JavaScript可以单独使用它,通过检测
    window.location.href
    并对其进行解析(您可能会发现类似的方法,并在这方面有所帮助:
    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>
    

    谷歌丑陋API的真正优势在于,它允许开发人员在文档的
    中插入代码(被认为是正确的形式),同时仍然以跨浏览器的方式异步操作。我认为,如果他们将动态脚本标记技术与上述任何一种方法结合起来,他们确实可以避免全局变量。

    这仍然与我的#3(全局变量,包含起来过于复杂)有相同的缺点,尽管更短:)@pitr:没有全局变量,调用函数也并不复杂。这种方法与在其他语言中使用的方法相同,其中外部脚本是库,内部脚本是程序入口点。这也正是JS库的使用方式。
    something()
    位于全局命名空间中,不是吗?库通过全局变量(例如
    $
    )公开其功能(因为这就是它们的用途)。一、 但是,我不想不必要地污染名称空间(我在问题中没有提到这一点)。@pitr:
    something
    位于全局名称空间中(在浏览器中,它实际上是一个对象,
    window
    ;全局定义的符号是全局对象的属性),但它是一个全局函数,而不是全局变量(这是您应该避免的全局函数,也是迄今为止讨论的唯一一种全局函数)。全局函数(包括对象构造函数)很好(确实是必要的);即使您不使用它们,所包含的脚本也会定义它们,除非您将整个脚本包装在匿名函数调用中……全局变量和全局状态是有问题的。您可以将全局符号的数量降至最低
    (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 ...
    }());