次源碼時代H5學科老師跟大家一起來總結下在web應用中常見的加載進度條實現(xiàn)方案。
隨著html5的普及,各種css3動畫及js特效在網頁中也是層出不窮,PC端加載數(shù)據的速度還是比較快的,但是對于移動端設備而言則相對要慢不少,如果圖片或者腳本沒有加載完,用戶在操作中就可能發(fā)生各種問題,因此我們需要對數(shù)據加載進行偵測,以更加人性化的方法將網頁程序內容展現(xiàn)給用戶,實現(xiàn)更佳的用戶體驗。
先說一下整體的實現(xiàn)思路吧,常見的效果是將進度條的dom結構顯示在頁面最“前”(使用fixed定位 + 高z-index,提高優(yōu)先級),主體內容相當于是被“隱藏”(實際是被遮蓋)了,所以進度條一打開網頁就有了,當網頁內容全部加載完成后,觸發(fā)js相關事件,執(zhí)行回調函數(shù):隱藏進度條的同時顯示頁面主體內容。
【1. 定時器模擬制作進度條】
很多同學會使用定時器的方式實現(xiàn)網頁進度條,通常可以設置延遲3到5秒鐘的時間后來顯示網頁內容,這樣的確可以模擬出進度條的加載效果,不過這種方式會有一些問題,比如當前頁面已經打開過了,瀏覽器中會有緩存數(shù)據,再次開啟頁面定時器依然會執(zhí)行,反而會影響加載性能,原本可以“瞬間”完成的內容加載,現(xiàn)在由于定時器的原因也需要等待。還有一個就是在網絡情況比較糟糕的情況下,很有可能3到5秒鐘的時間也未必能夠加載完成網頁內容,這個時候定時器加載又顯得比較雞肋了。
示例代碼參考:load1.html
樣式:
<font size="3"><style type="text/css">
*{
margin: 0;
padding: 0;
}
#Loading{
position: fixed;
width: 100%;
height: 100%;
background-color: orange;
color: #fff;
font-size: 40px;
text-align: center;
line-height: 10;
}
</style></font>
復制代碼
結構:
<font size="3"><!--加載頁面-->
<div id="Loading">loading...</div>
<!--內容主體-->
<div id="Cont">Hello world</div></font>
復制代碼
交互:
<font size="3"><script>
var load_page=document.querySelector("#Loading");
setTimeout(function(){
load_page.style.display="none";
}, 3000)
</script></font>
復制代碼
小結:
1. 定時器模擬制作進度條只能是視覺表現(xiàn)上的實現(xiàn),而非真正意義上的解決方案。
【2. 通過加載狀態(tài)事件制作進度條】
javascrip提供了相關事件機制可以監(jiān)控頁面的加載情況,我們可以通過加載狀態(tài)事件實現(xiàn)進度條的制作,可以使用window.onload事件,等到頁面中全部內容包括圖片加載完成后才會被觸發(fā),或者使用document.onReadyStateChange事件,在ReadyStateChange事件中可通過自變量事件參數(shù)獲取到頁面加載的當前狀態(tài),分為5項內容:
Uninitialized:未初始化
Loading:載入
Loaded:載入完成
Interactive:交互
Completed:完成
而js通過ReadyStateChange事件可以獲取到的僅為后2項狀態(tài),不過對于我們的代碼實現(xiàn)而言僅僅只需要最后一個完成狀態(tài)即可。
示例代碼參考:load2.html(樣式代碼同load1.html)
結構:
<font size="3"><!--加載頁面-->
<div id="Loading">
loading...
</div>
<!--內容主體-->
<div id="Cont">
<p>Hello world</p>
<img src="http://img.hb.aicdn.com/0b452ed716f0530575eff4b4e253009af7112a19bbec-Cg9NH6"/>
<img src="http://img.hb.aicdn.com/80701a6a3be8f6ce71a312385d672963f155b7627542e-qfEGEw"/>
<img src="http://img.hb.aicdn.com/8cfc2f27f9832043e3dcb87512ce6c56a8e54fed5a905-skDixu"/>
</div></font>
復制代碼
交互:
<font size="3"><script>
var load_page=document.querySelector("#Loading");
document.onreadystatechange=function(e){
if(e.target.readyState==="complete"){
load_page.style.display="none";
}
}
</script></font>
復制代碼
小結:
1. 通過加載狀態(tài)事件(window.onload或document.onreadystatechange)制作進度條,可真正意義上實現(xiàn)頁面加載效果。
【3. 實時獲取加載數(shù)據制作進度條】
通過加載狀態(tài)事件制作進度條,可真正意義上實現(xiàn)頁面加載效果,但是無法顯示當前加載進度,當內容加載完成后直接就顯示出了落地頁,過程中缺少了加載進度提示,實際上對于網頁而言加載圖片之類的二進制資源文件是最大的加載開銷,所以通常來講圖片資源往往是最后加載完成的,其加載行為本身又是異步的,所以我們可以通過圖片自身的load事件判定其是否加載完成,執(zhí)行回調函數(shù)實時計算加載進度,模擬實時獲取加載數(shù)據進度條效果。
示例代碼參考:load3.html(樣式代碼同load1.html)
結構:
<font size="3"><!--加載頁面-->
<div id="Loading">
<p>loading...</p>
<h2>0%</h2>
</div>
<!--內容主體-->
<div id="Cont">
<p>Hello world</p>
<img src="http://img.hb.aicdn.com/0b452ed716f0530575eff4b4e253009af7112a19bbec-Cg9NH6"/>
<img src="http://img.hb.aicdn.com/80701a6a3be8f6ce71a312385d672963f155b7627542e-qfEGEw"/>
<img src="http://img.hb.aicdn.com/8cfc2f27f9832043e3dcb87512ce6c56a8e54fed5a905-skDixu"/>
<img src="http://img.hb.aicdn.com/c6572538c319c2096425485d27333153ab6a4237882c4-vb7X0I"/>
<img src="http://img.hb.aicdn.com/6d43fa49d2bdfa8379150ccb28991b4377a77a394f483-5iZuD5"/>
<img src="http://img.hb.aicdn.com/14b5365bb3462895b936d08afef904e7aa665cfa2a616-eHgU0g"/>
<img src="http://img.hb.aicdn.com/29922a9799e1c29f8a5ab92b79724bd558f9d4f548ea3-xXw31P"/>
<img src="http://img.hb.aicdn.com/b4c55ba8355ac8778752029cc853a6a41e0057e16d2e0-OGreNB"/>
<img src="http://img.hb.aicdn.com/d7075bfa3490f842ca2d7f28df14ca31973052a93fd7ea-nvZYmh"/>
<img src="http://img.hb.aicdn.com/69dea0ffbc98b8a8238d611a931bf10f1b12ba6b65743-dR6cTv"/>
</div></font>
復制代碼
交互:
<font size="3"><script>
var load_page=document.querySelector("#Loading"),
h2=document.querySelector("h2"),
imgs=document.querySelectorAll("img"),
imgs_len=imgs.length,
loaded=0,
load_callback=function(){
loaded++;
h2.innerHTML=parseInt(loaded/imgs_len*100) + "%";
if(loaded===imgs_len) load_page.style.display="none";
};
for(var i=0; i<imgs_len; i++){
if(imgs[i].complete==true){//圖片已加載完成
load_callback();
}else{
imgs[i].onload=function(){//圖片動態(tài)加載完成觸發(fā)
load_callback();
}
}
}
</script></font>
復制代碼
網站資源擴展:
1. 動畫圖標資源:www.loading.io
2. GIF預加載圖標資源:www.preloaders.net
感謝源碼時代H5學科講師提供此文章!
本文為原創(chuàng)文章,轉載請注明出處(http://www.itsource.cn)!
期文章《Avalanche初級用戶實用指南》中給大家介紹了Avalanche產品以及如何開啟L4-7測試,Avalanche是一款業(yè)界熟知的L4-7測試工具,并以其模擬網絡流量的真實性和高性能被廣泛應用。在性能測試中,合理的設置壓力可以更好的發(fā)揮測試儀的能力。Avalanche關于壓力模型的建立都在Load Profile中實現(xiàn),本文針對Avalanche 壓力模型的建立以及壓力產生機制做一個詳細的介紹并針對大家在配置過程中常見的Load問題進行解答。
Loads: 用以配置測試所需產生流量的大小、建立壓力模型。首先新建一個Load Profile并為其起一個名字,然后選擇合適的Load類型Specification、編輯模型圖的每個階段,最后在Associations中合理的調用。Avalanche Loads界面如下圖所示:
圖 1 Load Profile
Specification: Load類型選擇,也就是所建壓力模型的衡量單位,Avalanche提供了Simusers、Simusers/s、Connections、Connections/s、Transactions、Transactions/s、BodyBytes以及Bandwidth等類型,測試者可根據不同的測試目的來進行選擇,比如需要測試設備的TCP新建能力,那么使用Connections/s作為衡量單位,就可以簡單明了的為被測設備配置所需的新建壓力。下文就分別對這些Load類型做詳細介紹。
圖2 Load類型選擇
Simusers: 模擬用戶,每一個模擬用戶可以理解為真實世界的一個用戶,是Avalanche產生流量的基本單元,它從Subnets設置的IP地址池中獲取地址然后在其生命周期內執(zhí)行Action list中的動作,動作執(zhí)行完畢,用戶死亡。選用Simusers可使Avalanche維持一定量的模擬用戶數(shù),可衡量被測設備能夠同時處理的最大并發(fā)用戶數(shù)。Simusers多用于應用測試或是更注重真實用戶壓力的測試。
Simusers/s: 每秒鐘產生的模擬用戶數(shù),可使Avalanche維持一定的速率來產生模擬用戶,用來衡量被測設備每秒鐘可處理的用戶數(shù)。
Connections: 表示TCP連接,定義了Avalanche根據設定產生一定的并發(fā)連接數(shù),通常用來衡量被測設備可同時承受的并發(fā)TCP連接能力。
Connections/s: 每秒TCP連接數(shù),Avalanche根據設定以一定的速率產生TCP連接。而Avalanche產生Load的基本單元是Simuser,Avalanche根據Action、Profile、Server Response以及歷史數(shù)據等計算出每秒鐘應產生多少Simusers才能達到設定數(shù)目的Connections/s。通常用來測試防火墻設備、IDS/IPS設備或其他4-7層設備的每秒新建能力。
Transactions: 并發(fā)一定量的HTTP會話數(shù),一個Transaction表示一個應用層的會話,例如client發(fā)出Get請求,Server響應200OK。多用來衡量應用服務器處理并發(fā)HTTP會話的能力。
Transactions/s: 每秒生成的HTTP會話數(shù),可使Avalanche維持一定的速率來生成HTTP會話,通常用來測試代理服務器或應用服務器的應用層新建能力或CPU處理能力。
Tips: 對于Avalanche而言,Transactions和Transactions/s通常只用于測試HTTP或HTTPs協(xié)議。
Bandwidth: 定義Avalanche產生一定量的帶寬,當用Avalanche既模擬client又模擬Server時,可用此Load類型。
Bodybytes: 定義了Avalanche產生的HTTP響應頁面大小,當需要測試被測設備對不同大小頁面的反應時用此Load類型比較方便。當用Avalanche既模擬client又模擬Server時,才可用此Load類型。
Avalanche產生Load的基本單元是Simuser,不管設置的是什么類型的Specification,Load都是由Avalanche產生Simusers,再由Simusers通過執(zhí)行Action List中的Action產生的。如果設置的是Simusers或Simusers/s,Avalanche則按照當前的設置數(shù)量來產生Simusers或Simusers/s,如果設置的是其它類型的Load,Avalanche則按照測試的配置(如Action/Profile/Server response等)和歷史數(shù)據來計算需要產生多少Simusers或Simusers/s才能到達所期望的Load值。
Phase Editor: 壓力模型圖編輯,橫軸為時間,縱軸為壓力(縱軸的衡量單位即為Specification選擇的Load類型),Avalanche默認將Load壓力分成了五個階段Delay、Ramp Up、Stair Step、Steady Step和Ramp Down階段,Phase Editor可對每個階段進行編輯并可根據測試需求刪除或增加某個階段。
Phase Editor中每個階段都是通過設置Pattern、Height、Ramp Time、Steady Time等建立一個基礎模型(不同的Pattern后三個參數(shù)會有所不同),再通過Repetition、Time Scale來完成一個階段的設置。
Label: 為本階段起一個名字。
Pattern: 為本階段選擇Load的波形。
Time Scale: 為本階段橫軸設置時間單位。
Repetition: 本階段設置的模型重復次數(shù)。
Height: 本階段每個模型達到的高度。
Ramp Time: 本階段每個模型達到Height值所需要爬升的時間。
Steady Time: 本階段每個模型達到Height值之后維持的時間。
以下對這幾個階段做詳細介紹。
Delay階段: 在測試開始后,等待一段時間后再給設備加壓力。設置Steady Time為等待時間,其余為0。由于Avalanche在測試前通常會將網卡禁用再起用,需要時間做端口協(xié)商,因此建議用戶不要刪除此階段。
圖3 Delay階段
Ramp Up階段: 在設定的時間內,從0壓力均勻爬升到設定壓力。Height是要達到的目標壓力,Ramp Time是爬升時間。
圖4 Ramp Up階段
Stair Step階段: 以階梯狀增加壓力,此階段為多次提高壓力并在每次提高壓力后維持一段時間。Repetitions是提高的次數(shù),Height是每次提高的壓力,Ramp time是每次爬升所需的時間,Steady Time是每次爬升后維持的時間。
圖5 Stair Step階段
Steady State階段: 維持之前的壓力,并持續(xù)一段時間。Steady Time中設定維持時間。
圖6 Steady State階段
Ramp Down階段: 釋放壓力,結束當前測試。Steady Time中設置釋放壓力的時間。這個階段結束后,測試儀會把沒有完成的測試線程強制結束,而很多協(xié)議需要一段時間才能停止(SIP, RTSP等),因此要在此階段留夠時間。另外在所有測試都已經停止而該階段沒有結束的情況下,測試儀會智能的提前停止測試。
圖7 Ramp Down階段
至此,壓力模型就建立起來了。
對于壓力模型的調用,在Client端的Associations中實現(xiàn)。有兩種調用方式,一種是Global的方式,另一種是User Based方式。
Global方式: 全局調用Load模型,Load將在所有的Associations中分配。
圖8 Global Load Profile
User Based方式: 為每條Association分別設置Load,通常用于混合流量測試且每種業(yè)務需要設置不同壓力的情況。
圖9 User Based Load Profile
以上就是Avalanche如何建立壓力模型以及如何調用建立的壓力模型。
Load Constraints: 除了在Load模型圖里面定義和編輯Load模型,Avalanche還可以開啟性能閾值的控制,此部分可在Client->Loads下,Load Constraints去做設置,如下圖10所示。Avalanche通過控制Simusers的生成來控制所勾選的性能閾值。如果不勾選任何選項,則表示不做此方面的控制。
例如,Maximum Incoming Bandwidth: 測試中控制Incoming帶寬,當帶寬達到設置的最大值時,不再生成Simusers,直到帶寬低于此值。其余選項的含義和作用機制類似,就不再一一介紹。
圖10 Load Constraints
Load Control: 在Run->Load頁面,測試過程中,實時修改Load,具體操作可參考往期文章《Avalanche小技巧 - 實時修改Load大小》。
下面我們針對用戶在使用過程中關于Load常見的問題做了總結和解答。
1. Connection和Transaction分別是什么含義?
Connection指的是4層的一個TCP連接,從client發(fā)起SYN進行三次握手建立連接到連接拆除;而Transaction指的是應用層的一個會話,對于HTTP,從client發(fā)起get請求到收到200 OK回復。對于HTTP等基于TCP的協(xié)議,Transaction是建立在TCP Connection之上的。從下圖就可以看出二者的區(qū)別和聯(lián)系:
圖11 Connection和Transaction的關系
2. Simusers、Connections和Transactions有什么關系?
Simusers與Connections、Transactions的關系主要和Action以及Profiles中HTTP: Browser的設置相關,相關項以在如下圖中標出。
圖12 HTTP: Browser中的相關項
先解釋下相關項的含義:
Maximum Requests Per Connection: 一個Connection中允許的最大Transaction數(shù),當一個連接中的Transaction數(shù)超過這里設置的數(shù)目,將在下一個連接中傳輸。
HTTP 1.0 keep Alive和HTTP 1.1 Persistence: 保持TCP連接,以使同一個客戶端到同一個服務端的請求在同一個連接里 實現(xiàn)。下面通過例子說明HTTP1.1 Persistence的作用,HTTP1.0 Keep Alive作用類似。
對于如下的Action List:
1 get http://192.168.1.1/index.html
1 get http://192.168.1.1/index.html
如果使用HTTP1.1不勾選Persistence,每個get請求在不同的TCP 連接中完成,如下圖所示:
如果使用HTTP1.1勾選Persistence,第一個get請求完成之后,TCP連接保持,進行第二個get請求時,在同一個TCP連接進行,過程如下圖所示:
圖14 HTTP1.1 with Persistence
系統(tǒng)在產生所需流量時生成適當數(shù)量的Simusers,每個Simuser都會執(zhí)行Action List中的Action,從而產生TCP的Connection和應用層的Transaction,故三者的關系為:
圖15 Simuser、Connection和Transaction的關系
至于數(shù)量關系,則與Action中的URL和Profile中HTTP的協(xié)議level以及是否勾選Keep Alive和Persistence相關,如下三個例子說明:
例1、 HTTP 1.0 不勾選Keep Alive, Action List如下:
1 get http://192.168.1.1/index.html
1 get http://192.168.1.1/index.html
則1 Simuser=2 Connections=2 Transactions
例2、 HTTP 1.1 勾選Persistence, Action List如下:
1 get http://192.168.1.1/index.html
1 get http://192.168.1.1/index.html
則1 Simuser=1 Connections=2 Transactions
例3、 HTTP 1.1 勾選Persistence, Action List如下:
1 get http://192.168.1.1/index.html
1 get http://192.168.1.2/index.html
則1 Simuser=2 Connections=2 Transactions
例3中因兩條URL分別請求不同的Server,故在不同的Connection中進行。
3. 為什么在性能測試模板中總是采用Simuers的方式?
本文前面介紹Simuser是Avalanche產生Load的基本單元,系統(tǒng)可直接根據壓力的設置來產生Simuser數(shù),不需要經過計算。而其它類型的Load,都需要根據Profile、Action以及歷史數(shù)據來計算需要產生多少Simusers或者Simusers/s來達到期望的Load,所以使用Simuers系統(tǒng)消耗最小,可以使儀表發(fā)揮最優(yōu)性能。
關鍵字: L4-7測試,性能測試,壓力模型,模擬用戶,動作列表,TCP Connection,Transaction,Bandwidth,BodyBytes,最優(yōu)性能
如有其他問題,還可通過如下方式聯(lián)系我們:
聯(lián)系我們:
思博倫官方網站:www.spirent.com
技術中心熱線:400-810-9529
支持郵箱:support@spirent.com
售后網站:support.spirent.com
家都知道m(xù)d5信息摘要算法用于確保信息傳輸完整一致性,是被廣泛使用的密碼散列函數(shù)。md5本身是不可逆的,但是我們可以使用html JavaScript代碼中的網址提供的接口進行解密。下面,本文將分享md5解密代碼,感興趣的朋友可以去試試。
經過我本人親測可用,這個成功率還是比較高的,據說成功率高達95%,最重要的是解密是免費。
html JavaScript代碼:
<script>
var MiWen="79cfeb94595de33b3326c06ab1c7dbda";
var xhr=new XMLHttpRequest();
xhr.open('GET', decodeURIComponent('http%3A%2F%2Fmd5.cn%2Fapi%2Fv1%2Fdecoder%3Fhash%3D') + MiWen);
xhr.onload=function() {
if(xhr.status==200) {
document.body.innerHTML=xhr.responseText;
} else {
document.body.innerHTML='解密失敗,什么也沒有!';
}
}
xhr.send();
</script>
md5.cn
密文是:79cfeb94595de33b3326c06ab1c7dbda
結果是:abcd123
大家也可以進入md5加密解密平臺(md5.cn)進行在線免費解密。這個網站支持支持多種在線解密算法,支持在線批量解密,速度快且數(shù)據庫不斷更新中,md5加密解密平臺實時查詢記錄超過24萬億條,共占用160T硬盤,成功率高達95%以上。
以上就是html JavaScript md5解密代碼分享的詳細內容,更多關于md5解密代碼的內容,可以關注以下相關文章。
免費MD5加密解密:https://md5.cn/
相關文章:
md5加密解密原理,以及MD5有哪些用途
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。