Get current url to Flash swf using an External Interface call

Update: please see the newer tut talking about getting the current url with as3

Overview:

Many have struggled with the task of getting you swf to read or get the current url showing in the browser, the html page the browser is at which has the swf embedded. Not to be confused with the _root._url which returns the path of the swf file. This would be helpful to know if someone is embedding your swfs on their site, or even customize your swf depending on which page it resides on. There is a pretty simple, yet virtually undocumented way to do this. We have to use javascript by calling External Interface and get the url from the DOM. Window.location.href. Then we must call the toString() function only because ExternalInterface.call requires a function rather than only reading a static property.

Steps:

  1. Import external interface into your file: import flash.external.ExternalInterface;

  2. Initialize a variable to store the url path: var urlPath;

  3. Create a function to call external interface and assign the html page path to your variable: urlPath = ExternalInterface.call(“window.location.href.toString”);

  4. Call the function when/if needed.

Example:

With javascript: window.location.href or window.location.href.toString();
With actionscript: ExternalInterface.call(“window.location.href.toString”);
External Interface html Example

Get Adobe Flash player


Actionscript:

1
2
3
4
5
6
7
8
9
import flash.external.*;
var urlPath;

function geturlhttp() {
urlPath = ExternalInterface.call("window.location.href.toString");
}
geturlhttp();
//Here I assign the url to a text box on the stage
_root.urlText.text = urlPath;

Download:

ExternalInterface.zip

