Использование 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", если вам нужно