Search code examples
javascriptjquerylocationhref

Test if links are external with jQuery / javascript?


How do I test to see if links are external or internal? Please note:

  1. I cannot hard code the local domain.
  2. I cannot test for "http". I could just as easily be linking to my own site with an http absolute link.
  3. I want to use jQuery / javascript, not css.

I suspect the answer lies somewhere in location.href, but the solution evades me.

Thanks!


Solution

  • var comp = new RegExp(location.host);
    
    $('a').each(function(){
       if(comp.test($(this).attr('href'))){
           // a link that contains the current host           
           $(this).addClass('local');
       }
       else{
           // a link that does not contain the current host
           $(this).addClass('external');
       }
    });
    

    Note: this is just a quick & dirty example. It would match all href="#anchor" links as external too. It might be improved by doing some extra RegExp checking.


    Update 2016-11-17

    This question still got a lot of traffic and I was told by a ton of people that this accepted solution will fail on several occasions. As I stated, this was a very quick and dirty answer to show the principal way how to solve this problem. A more sophisticated solution is to use the properties which are accessible on a <a> (anchor) element. Like @Daved already pointed out in this answer, the key is to compare the hostname with the current window.location.hostname. I would prefer to compare the hostname properties, because they never include the port which is included to the host property if it differs from 80.

    So here we go:

    $( 'a' ).each(function() {
      if( location.hostname === this.hostname || !this.hostname.length ) {
          $(this).addClass('local');
      } else {
          $(this).addClass('external');
      }
    });
    

    State of the art:

    Array.from( document.querySelectorAll( 'a' ) ).forEach( a => {
        a.classList.add( location.hostname === a.hostname || !a.hostname.length ? 'local' : 'external' );
    });