This entry was posted in tutorial and tagged , , , , , , , . Bookmark the permalink. Both comments and trackbacks are currently closed.
  • Jason

    Great but you can\’t get URLs from Myspace/Facebook because of Javascript is not allowed. Please vote to fix the bug below so we have this information everywhere.

    The browser URL information is actually available in the Error Code returned from a call to ExternalInterface (when Javascript is not allowed). This information is not available in the standard player (but is in the debug), ARGH…. We all want to track our Flash widgets so please vote to fix this bug. You would then be able to get the browser URL from the Error code returned on the API call from Myspace page (a bit of a hack but the information would be available).

    http://bugs.adobe.com/jira/browse/ASC-3095

  • DB

    this doesn’t work in IE… alot of people having trouble with this :/

  • http://circlecube.com Evan Mullins

    It is interesting, it seems to have a lot to do with the Microsoft’s dealings with Active content. Clicking on the “External Interface html Example” link does work in IE. I have struggled at getting this to work in IE scenarios also. Any suggestions?

  • http://www.ideaography.net agi

    You can also use location.href and pass it through SWFObject to get the current url of a page like:

    so.addVariable(“urlPageName”, location.href);

    I used it a couple of times across projects that needed to work locally and on the server. This worked fine for me across IE and Firefox.

  • http://www.psyked.co.uk James

    @Evan – Thanks for this, learnt something new – just a shame it doesn’t play ball in IE.

    @agi – Good suggestion, I think that’ll work…

  • Ed McManus

    Hi Guys,

    Just thought you might like to know there’s a solution to this problem. The following snippit works across all browsers I’ve tested (tho clearly it requires JS access):

    var result:String = ExternalInterface.call(‘eval’, ‘window.location.href’);

    Hope it helps!

  • http://kirkstrobeck.com Kirk Strobeck

    I developed a new simple web tool that uses FScommand from flash and SWFObjecy implementation from the Javascript side. The two pair up nicely to make a functional addressing system in flash.

    Check it out => http://flashURL.net

  • http://circlecube.com Evan Mullins

    I’ve written an updated post on this subject see Get Current URL and Query String Parameters

  • John T. Bailey

    What is the advantage of using the ExternalInterface technique as you’ve described over the following:

    [actionscript]
    import flash.net.LocalConnection;
    var lc:LocalConnection = new LocalConnection();
    var domain:String = lc.domain;
    trace(domain);
    [/actionscript]

    • oxygen

      @John

      or shorter:

      import flash.net.LocalConnection;
      trace(new LocalConnection().domain)

  • Sander van den Berg

    Hello all!

    @John: Think this will only give the URL of the location of the SWF, it won’t give you the URL of the screen in which you are viewing the SWF.

    for example:
    domain 1: contains SWF
    domain 2: contains html file with embed sourcecode.

    You want the URL of domain 2, so you can track ur SWF.

    This is my issue aswell. Since im gonna work with paying clients, having their own layout. I want to dynamicly get their XML file containing layout info (which is on my server) based on a URL or Domainname send by them automaticly when viewing my SWF.

  • nick

    I’m trying to use this function to insert the current url when people submit a form, the code is below but the import flash.external.*; is created an endless loop how can I fix it, and is the way im getting the url ok or should i just put it into a variable instead of using the function? I appreciate any help

    thanks

    stop();
    System.useCodepage = true;
    send_btn.onRelease = function() {

    import flash.external.*;

    function geturlhttp() {
    _root.urlPath = ExternalInterface.call(“window.location.href.toString”);
    }

    my_vars = new LoadVars();
    my_vars.url = geturlhttp();
    my_vars.email = email_box.text;
    my_vars.name = name_box.text;
    if (my_vars.name != “” and my_vars.email != “” and my_vars.url != “”) {

    my_vars.sendAndLoad(“mailer.php”, my_vars, “POST”);
    gotoAndStop(2);
    } else {
    error_clip.gotoAndPlay(2);
    }
    my_vars.onLoad = function() {
    gotoAndStop(3);
    };
    };
    email_box.onSetFocus = subject_box.onSetFocus=message_box.onSetFocus=function () {
    if (error_clip._currentframe != 1) {
    error_clip.gotoAndPlay(6);
    }
    };

  • http://www.minicity.tv kavin

    Hi,all
    ExternalInterface.call(’eval’, ‘window.location.href’);
    this can get url,but i have a problem,my flash is a widget and when it insert into a page,this widget has not a id(<object classid=…. id=…) and not work.
    how can i do ?

  • http://circlecube.com Evan Mullins

    @Kavin – your flash does not need an id or class to use ExternalInterface. Although sites lie MySpace don’t allow the use of javascript, so we can’t use ExternalInterface there. Good luck!

  • kallal

    This used to work fine in older versions during the AS1 days. What broke?

  • Pingback: Get Current URL and Query String Parameters to Flash | Tutorial | circlecube

  • Adrian

    I tried to use your code below but it is not working in my end.

    The return value is “undefined”.

    I am currently experimenting on how can I get the querystring of the current URL and append it in the url in of my getURL function.

    Below is a sample of my code.

    *********************************************
    import flash.external.*;

    function geturlhttp()
    {
    //will contain the Current URL
    var urlPath = ExternalInterface.call(“window.location.href.tostring”);

    //trace (urlpath)
    // result is undefined
    //get current URL of the site
    var QStr:String;
    Qstr = “”;
    if (urlPath.indexOf(“?”) -1)
    {
    Qstr = urlPath.substr(urlPath.indexOf(“?”), urlPath.length );
    }

    getURL(“http://www.adrian.com/adrian.html” + Qstr , “_self”);

    }

    _root.LearnD.onRealease = function()

    {
    geturlhttp();
    };

    *********************************************
    Whenever I click the LearnD button , I am redirected to this page.

    http://www.adrian.com/adrian.htmlundefined

  • http://circlecube.com Evan Mullins

    @Adrian – this line is most likely giving you trouble:
    if (urlPath.indexOf(”?”) -1)
    should it read:
    if (urlPath.indexOf(”?”) == -1) ?
    let me know if that does it. happy scripting.

  • Adrian

    I correct the codes aand the issue is still existing.

    I am still getting “undefined”. I also noticed that the code is working if I will assign a fixed URL value for the UrlPath variable.

  • http://circlecube.com Evan Mullins

    Actually, it should be != rather than ==, and remember that variable names are caSe seNseTive, so your QStr and Qstr are not the same things.

    this worked for me:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function geturlhttp() {
      //var urlPath = ExternalInterface.call("window.location.href.tostring");
      urlPath = "http://www.adrian.com/adrian.html?test=qs";
      //trace (urlpath)

      var QStr:String = "";
      if (urlPath.indexOf("?") != -1) {
        QStr = urlPath.substr(urlPath.indexOf("?"), urlPath.length );
        trace(QStr);
      }

      getURL("http://www.adrian.com/adrian.html" + QStr , "_self");

    }
  • Keith

    This page claims to provide the URL to the SWF but it does not. The example provided, and all of the alternative examples in the comments, provide the URL to the PAGE containing the SWF.

  • http://play.blog2t.net Og2t

    Thanks for the solution, that’s what I was looking for.

  • http://www.microangelo.co.uk/ MicroAngelo

    Hi,

    I don't really like to require users of my swf's to have to add and javascript, so instead I do this entirely in actionscript:

    ExternalInterface.call(“eval”,”document.location.href”);

    You have to use “eval” (evaluate) to work across all browsers (and “document.location” is safer than “window.location” in case you're in a frameset).

    HTH,

    MicroAngelo

  • http://www.microangelo.co.uk/ MicroAngelo

    Hi,

    I don’t really like to require users of my swf’s to have to add and javascript, so instead I do this entirely in actionscript:

    ExternalInterface.call(“eval”,”document.location.href”);

    You have to use “eval” (evaluate) to work across all browsers (and “document.location” is safer than “window.location” in case you’re in a frameset).

    HTH,

    MicroAngelo

  • http://www.atasozlerianlamlari.om atasözleri

    You are perfect!

    I am too many time finding it, very nice and wonderful working.

    Thanks again!

  • Hieu

    Thanks a lot for sharing.

  • http://engnajjar.blog.com mouhammad

    thaaaaaaaaaaaaaaaaaaaaaaaaaaaaanks for all so much

    you’ve helped me so so so much

    I’m working on my project and I’ll show after finish what I did !!!!!!!

    thanks again

  • http://engnajjar.blog.com mouhamma

    hello guys

    how can I check urlpath what starts with ??

    i.e :

    I have a link for example : http://circlecube.com/

    and after getting urlpath by :

    var urlPath = ExternalInterface.call(“window.location.href.tostring”);

    check if it starts with : http://circlecube.com/

    if true trace(yes) or trace(not)

    I tried to make this condition but I couldn’t

    can any body help me please ????

  • http://www.gergovprint.com ?????? ??????

    Sorry, for stupid question ……..How do I Get URL into Flash

  • http://www.studysp.com study in UK/USA/AUS

    similar problem of endless loop. need to look into the issue

  • jason

    how did you get the example to work in this page? How did you call the .js? Did you embed it in the template file or how in the page?

  • http://www.zuup.ro Adrian

    Hi guys,
    I use this:

    var current_domain;
    function geturlhttp()
    {
    current_domain = ExternalInterface.call(“window.location.href.toString”);
    }
    geturlhttp();
    trace(current_domanin);

    and in embed code: allowscriptaccess=”always”
    and works fine.

  • http://mediose.com DonJhonson3rd

    Excelente!!! muchas gracias

  • http://www.jocuri-on.ro Jocuri

    Thanks, Great post!

  • Pingback: Access the html page URL and swf path from flash with as3 | circlecube

  • http://www.njocuri.ro jocuri

    thank for this post!

  • http://www.misterkerthenrich.com Sherryl Askin

    Thankyou for helping out, wonderful information.

  • http://noyangrup.com MICHEAL

    thanks. Especially for source documents :)

  • http://raitheoshow.com Matt

    Worked! Thanks!

  • Pingback: Flash 如何抓取目前網頁的網址 | Tsung's Blog

  • http://www.konsort.org/support/member.php?u=16891 to learn more

    Oh my goodness! Awesome article dude! Many thanks, However I am having issues with your
    RSS. I don’t understand why I cannot join it. Is there anybody else getting similar RSS issues? Anybody who knows the answer will you kindly respond? Thanx!!

  • Recent Posts

    custom post types wordcamp presentation evan mullins

    WordCamp Presentation on WordPress.TV

    My presentation about Custom Post Types and Custom Fields from WordCamp Atlanta 2014 has been added to wordpress.tv. Here it is! Enjoy! Tweet

    WCATL-Speaker

    Custom Post Types or Choose Your Own Adventure – WordCamp Atlanta 2014

    I’ve been fortunate enough to be able to present at WordCamp Atlanta 2014. That makes the 3rd year in a row I’ve been able to contribute to WordCamp Atlanta! Here are my slides. I’ll be posting a full blown post of my presentation as soon as I can get it all down. Plus I hear […]

    Screenshot 2014-03-17 08.12.14

    What screens want

    Great read if you haven’t yet read it yet: Frank Chimero : What screens want : http://frankchimero.com/what-screens-want/ web and interaction design are just as much children of filmmaking as they are of graphic design. Maybe even more so. After all, we both work on screens, and manage time, movement, and most importantly, change. So what […]

    bed-bug-lifecycle-stages

    Before You Report that Bug, Use this Pre-Contact, Self-Diagnosis Routine

    Wisdom for bug reporting from Newfangled There are a few things a developer usually needs to know in order to diagnose a bug, and these are the things we’re likely to come back and ask you about if you haven’t already provided them. So, to ensure we can help you as quickly as possible, here’s […]

    deathtozach-06

    In dependence – Not dead

    Great summary and call to arms to write our own content in our own ways on our own sites. Call it what you like but ‘blogging’ is somewhat waning, in the social webs. Since as easy it is to create your own site and express your own voice, we’re flocking to the ‘services’ that will […]

    Screenshot 2014-03-17 08.50.27

    I ain’t ‘fraida no maths

    I’d heard of the ‘coding maths’ series, but hadn’t watched it yet. I should have, it’s great! Keith Peters (one of the people who first got me into scripting) has a great series about the math behind coding and as always he has a way of making complex things simple to me! Learn all you […]

css.php