使用离子应用程序内的系统浏览器打开所有链接

时间:2016-01-27 23:13:24

标签: angularjs cordova ionic-framework inappbrowser

我需要在我的应用的某个部分内的所有链接在系统浏览器中打开。诀窍是这些链接来自外部源(API),因此我无法添加ng-click函数来帮助我在外部打开链接。

我正在使用应用内浏览器插件(ng-cordova)。事实上,我有其他外部打开的链接,但在这种情况下链接可以在内容的任何部分,所以我的问题是如何在加载后将ng-click指令添加到所有链接?或者如果可能,如何配置应用程序内浏览器插件以打开系统浏览器中的所有链接?

顺便说一句,简单的链接即使在inappbrowser中也不会打开:我点击它们就没有任何反应。

感谢您的帮助

5 个答案:

答案 0 :(得分:5)

AFAIK没有一种自动执行此操作的方法,您必须使用应用内浏览器js代码在每个平台上以外部方式打开链接。

您的问题没有给出服务器返回内容的明确示例,因此我假设您正在获取 html 的完整块并且只是在屏幕上呈现它。假设一个请求返回一些基本的东西:

<div id="my-links">
   <a href='http://externallink.com'> External Link 1 </a>
   <a href='http://externallink.com'> External Link 2 </a>
   <a href='http://externallink.com'> External Link 3 </a>
</div>

您的请求如下:

$http.get('givemelinks').success(function(htmlData){
   $scope.myContent = htmlData;
})

如果您有权访问服务器端并可以进行更改:

添加&#34; inappbrowser&#34;请求的参数,用于检测是否应返回inappbrowser兼容链接,并将服务器的响应更改为:

if (inappbrowser) {
<div id="my-links">
   <div ng-click='openExternal($event)' data-external='http://externallink.com'> External Link 1 </div>
   <div ng-click='openExternal($event)' data-external='http://externallink.com'> External Link 2 </div>
   <div ng-click='openExternal($event)' data-external='http://externallink.com'> External Link 3 </div>
</div>
} else {
 <div id="my-links">
   <a href='http://externallink.com'> External Link 1 </a>
   <a href='http://externallink.com'> External Link 2 </a>
   <a href='http://externallink.com'> External Link 3 </a>
</div>
}

并使用通用的openExternal方法:

$scope.openExternal = function($event){
  if ($event.currentTarget && $event.currentTarget.attributes['data-external'])
  window.open($event.currentTarget.attributes['data-external'], '_blank', 'location=yes');
}

如果您无法更改服务器端

解析响应并用ng-clicks替换链接:

$http.get('givemelinks').success(function(htmlData){
   htmlData = htmlData.replace(/href='(.*)'/,'ng-click="openExternal($event)" data-external="$1"').replace(/<a/,"<div").replace(/a>/,"div>")
   $scope.myContent = htmlData;
})

并使用与上面相同的openExternal方法。

我用div替换锚点以防止更改应用程序路由。这可能不是每个应用程序都必需的。

为了使这更好,你应该将它捆绑在open-external指令中,这样你就可以在多个控制器中使用它并保持它们更清洁。

答案 1 :(得分:2)

您可以覆盖默认链接标记功能,如下所示:

https://blog.nraboy.com/2014/12/open-dynamic-links-using-cordova-inappbrowser/

最佳,

答案 2 :(得分:2)

因为HTML已经在Angular中呈现,并且inAppBrowser插件仅在通过显式Javascript调用时才有效,所以您无法做任何事情,不涉及手动更改HTML或使用纯JavaScript。

更改HTML只是一个错误的想法®,特别是如果您尝试使用正则表达式匹配。

留下javascript:

Restangular.all('stories').getList().then(function(stories){
  $scope.stories = stories;
  updateLinks();
});

function updateLinks(){
  //use $timeout wait for items to be rendered before looking for links
  $timeout(function(){
      var $links = document.querySelectorAll(".stories .story a");
      for(var i =0; i < $links.length; i++) {
        var $link = $links[i];
        var href = $link.href;
        console.log("Hijacking link to ", href);
        $link.onclick = function(e){
          e.preventDefault();
          var url = e.currentTarget.getAttribute("href");
          window.cordova.inAppBrowser.open(url, "_system");
        }
      }
    });
}

答案 3 :(得分:2)

安装下一个插件:

cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

现在,您可以将_system_blank_self用于目的地:

window.open(url, '_blank');

更多信息:https://www.thepolyglotdeveloper.com/2014/07/launch-external-urls-ionicframework/

答案 4 :(得分:0)

<ul>
<li> <a href="#"  ng-click='openlink($event)' data-link='https://www.link1.com'> Link 1 </a></li>  
<li> <a href="#"  ng-click='openlink($event)' data-link='https://www.link2.com'> Link2 </a></li>  
<li> <a href="#"  ng-click='openlink($event)' data-link='https://www.link3.com'> Link 3 </a></li>  
</ul>

在控制器中 -

 angular.module('app', [])
    .controller('LinkCtrl', function($scope) {
         $scope.openlink = function($event)
            {               
              if ($event.currentTarget && $event.currentTarget.attributes['data-link'])
                    {
                   window.open($event.currentTarget.attributes['data-link'], '_system', 'location=yes');
                    }
                }

    })