前言
在ionic中,有一款cordova插件inAppBrowser可以实现外部网页的载入,然而现在我们不用这款插件,使用iframe的方式来实现。
效果预览
必要说明:在pdf.js的预览文件访问需要翻墙才能看到效果,关于存在的跨域问题,我们在代码中做了真机模式下的访问,并且隐藏了pdf.js控件中的下载,打印等不常用功能。
关于pdf的网页化处理
在github上的一款插件 pdf.js , 可以将pdf以网页的形式来进行访问处理,详情请看文档,此处不是重点。
github演示地址
以浏览pdf网页为例进行说明
pdf的模块中的view层
<ion-view view-title="PDF浏览" class="pdf out-pages" cache-view="true">
<ion-nav-bar>
<ion-nav-buttons>
<back-btn></back-btn>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content>
<!-- 用于显示iframe加载中的进度条 -->
<div class="load-progress" iframe-load></div>
<iframe type="application/pdf" ng-src="{{pdfSrc}}" width="100%" height="100%"></iframe>
</ion-content>
</ion-view>
pdf的模块中的controller
.controller('pdfCtrl', [
'$scope',
'$stateParams',
'$sce',
function ($scope, $stateParams, $sce) {
$scope.pdfSrc = $sce.trustAsResourceUrl($stateParams.pdf);
}]);
iframeLoad指令
.directive('iframeLoad', function ($timeout) {
return {
restrict: 'A',
link: function (scope, element) {
var ele = element[0];
var theFrame = element.next()[0];
ele.style.width = '90%'; // iframe 未提供加载进度接口, 解决方案: 执行一个动画,首先加载到90%
theFrame.addEventListener('load', function (e) {
if (!e) {
return ele.style.display = 'none';
}
// 进度条走完并且消失
ele.style.width = '100%';
$timeout(function () {
ele.style.display = 'none';
}, 600);
}, false);
}
};
})
加载中的动画参考
/* 加载中的进度条 */
.out-pages .load-progress {
width: 0;
height: 2px;
position: absolute;
z-index: 999999;
top: 44px;
background-color: #00b100;
transition: width 3s ease 0s;
-webkit-transition: width 3s ease 0s;
}
.out-pages iframe {
position: absolute;
width: 100%;
height: 100%;
top: 0;
}
.out-pages ion-content {
background-color: #f3f3f3;
top: 0;
}
从代码中就可知道这是一种模拟进度的方式,先执行一个周期3s的动画到90%,等加载完成后,直接到100%, 0.6s 后进度条隐藏。这是一种在没有加载进度api中的一种模拟处理方案,仅作为开发参考!