Использование jQuery для проверки, является ли ссылка внутренней или внешней

Я хочу написать script, который может определить, является ли ссылка внутренней или внешней. Это просто, с моей точки зрения, все внутренние ссылки относительны, поэтому они начинаются с /. Все внешние ссылки начинаются с http://- все хорошо до сих пор. Однако я не могу понять, как это сделать: contains() на чем-либо, кроме текста, - как можно искать строку в атрибуте?

Как только я смогу это сделать, я с удовольствием добавлю целевой _blank, если вы не знаете, как лучше это сделать

Ответ 1

Вы можете использовать синтаксис attribute^=value, чтобы найти hrefs, которые начинаются с http или /:

$("a[href^='http']") // external

$("a[href^='/']") // internal

Здесь лучшее решение: вы можете добавить селектора $('a:external') и $('a:internal') в jQuery с приведенным ниже кодом плагина. Любой URL-адрес, начинающийся с http://, https:// или whatever://, считается внешним.

    $.expr[':'].external = function (a) {
        var PATTERN_FOR_EXTERNAL_URLS = /^(\w+:)?\/\//;
        var href = $(a).attr('href');
        return href !== undefined && href.search(PATTERN_FOR_EXTERNAL_URLS) !== -1;
    };

    $.expr[':'].internal = function (a) {
        return $(a).attr('href') !== undefined && !$.expr[':'].external(a);
    };

Ответ 2

Я использую WordPress для своей CMS, поэтому большинство (если не все) моих внутренних ссылок начинаются с "http". Я нашел здесь довольно интересное решение: http://www.focal55.com/blog/jquery-tutorial-add-class-all-outbound-links-your-site

Если сайт опущен, он в основном сводится к этому селектору (я немного его изменил):

$( 'a[href^="//"],a[href^="http"]' )
    .not( '[href*="' + window.location.hostname + '"]' )
;

Обратите внимание, что этот селектор не будет самым быстрым в соответствии с документами jQuery.

Ответ 3

Выберите только привязки, которые возвращаются в ваш домен, когда href является ПОЛНЫЙ URL.

jQuery("a:not([href^='http://']), " +
        "a[href^='http://localhost.com'], " +
        "a:not([href^='http://localhost.com/wp-admin'])").addClass("internal");

Ответ 4

Я предпочитаю этот селектор сам, он защищает от ложных срабатываний для абсолютных ссылок, указывающих на ваш сайт (например, те, которые часто генерируются системой CMS).

var currentDomain = document.location.protocol + '//' + document.location.hostname;
var outboundLinks = 'a[href^="http"]:not([href*="' + currentDomain + '"])';

Вот пример использования, где это сработало для меня, для контекста:

var currentDomain = document.location.protocol + '//' + document.location.hostname;
$('a[href^="http"]:not([href*="' + currentDomain + '"])').on('click', function (e) {
    e.preventDefault();

    // track GA event for outbound links
    if (typeof _gaq == "undefined")
        return;

    _gaq.push(["_trackEvent", "outbound", this.href, document.location.pathname + document.location.search]);
});

Ответ 5

Я использую это, чтобы найти все URL-адреса, указывающие на domain other than current domain или один с (html5 устарел) attribute target="_blank"

var contrastExternalLinks =  function() {
    //create a custom external selector for finding external links
    $.expr[':'].external = function( obj ) {
        return (
            $(obj).attr('target')   &&  $(obj).attr('target') =='_blank' ) 
                || 
                    (!obj.href.match(/^mailto\:/)   && !obj.href.match(/^tel\:/)    &&  (obj.hostname != location.hostname )
                        );
    };
    // Usage:
    $(document).ready(function() {
        $('a:external').addClass('external');///css('background-color', 'green');   
    })



}();

Ответ 6

Я думаю, что простой и менее основательный подход для этого заключается не в использовании чистого javascript или jQuery, а в сочетании с html вместо этого, а затем проверьте, есть ли ссылка на клике, содержащая ваш URL-адрес базового сайта. Он будет работать для любого типа базового url (например.: example.com, example.com/site). Если вам нужно динамическое значение, вам просто нужно установить значение, используя предпочтительный язык программирования на стороне сервера, такой как PHP, asp, java и т.д.

Вот пример:

HTML

<!--Create a hidden input containing your base site url.-->
<input type="hidden" id="sitedomain" value="example.com/site"/>

JQuery

$(".elem").on("click", function(e){
  if($(this).closest("a").length) {
  var url = $(this).attr("href");
  var sitedomain = $("#sitedomain").val();

  if(url.indexOf(sitedomain) > -1) {
    alert("Internal");
  } else {
    alert("External");
  }
 }
});

Ответ 7

попробуйте

var fullBaseUrl = 'https://internal-link.com/blog';

var test_link1 = 'https://internal-link.com/blog/page1';
var test_link2 = 'https://internal-link.com/shop';
var test_link3 = 'https://google.com';

test_link1.split(fullBaseUrl)[0] == ''; // True
test_link2.split(fullBaseUrl)[0] == ''; // False
test_link3.split(fullBaseUrl)[0] == ''; // False

Ответ 8

$(document).ready( function() {
$('a[href^="http"]').not('a[href^="http://' + $(location).attr('hostname') + 
'"]').attr('target', '_blank');
});

Замените "http" на "https", если вам нужно