Открытие внешних ссылок в новом окне

Не знаю, кому как, а лично мне очень не нравится, когда при клике на ссылку в тексте статьи меня переслыают на другой сайт. Я же еще не дочитал!

Это очень неудобно и со временем вырабатывается привычка кликать везде средней кнопкой мыши. Однако, есть и более культурный способ, ведь у ссылок давно существует атрибут target="_blank", который открывает эту ссылку в новом окне. Но, его нужно проставлять вручную у каждой ссылки и это быстро недоедает, а юзеры тем временем уходят с сайта не дочитав заметку.

Задачу нужно решить, причем быстро, просто и навсегда. Поэтому я решил переложить выставление аттрибута ссылки на крепкие плечи jQuery — он не подведёт!

Вот мой маленький, симпатичный скриптик:
$(document).on('click', 'a', function() {
    // Регулярное выражение для определения, ваш ли это сайт? (нужно изменить)
    var site = /bezumkin\.ru/;
    
    // Получаем направление ссылки
    var href = $(this).attr('href');
	
    // Работаем только если ссылка абсолютная, и ведёт не на наш сайт
    if (/^(http|https|ftp)/.test(href) && !site.test(href)) {
        $(this).attr('target', '_blank');
    }
})
Принцип действия очевиден: проверяем при клике, куда ведет ссылка, и если это не наш сайт — то ставим атрибут target="_blank". И всё, ссылка откроется в новом окне.

Таким образом, открываться в текущем окне будут только относительные ссылки, или абсолютные, но на ваш сайт.

Работает на jQuery версии 1.7+. Нагрузки нет, так как замечательная функция «on» срабатывает только при наступлении события (в нашем случае — при клике на ссылку), не развешивая события заранее. Соответственно, вызов не нужно оборачивать в $(document).ready().
Василий Наумкин
04 декабря 2012, 07:13
modx.pro
10
8 196
0

Комментарии: 39

