Использование jQuery для проверки внутренней или внешней ссылки - PullRequest
11 голосов
/ 04 августа 2009

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

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

Ответы [ 8 ]

22 голосов
/ 04 августа 2009

Вы можете использовать синтаксис attribute^=value для поиска ссылок, начинающихся с 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);
    };
8 голосов
/ 29 марта 2013

Я использую 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 голосов
/ 11 декабря 2014

Я предпочитаю этот селектор сам, он защищает от ложных срабатываний для абсолютных ссылок, которые указывают на ваш сайт (как те, которые часто создаются системой 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]);
});
3 голосов
/ 06 сентября 2013

Выберите только якоря, которые указывают на ваш домен, если href - это FULL URL .

jQuery("a:not([href^='http://']), " +
        "a[href^='http://localhost.com'], " +
        "a:not([href^='http://localhost.com/wp-admin'])").addClass("internal");
1 голос
/ 14 февраля 2018
$(document).ready( function() {
$('a[href^="http"]').not('a[href^="http://' + $(location).attr('hostname') + 
'"]').attr('target', '_blank');
});

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

1 голос
/ 04 августа 2013

Я использую этот, чтобы найти все 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');   
    })



}();
0 голосов
/ 03 февраля 2018

попробуйте

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
0 голосов
/ 22 апреля 2015

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

Вот пример:

HTML

<!--Create a hidden input containing your base site's 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");
  }
 }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...