Test if links are external with jQuery / javascript?

后端 未结 13 1331
囚心锁ツ
囚心锁ツ 2020-11-28 05:00

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
相关标签:
13条回答
  • 2020-11-28 05:47

    You forgot one, what if you use a relative path.

    forexample: /test

            hostname = new RegExp(location.host);
                // Act on each link
                $('a').each(function(){
    
                // Store current link's url
                var url = $(this).attr("href");
    
                // Test if current host (domain) is in it
                if(hostname.test(url)){
                   // If it's local...
                   $(this).addClass('local');
                }
                else if(url.slice(0, 1) == "/"){
                    $(this).addClass('local'); 
                }
                else if(url.slice(0, 1) == "#"){
                    // It's an anchor link
                    $(this).addClass('anchor'); 
                }
                else {
                   // a link that does not contain the current host
                   $(this).addClass('external');                        
                }
            });
    

    There are also the issue of file downloads .zip (local en external) which could use the classes "local download" or "external download". But didn't found a solution for it yet.

    0 讨论(0)
  • 2020-11-28 05:48
    var external = RegExp('^((f|ht)tps?:)?//(?!' + location.host + ')');
    

    Usage:

    external.test('some url'); // => true or false
    
    0 讨论(0)
  • 2020-11-28 05:49

    I use this function for jQuery:

    $.fn.isExternal = function() {
      var host = window.location.host;
      var link = $('<a>', {
        href: this.attr('href')
      })[0].hostname;
      return (link !== host);
    };
    

    Usage is: $('a').isExternal();

    Example: https://codepen.io/allurewebsolutions/pen/ygJPgV

    0 讨论(0)
  • 2020-11-28 05:50

    Yes, I believe you can retrieve the current domain name with location.href. Another possibility is to create a link element, set the src to / and then retrieving the canonical URL (this will retrieve the base URL if you use one, and not necessarily the domain name).

    Also see this post: Get the full URI from the href property of a link

    0 讨论(0)
  • 2020-11-28 05:51
    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' );
    });
    
    0 讨论(0)
  • 2020-11-28 05:51

    This doesn't exactly meet the "cannot hardcode my domain" prerequisite of the question, but I found this post searching for a similar solution, and in my case I could hard code my url. My concern was alerting users that they are leaving the site, but not if they are staying on site, including subdomains (example: blog.mysite.com, which would fail in most of these other answers). So here is my solution, which takes some bits from the top voted answers above:

    Array.from( document.querySelectorAll( 'a' ) ).forEach( a => {
      a.classList.add( a.hostname.includes("mywebsite.com") ? 'local' : 'external' );
    });
    
    $("a").on("click", function(event) {
      if ($(this).hasClass('local')) {
        return;
      } else if ($(this).hasClass('external')) {
        if (!confirm("You are about leave the <My Website> website.")) {
          event.preventDefault();
        }
      }
    });
    
    0 讨论(0)
提交回复
热议问题