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


需求描述

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

需求分析

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

功能實現

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

方法一:

// 我隨便找了個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可以在原頁面打開一個頁面。

方法二:

關鍵代碼:

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也可以發請求。
於是改寫了下第二種方法:

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,有興趣的也可以研究一下。

本文轉載於:猿2048https://www.mk2048.com/blog/blog.php?id=hbhcibichaa


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM