如何从脚本路径获取查询字符串值?

时间:2011-01-17 18:41:03

标签: javascript html

我在脚本路径中的不同查询字符串的页面中添加了我的Javsacript文件,如下所示:

第1页:

<script type="text/javascript" src="file.js?abc=123"></script>

2页:

<script type="text/javascript" src="file.js?abc=456"></script>

第3页:

<script type="text/javascript" src="file.js?abc=789"></script>

在我的Javascript文件中,如何获取“abc”参数的值?我尝试使用window.location,但这不起作用。

如果有帮助,下面是我用来查找查询字符串参数值的函数:

function getQuerystring(key, defaultValue) {
    if (defaultValue == null) defaultValue = "";
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(window.location.href);
    if (qs == null)
        return defaultValue;
    else
        return qs[1];
}

5 个答案:

答案 0 :(得分:28)

这是可能的。见Passing JavaScript arguments via the src attribute。最重要的是,由于HTML中的脚本(不是 XHTML)是在加载时执行的,这将允许脚本找到自己,因为它始终是触发时页面中的最后一个脚本 -

var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
// myScript now contains our script object
var queryString = myScript.src.replace(/^[^\?]+\??/,'');

然后你只应用查询字符串解析。

答案 1 :(得分:12)

首先,技术答案:如果为脚本标记分配ID,则可以抓取其src,然后解析出查询字符串。

<script id="whatever" type="text/javascript" src="file.js?abc=123"></script>

var path = document.getElementById('whatever').src;
// ...

有了这个回答,我想表达我的担忧 - 这是一个糟糕的设计决定。为什么要用这种方式包含脚本(使用查询字符串)?如果您正在尝试优化您的网站(通过使用一个可以为后续网页缓存的大型脚本),此approch实际上适得其反,因为浏览器会对脚本文件提出新的请求每个页面由于不同的查询字符串。正确的方法是在每个页面上有一个大的共享文件,然后是一个小的页面特定的文件。

答案 2 :(得分:0)

我有一个快速简便的解决方案,使用jQuery从js文件中提取查询字符串,以获取脚本标记源属性,并简单地使用两个单独的函数来解析JS文件路径和查询字符串。显然,jQuery是必需的。

$(document).ready(function() {

    var p = parseURL($('script[src*="thisfile.js"]').attr('src'));

    console.log(p);

});

// Parse a URL into its parts
function parseURL(url)
{
    var p = document.createElement('a');

    p.href = url;

    var obj = {
        'protocol' : p.protocol,
        'hostname' : p.hostname,
        'port' : p.port,
        'pathname' : p.pathname,
        'search' : p.search,
        'query' : p.search.substring(1),
        'args' : parseStr(p.search.substring(1)),
        'hash' : p.hash,
        'host' : p.host
    };

    return obj;
}

// Parse a query string
function parseStr(string)
{
    var args = string.split('&');
    var argsParsed = {};

    for (i = 0; i < args.length; i++)
    {
        var arg = decodeURIComponent(args[i]);

        if (arg.indexOf('=') == -1)
        {
            argsParsed[arg.trim()] = true;
        }
        else
        {
            var kvp = arg.split('=');
            argsParsed[kvp[0].trim()] = kvp[1].trim();
        }
    }

    return argsParsed;
}

答案 3 :(得分:0)

因为没有更多的Internet Explorer使用。您可以使用document.currentScriptnew URL,它们返回一个带有标签<script>的字符串。

const search            = new URL(document.currentScript.src).search.substring(1)
const stringPreparation = decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"')
const qs                = JSON.parse('{"' + stringPreparation + '"}')

您可以将此代码简化为一行,但不建议这样做,让压缩脚本执行此操作。

答案 4 :(得分:0)

您可以使用 URL apidocument.currentScript 来检索此`

const url = new URL(document.currentScript.getAttribute('src'));
const scriptParams = Object.fromEntries(url.searchParams)
console.log(scriptParams);