Подтвердить что ты не робот

Условно добавьте target = "_ blank" к ссылкам с Angular JS

Я создаю дерево навигации в Angular JS. Большинство ссылок в дереве указывают на страницы моего веб-сайта, но некоторые могут указывать на внешние сайты.

Если href ссылки начинается с http://или https://, то я предполагаю, что ссылка для внешнего сайта (регулярное выражение типа /^https?:\/\// делает трюк).

Я хотел бы применить атрибут target = "_ blank" к этим ссылкам. Я надеялся сделать это с помощью Angular, когда создаю свои ссылки:

<ul>
    <li ng-repeat="link in navigation">
        <a ng-href="{{link.href}}" [add target="_blank" if link.href matches /^https?:\/\//]>{{link.title}}</a>
    </li>
</ul>

Может ли кто-нибудь помочь мне?

Спасибо

4b9b3361

Ответ 1

Обновление

Или используйте директиву:

module.directive('myTarget', function () {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
          var href = element.href;
          if(true) {  // replace with your condition
            element.attr("target", "_blank");
          }
        }
    };
});

Использование:

<a href="http://www.google.com" my-target>Link</a>

Если вам не нужно использовать это при маршрутизации Angular, вы можете просто использовать это:

<a href="http://www.google.com" target="{{condition ? '_blank' : '_self'}}">Link</a>

Ответ 2

Я как раз собирался создать директиву, как было предложено, а затем понял, что все, что вам действительно нужно сделать, это следующее:

<a ng-attr-target="{{(condition) ? '_blank' : undefined}}">
  ...
</a>

ng-attr-xyz позволяет динамически создавать @xyz, а если значение undefined не создается атрибут - то, что мы хотим.

Ответ 3

Предлагаемые решения будут работать только с жестко закодированными hrefs. Они будут терпеть неудачу, если они будут интерполированы, потому что angular не выполнит интерполяцию при запуске директивы. Следующее решение будет работать на интерполированных hrefs и основано на решении Javarome:

yourModule.directive('a', function() {
  return {
    restrict: 'E',
    link: function(scope, elem, attrs) {
      attrs.$observe('href', function(){
        var a = elem[0];
        if (location.host.indexOf(a.hostname) !== 0)
          a.target = '_blank';
      }
    }
  }
}

Ответ 4

Более простая директива не требует изменений в вашем HTML, обрабатывая все теги <a href="someUrl"> и добавляя target="_blank", если someURL не нацеливает текущий хост:

yourModule.directive('a', function() {
  return {
    restrict: 'E',
    link: function(scope, elem, attrs) {
      var a = elem[0];
      if (a.hostname != location.host)
         a.target = '_blank';
    }
  }
}