33

I am adding my Javsacript file in pages with different query strings in the script path like this:

Page1:

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

Page2:

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

Page3:

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

In my Javascript file, how can I get the value of the "abc" param? I tried using window.location for this, but that does not work.

In case it helps, below is a function I use to find the value of a query string param:

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];
}
1

5 Answers 5

33

This is possible. See Passing JavaScript arguments via the src attribute. The punchline is that since scripts in HTML (not XHTML) are executed as loaded, this will allow a script to find itself as it is always the last script in the page when it’s triggered–

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(/^[^\?]+\??/,'');

Then you just apply the query string parsing.

Sign up to request clarification or add additional context in comments.

4 Comments

"...since scripts in HTML (not XHTML) are executed as loaded..." Note that the defer and async attributes modify that behavior, so if you're using them, this may not work: Your script may not be the last in the series at that point. Relying on that would give me the shivers anyway, so I'd probably use the filename and filter on src (granted that introduces a restriction that the file can't be renamed).
Filtering on src might be tricky if you referenced the same script multiple times with different params.
You could use document.currentScript which is the actual script tag which is running the actual code.
@MichelMattos Yes, currentScript is cool! ...unless you need to support IE :-(
21

First, the technical answer: if you assign your script tag an ID, you can then grab its src and then parse out the query string.

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

 

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

With that answered, I'd like to voice my concern — this reeks of poor design decisions. Why are you including your script this way (with a querystring)? If you're trying to optimize your site (by having one large script that can be cached for subsequent pages), this approch is actually counter-productive because browsers will make a fresh request for the script file on each page due to the differing query string. The correct approach is to have one large shared file and then a small page-specific file on each page.

6 Comments

Josh3736 - one reason (and this is the reason I ended up here via a Google search ) is to handle a widget that is being used elsewhere. For example, I'm doing <script src="mywidget.js">. I'd like to pass a variable to the script.
I like this answer. But if using a method like this one, I might do something like this instead: <script id="myscript" type="text/javascript" src="myfile.js" data-mydata="my-identifier-goes-here"> You'll notice I added a data attribute to the script tag. Why added the unnecessary complexity of parsing the url. I'm assuming that, @RaymondCamden at least, is having third parties take a script tag he provides and add it to their pages.
@Tyler, that's probably how I'd do it today. Notice that this answer was written 4+ years ago, before HTML 5 data attributes were widely supported.
Another reason might be for versioning. When you want a script to be reloaded when a new version has been deployed. Then you might want access to the version number within the script itself.
Why didn't i thought of that :D
|
7

Since there is no more significant use of Internet Explorer. You can use document.currentScript and new URL, which return a string with the tag <script> in question.

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 + '"}')

You can reduce this code to one line, but it is not recommended, let minifier scripts do that.

Comments

6

You can use the URL api and document.currentScript to retreive this`

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

1 Comment

This will cause an error. you need .src to use instead
0

I have a quick and easy solution for extracting the query string from a js file using jQuery to grab the script tag source attribute and simply using two separate functions for parsing the JS file path and query string. Obviously, jQuery is required.

$(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;
}

2 Comments

Are you sure that's the easiest way to do it ? And you need to hardcode the file name additionally.
Ashley's answer above is probably simpler than mine. My snippet was merely one I had at the ready when I posted this. And you don't need to hardcode the file. You need only tailor the jQuery selector on line 3 to suit your specific needs. In this case, my needs were for specific file as was requested in the original post above.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.