据我所知,目前没有一种自动完成这个任务的方法,你必须使用应用内浏览器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;
})
如果您可以访问服务器端并进行更改:
在您的请求中添加“inappbrowser”参数以检测是否应返回适用于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-click替换链接:
$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方法。
我将anchor替换为div,以防止更改应用程序路由。但这可能并不是每个应用程序都需要的。
为了使其更好,您应该将其捆绑在“open-external”指令中,以便您可以在多个控制器中使用它并保持代码整洁。