H5頁面實現下載文件(apk、txt等)的三種方式

需求描述

----》》》評論裏面指出有的類型的文件下載不了,主要是由於下面的方法本質上都是改變location.href,當瀏覽器不能‘理解’這種類型時,就會直接下載,反之,瀏覽器就會直接打開,並不會下載javascript

接到的原始需求是這樣的,有一個H5頁面,頁面中有個「點擊下載」的按鈕,點擊以後,完成下載特定的apk。
大概是下面這樣的👇:
圖片描述java

需求分析

接到需求的時候我偷樂了一下,這個H5頁面最大的優勢是不在微信中使用(微信好坑,各類限制,基本上從微信瀏覽器裏面實現直接下載apk是不太可能的),若是是在日常的瀏覽器的話,就簡單多了。面試

功能實現

因而我想到了第一種,點擊下載按鈕的時候改變location.href。ajax

方法一:

// 我隨便找了個apk的下載連接舉個例子
window.location.href = 'http://imtt.dd.qq.com/16891/26747DD8B125A8479AD0C9D22CA47BC9.apk?fsname=com.snda.wifilocating_4.2.91_3211.apk&csr=1bbd';

拿在瀏覽器裏面試了下,多個安卓機型均可以走通,而後我美滋滋得交付了任務,收拾收拾東西回家。
而後…………
圖片描述
截圖中所說的空白頁是由於我改變href爲apk的下載連接,網頁打開的時候會停留在一個空白頁,而後通常手機的狀態欄上會出現下載apk的進度條。
既然不想出現空白頁面的話,那不直接打開一個頁面而改爲在當前頁打開就能夠了。
這時候想到iframe,藉助iframe能夠在原頁面打開一個頁面。json

方法二:

關鍵代碼:瀏覽器

var src = 'http://imtt.dd.qq.com/16891/26747DD8B125A8479AD0C9D22CA47BC9.apk?fsname=com.snda.wifilocating_4.2.91_3211.apk&csr=1bbd';
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = "javascript: '<script>location.href=\"" + src + "\"<\/script>'";
document.getElementsByTagName('body')[0].appendChild(iframe);

使用iframe的話,既能夠實現下載,又能夠不從新打開頁面,而且,對原頁面的佈局不會產生任何影響,最後我也是採起這種方案的。微信

方法三

第三種方法是偶然學到的,既然使用iframe能夠,那使用form必定也是能夠的,form的action也能夠發請求。
因而改寫了下第二種方法:app

var src = 'http://imtt.dd.qq.com/16891/26747DD8B125A8479AD0C9D22CA47BC9.apk?fsname=com.snda.wifilocating_4.2.91_3211.apk&csr=1bbd';
var form = document.createElement('form');
form.action = src;
document.getElementsByTagName('body')[0].appendChild(form);
form.submit();

以上的代碼也能夠實現下載apk的需求。佈局

總結

其實第二和第三種方法是擴展發揮了iframe和form的用法,單獨來看,咱們知道iframe能夠在父頁面裏嵌套子頁面,知道form的action能夠發請求或者跳轉頁面,這是很常見的功能,可是不知道它們會被用在下載文件這個需求上,且產生的效果很是好。可見知識仍是要融會貫通,觸類旁通的。
寫這篇的時候我去查了下iframe,原來ajax等技術未出現的時候,有段時間業內經常使用的長輪詢的方法居然就是藉助的iframe,有興趣的也能夠研究一下。spa

相關文章
相關標籤/搜索