Павел Галанкин
04 декабря 2012, 11:57
0
Есть замечательный тэг base target='_blank'. Правда при его использовании нужно всем ссылкам, которые должны открываться не в отдельном окне (пункты меню, навигация и т.п.) добавить атрибут target='self'. Но решение Василия, безусловно, гораздо удобнее!
    Василий Наумкин
    04 декабря 2012, 12:38
    0
    Не знал про такое, спасибо.

    Но моей задачи это не решает — всё равно придётся проставлять атрибуты руками, только немного другие.
    Василий Краковецкий
    04 декабря 2012, 14:34
    0
    А не проще получать url сайта через javascript?

    var site = location.href;
    site = site.substring(7, site.indexOf('/', 7));

    получается «bezumkin.ru», можете проверить в консоли
      Василий Наумкин
      04 декабря 2012, 14:56
      0
      1. Не прокатит с www.bezumkin.ru. У меня нельзя открывать сайт по разным адресам, но ведь не у всех так.
      2. bezumkin.ru это не регулярное выражение /bezumkin\.ru/. Как его превратить в регулярку, автоматически?

      Или парсить ссылку и вычленять у нее base url, а потом сверять с текущим адресом? Не спорю, можно и так, но это ненужное усложнение, как по мне.
        Василий Краковецкий
        04 декабря 2012, 15:05
        0
        Ну тогда пусть лежит для тех кто захочет чтото универсальное, на самом деле можно и «www.» убирать и регулярку из строки делать.
        Василий Наумкин
        04 декабря 2012, 15:00
        0
        А еще в регулярку можно забить и другие адреса, которые не нужно открывать в новом окне. Тоже полезно.
        Василий Краковецкий
        04 декабря 2012, 14:37
        0
        Кстати насчет target="_blank" — после прочтения этой статьи — www.xiper.net/collect/html-and-css-tricks/content/target-blank.html больше его не ставлю.
          Василий Наумкин
          04 декабря 2012, 14:51
          0
          Расскажите это, например, Яндексу и Гуглу — а то они не в курсе.
            Василий Краковецкий
            04 декабря 2012, 14:55
            0
            А они тут причем? Открытие страницы в новом окне сделано для удобства пользователя, а поисковик всё равно проиндексирует ссылку, независимо от этого параметра.
              Василий Наумкин
              04 декабря 2012, 14:57
              0
              Они так открывают результаты поиска.
                Василий Краковецкий
                04 декабря 2012, 15:07
                0
                Ну тогда да, если уже они используют, то почему нам, «простым смертным» не использовать…
              Ваня
              05 декабря 2012, 00:55
              0
              Кстати, Гугл так не открывает, только Яндекс :)
                Василий Наумкин
                05 декабря 2012, 07:16
                0
                  Ваня
                  05 декабря 2012, 08:04
                  0
                  Прикольно, а я попробовал во всех браузерах нигде нет у гугла _blank ))
                  А у Яндекса есть.
                  Могу тоже скриншотом или видео подтвердить если кто-то не верит мне
                    Василий Наумкин
                    05 декабря 2012, 08:21
                    0
                    Похоже, где то есть настройки, как открывать, но найти не могу.

                    Если я не авторизовываюсь — то открывает в текущем окне. Прикол =)
                      Ваня
                      05 декабря 2012, 10:53
                      0
                      Это наверное настройка в профайле Google+
                        Aleksey Nikitin
                        13 мая 2013, 07:17
                        0
                        В настройках аккаунта указывается как открывать внешние ссылки (в свое время мне надоело держать shift нажатым)
              seigiard@gmail.com
              04 декабря 2012, 16:39
              0
              Для валидности уже давным-давно (года четыре-пять назад, минимум) в англоязычных интернетах писали «используйте jquery для простановки _blank» — так и код валиден, и пользователь доволен. Так что решение Василия удачно попало в нужную нишу «и вашим и нашим».
                Галич Сергей
                05 декабря 2012, 20:26
                0
                бредовая статья, всем неугодишь.
                меня например бесит когда читаешь статью и в ней же открываются демо или еще что там.
                хотя уже выработалась привычке колесиком щелкать, но бывает попадаю.

                кому то наоборот, нет каких либо конкретных правил.
                  Василий Наумкин
                  05 декабря 2012, 20:26
                  0
                  Бредовый комментарий, всем не угодишь.
                    Галич Сергей
                    05 декабря 2012, 20:28
                    0
                    я про
                    Кстати насчет target="_blank" — после прочтения этой статьи — www.xiper.net/collect/html-and-css-tricks/content/target-blank.html больше его не ставлю.
                    к статье опубликованной здесь претензий не имею
                      Галич Сергей
                      05 декабря 2012, 20:28
                      0
                      здесь которая тут,
                      ахах, забей короче
                        Василий Наумкин
                        05 декабря 2012, 20:38
                        0
                        А, туплю.

                        Очень не хватает индикации уровня комментария и пролистывания на тот, которому ответили =(
                        Сделаю, когда-нибудь.
                          Галич Сергей
                          05 декабря 2012, 20:53
                          0
                          на jquery можно также сделать:

                          $(".asdf").live("click", function(){
                          var url = $(this).parents("li").eq(1).find(".ticket-comment-link a:first").attr("href")
                          $(this).attr({"href": url});
                          })
                          где .asdf = к ответу

                          вроде работает…
                            Галич Сергей
                            05 декабря 2012, 20:53
                            0
                            <a class="asdf">#к ответу</a>
                              Галич Сергей
                              05 декабря 2012, 20:55
                              0
                              или как это называется к источнику))
                              аххах чето я седня тоже туплю неподецки
                  Добряков Алексей
                  04 декабря 2012, 22:24
                  0
                  Сразу говорю я знаю как написать на javascripte, но мне кажется было бы хорошо учесть это с плагином BannerY потому что он там не работает и щаче такой код понадобиться там (наверно), так как при наведении на баннер показывается другая ссылка. Хотел бы тебя попросить Василий можно ли сделать крассивые ссылки в плагине BannerY? Если нет времяни, то ничего страшного, но было бы прикольно это сделать. При многом благодарен за твои плагины.

                  P.S. Сайт который я сейчас делаю там 7 твоих плагинов используется))) Спасибо!!!
                    Василий Наумкин
                    04 декабря 2012, 22:34
                    0
                    Там выводятся относительные ссылки, типа /bannerclick/11, которые не обрабатываются этим плагином.

                    Цитата из дефолтного чанка:
                    <a href="bannerclick/[[+adposition]]"><img src="[[+image]]" title="[[+description]]"/></a>

                    Такие ссылки нужны исключительно для сбора статистики. Если она вам не интересна — используйте плейсхолдер [[+url]], тогда у ссылки будет сразу конечный url.
                      Добряков Алексей
                      04 декабря 2012, 22:38
                      0
                      спасибо, я это знал )))
                        Василий Наумкин
                        04 декабря 2012, 23:15
                        0
                        Очень рад.

                        Может, тогда поясните, что это за «красивые ссылки» в вашем понимании, которых нет сейчас в BannerY?
                          Добряков Алексей
                          05 декабря 2012, 01:03
                          0
                          в оригинале у BannerY ссылка показывается «bannerclick/123» а было бы супер если бы показывал настоящую ссылку типа на сайт «test.ru» тогда бы и Ваш скрипт работал у плагина. Есть ещё вариант проста создать в BannerY дополнительное поле где выбираешь как открыть ссылку в новом окне или в этом же, мелочь но приятно)))
                            Василий Наумкин
                            05 декабря 2012, 07:13
                            0
                            Такие ссылки нужны исключительно для сбора статистики. Если она вам не интересна — используйте плейсхолдер [[+url]], тогда у ссылки будет сразу конечный url.
                    Marc Elie
                    05 декабря 2012, 04:14
                    0
                    Не очень хорошее решение — ненавижу, когда меня заставляют открыть новое окно без моего ведома. Об этой проблеме написано очень много. Поведение машины должно быть максимально предсказуемым для юзера. Вернее, по-моему, по умолчанию открыть все ссылки в том же самом окне и дать юзеру понять, какие ссылки ссылаются на внешнюю страницу. А юзер сам решить, что ему нужно: открыть в новой складке или нет. Для этого не нужен js, стоит просто использовать css селекторы. К примеру:
                    a[href^="http"] {background-image:url("../images/external-link.png"); background-repeat:no-repeat; background-position-y:5px; padding-left:10px}
                    Между прочим, так и делается на блоге modx.
                      Василий Наумкин
                      05 декабря 2012, 07:31
                      0
                      Всегда считал, что это дело создателя сайта, как ему работать.

                      Не будем холиворить, но на моём сайте все ссылки открываются так с момента создания — просто скриптик был тупее, и стыдно было показать. Претензий к такому поведению не было.

                      Ну а ваш способ не прокатит для абсолютных ссылок на мой же сайт — а я люблю копипастить их с url. Подумаю про иконку, но мне не нравится как это выглядит в блоге MODX.
                        Marc Elie
                        05 декабря 2012, 12:41
                        0
                        Василий, вы правы, конечно, дело создателя, и нет повода спорить. Да, для абсолютных ссылок на Ваш же сайт один лишь css селектор не поможет. Между прочим, мои контент-менеджеры же в основном просто копируют целиком ссылки и не задумываются, что можно ссылаться через [[id]]. Но и тут есть элегантное решение через css. Стоит только использовать каскадирующее свойство css и написать:
                        a[href^="http"] {background-image:url("../images/external-link.png"); background-repeat:no-repeat; background-position-y:5px; padding-left:10px}
                        a[href^="http://bezumkin.ru/"] {background:none}
                        И уже все нормально!
                        Это Ваша постановка вопроса меня удивила. Ведь Вы пишите:
                        мне очень не нравится, когда при клике на ссылку в тексте статьи меня переслыают на другой сайт. Я же еще не дочитал!
                        Если Вам лично неудобно, то почему не просто поменять поведение Вашего личного навигатора? Зачем заставить всех юзеров применить такое же поведение? Хода мышления не понимаю. Вы ведь можете просто заставить FF всегда открыть ссылкы вне настоящей страницы (в новом окне или складке).
                        Еще раз: спорить не хочу. И ваш js код краток и элегантен.
                          Василий Наумкин
                          05 декабря 2012, 12:55
                          0
                          Очевидно, что у меня дома должно быть так, как нравится лично мне.

                          Так и делаю.
                            Галич Сергей
                            05 декабря 2012, 20:38
                            0
                            лебедев, вроде залупался) что должны быть картинки для определения вида ссылок,
                            в чем то может он и прав.
                            но интернет слишком быстро развивается, чтобы все под одну гребенку)… ээх
                        Denys Butenko
                        05 декабря 2012, 15:09
                        0
                        Полезно, спасибо! А для себя, уже привык все ссылки открывать колесиком сразу в новой вкладке независимо от атрибута.
                          Александр Н
                          27 мая 2015, 12:34
                          1
                          0
                          Хороший скриптик, благодарю!

                          А вот такая задача бывает ставится перед проектом (в виде например подобного сообщества). Что бы все внешние ссылки открывались в новом окне, но через внутренний редирект. Цель — не разбазаривать «вес» сайта (nofollow не рассматривается). Пример реализации — vk.com

                          Возможно ли реализовать подобное в Tikets? Или нужно «допиливать» например этот скрипт…
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            39