h5中performance.timing輕松獲取網頁各個數據 如dom加載時間 渲染時長 加載完觸發時間

在控制臺中輸入window.performance.timing(html5的屬性);

各字段的含義:

·         navigationStart:當前瀏覽器窗口的前一個網頁關閉,發生unload事件時的Unix毫秒時間戳。如果沒有前一個網頁,則等于fetchStart屬性。

·   unloadEventStart:如果前一個網頁與當前網頁屬于同一個域名,則返回前一個網頁的unload事件發生時的Unix毫秒時間戳。如果沒有前一個網頁,或者之前的網頁跳轉不是在同一個域名內,則返回值為0。

·   unloadEventEnd:如果前一個網頁與當前網頁屬于同一個域名,則返回前一個網頁unload事件的回調函數結束時的Unix毫秒時間戳。如果沒有前一個網頁,或者之前的網頁跳轉不是在同一個域名內,則返回值為0。

·   redirectStart:返回第一個HTTP跳轉開始時的Unix毫秒時間戳。如果沒有跳轉,或者不是同一個域名內部的跳轉,則返回值為0。

·   redirectEnd:返回最后一個HTTP跳轉結束時(即跳轉回應的最后一個字節接受完成時)的Unix毫秒時間戳。如果沒有跳轉,或者不是同一個域名內部的跳轉,則返回值為0。

·   fetchStart:返回瀏覽器準備使用HTTP請求讀取文檔時的Unix毫秒時間戳。該事件在網頁查詢本地緩存之前發生。

·   domainLookupStart:返回域名查詢開始時的Unix毫秒時間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值。

·   domainLookupEnd:返回域名查詢結束時的Unix毫秒時間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值。

·   connectStart:返回HTTP請求開始向服務器發送時的Unix毫秒時間戳。如果使用持久連接(persistent connection),則返回值等同于fetchStart屬性的值。

·   connectEnd:返回瀏覽器與服務器之間的連接建立時的Unix毫秒時間戳。如果建立的是持久連接,則返回值等同于fetchStart屬性的值。連接建立指的是所有握手和認證過程全部結束。

·   secureConnectionStart:返回瀏覽器與服務器開始安全鏈接的握手時的Unix毫秒時間戳。如果當前網頁不要求安全連接,則返回0。

·   requestStart:返回瀏覽器向服務器發出HTTP請求時(或開始讀取本地緩存時)的Unix毫秒時間戳。

·   responseStart:返回瀏覽器從服務器收到(或從本地緩存讀取)第一個字節時的Unix毫秒時間戳。

·   responseEnd:返回瀏覽器從服務器收到(或從本地緩存讀取)最后一個字節時(如果在此之前HTTP連接已經關閉,則返回關閉時)的Unix毫秒時間戳。

·   domLoading:返回當前網頁DOM結構開始解析時(即Document.readyState屬性變為“loading”、相應的readystatechange事件觸發時)的Unix毫秒時間戳。

·   domInteractive:返回當前網頁DOM結構結束解析、開始加載內嵌資源時(即Document.readyState屬性變為“interactive”、相應的readystatechange事件觸發時)的Unix毫秒時間戳。

·   domContentLoadedEventStart:返回當前網頁DOMContentLoaded事件發生時(即DOM結構解析完畢、所有腳本開始運行時)的Unix毫秒時間戳。

·   domContentLoadedEventEnd:返回當前網頁所有需要執行的腳本執行完成時的Unix毫秒時間戳。

·   domComplete:返回當前網頁DOM結構生成時(即Document.readyState屬性變為“complete”,以及相應的readystatechange事件發生時)的Unix毫秒時間戳。

·   loadEventStart:返回當前網頁load事件的回調函數開始時的Unix毫秒時間戳。如果該事件還沒有發生,返回0。

·   loadEventEnd:返回當前網頁load事件的回調函數運行結束時的Unix毫秒時間戳。如果該事件還沒有發生,返回0。通過while循環持續判斷直到loadEventEnd>0則表示完全加載完畢了!網絡不再有任何數據請求、dom也渲染完畢了!!!

Android webview交互性能監測指標獲取方法(白屏時間,domc,整頁時間,首屏時間)

業界衡量移動web app交互性能的優劣主要是通過監測webview渲染頁面時白屏時間DOM樹構建時間整頁時間首屏時間這三個指標來完成的,那么這四個指標分別的意義是什么呢?我們從w3c提供的navigation Timing中看到交互性能指的是Processing和onLoad這兩部分的時間。
[圖片上傳失敗...(image-a70c42-1576075390535)]
在瀏覽器交互階段(Processing和onLoad時間段)瀏覽器接收服務器返回的基礎頁數據后,瀏覽器需要對HTML這個單純的文本內容進行解析,從文本中構建出一個內部數據結構,叫做DOM樹(DOM tree),用于組織將要繪制在屏幕上的內容。從HTML也能得到外聯或內聯的CSS腳本和JavaScript腳本,當然還有媒體文件,比如圖片、視頻、聲音,這些都需要再次發起網絡請求下載。CSS文本內容中的規則同樣會被構建成一個內部數據結構,叫做CSS樹(CSS tree),來決定DOM樹的節點在屏幕上的布局、顏色、狀態效果。JavaScript腳本被觸發執行后,除了計算業務,往往還需要操作DOM樹,就是所謂的DOM API。

image.png

在控制臺中輸入window.performance.timing(html5的屬性);

各字段的含義:

· navigationStart:當前瀏覽器窗口的前一個網頁關閉,發生unload事件時的Unix毫秒時間戳。如果沒有前一個網頁,則等于fetchStart屬性。

· unloadEventStart:如果前一個網頁與當前網頁屬于同一個域名,則返回前一個網頁的unload事件發生時的Unix毫秒時間戳。如果沒有前一個網頁,或者之前的網頁跳轉不是在同一個域名內,則返回值為0。

· unloadEventEnd:如果前一個網頁與當前網頁屬于同一個域名,則返回前一個網頁unload事件的回調函數結束時的Unix毫秒時間戳。如果沒有前一個網頁,或者之前的網頁跳轉不是在同一個域名內,則返回值為0。

· redirectStart:返回第一個HTTP跳轉開始時的Unix毫秒時間戳。如果沒有跳轉,或者不是同一個域名內部的跳轉,則返回值為0。

· redirectEnd:返回最后一個HTTP跳轉結束時(即跳轉回應的最后一個字節接受完成時)的Unix毫秒時間戳。如果沒有跳轉,或者不是同一個域名內部的跳轉,則返回值為0。

· fetchStart:返回瀏覽器準備使用HTTP請求讀取文檔時的Unix毫秒時間戳。該事件在網頁查詢本地緩存之前發生。

· domainLookupStart:返回域名查詢開始時的Unix毫秒時間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值。

· domainLookupEnd:返回域名查詢結束時的Unix毫秒時間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值。

· connectStart:返回HTTP請求開始向服務器發送時的Unix毫秒時間戳。如果使用持久連接(persistent connection),則返回值等同于fetchStart屬性的值。

· connectEnd:返回瀏覽器與服務器之間的連接建立時的Unix毫秒時間戳。如果建立的是持久連接,則返回值等同于fetchStart屬性的值。連接建立指的是所有握手和認證過程全部結束。

· secureConnectionStart:返回瀏覽器與服務器開始安全鏈接的握手時的Unix毫秒時間戳。如果當前網頁不要求安全連接,則返回0。

· requestStart:返回瀏覽器向服務器發出HTTP請求時(或開始讀取本地緩存時)的Unix毫秒時間戳。

· responseStart:返回瀏覽器從服務器收到(或從本地緩存讀取)第一個字節時的Unix毫秒時間戳。

· responseEnd:返回瀏覽器從服務器收到(或從本地緩存讀取)最后一個字節時(如果在此之前HTTP連接已經關閉,則返回關閉時)的Unix毫秒時間戳。

· domLoading:返回當前網頁DOM結構開始解析時(即Document.readyState屬性變為“loading”、相應的readystatechange事件觸發時)的Unix毫秒時間戳。

· domInteractive:返回當前網頁DOM結構結束解析、開始加載內嵌資源時(即Document.readyState屬性變為“interactive”、相應的readystatechange事件觸發時)的Unix毫秒時間戳。

· domContentLoadedEventStart:返回當前網頁DOMContentLoaded事件發生時(即DOM結構解析完畢、所有腳本開始運行時)的Unix毫秒時間戳。

· domContentLoadedEventEnd:返回當前網頁所有需要執行的腳本執行完成時的Unix毫秒時間戳。

· domComplete:返回當前網頁DOM結構生成時(即Document.readyState屬性變為“complete”,以及相應的readystatechange事件發生時)的Unix毫秒時間戳。

· loadEventStart:返回當前網頁load事件的回調函數開始時的Unix毫秒時間戳。如果該事件還沒有發生,返回0。

· loadEventEnd:返回當前網頁load事件的回調函數運行結束時的Unix毫秒時間戳。如果該事件還沒有發生,返回0。通過while循環持續判斷直到loadEventEnd>0則表示完全加載完畢了!網絡不再有任何數據請求、dom也渲染完畢了!!!

Android webview交互性能監測指標獲取方法(白屏時間,domc,整頁時間,首屏時間)

業界衡量移動web app交互性能的優劣主要是通過監測webview渲染頁面時白屏時間DOM樹構建時間整頁時間首屏時間這三個指標來完成的,那么這四個指標分別的意義是什么呢?我們從w3c提供的navigation Timing中看到交互性能指的是Processing和onLoad這兩部分的時間。

在瀏覽器交互階段(Processing和onLoad時間段)瀏覽器接收服務器返回的基礎頁數據后,瀏覽器需要對HTML這個單純的文本內容進行解析,從文本中構建出一個內部數據結構,叫做DOM樹(DOM tree),用于組織將要繪制在屏幕上的內容。從HTML也能得到外聯或內聯的CSS腳本和JavaScript腳本,當然還有媒體文件,比如圖片、視頻、聲音,這些都需要再次發起網絡請求下載。CSS文本內容中的規則同樣會被構建成一個內部數據結構,叫做CSS樹(CSS tree),來決定DOM樹的節點在屏幕上的布局、顏色、狀態效果。JavaScript腳本被觸發執行后,除了計算業務,往往還需要操作DOM樹,就是所謂的DOM API。
[圖片上傳失敗...(image-786357-1576075390535)]
1、白屏時間
指瀏覽器開始顯示內容的時間。但是在傳統的采集方式里,是在HTML的head標簽結尾里記錄時間戳,來計算白屏時間。在這個時刻,瀏覽器開始解析body標簽內的內容。而現代瀏覽器不會等待CSS樹(所有CSS文件下載和解析完成)和DOM樹(整個body標簽解析完成)構建完成才開始繪制,而是馬上開始顯示中間結果。所以經常在低網速的環境中,觀察到頁面由上至下緩慢顯示完,或者先顯示文本內容后再重繪成帶有格式的頁面內容。
在android中我們通過使用webview.WebChromeClient的onReceivedTitle事件來近似獲得白屏時間。
2、DOM樹構建時間
指瀏覽器開始對基礎頁文本內容進行解析到從文本中構建出一個內部數據結構(DOM樹)的時間,這個事件是從HTML中的onLoad的延伸而來的,當一個頁面完成加載時,初始化腳本的方法是使用load事件,但這個類函數的缺點是僅在所有資源都完全加載后才被觸發,這有時會導致比較嚴重的延遲,開發人員隨后創建了domready事件,它在DOM加載之后及資源加載之前被觸發。domready被眾多JavaScript庫所采用,它在本地瀏覽器中以DOMContentLoaded事件的形式被使用。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取domc(window.DOMContentLoaded事件)時間,代碼:

@Override
public void onReceivedTitle (WebView view, String title) {
    view.loadUrl("javascript:" + 
 "window.addEventListener('DOMContentLoaded', function() {" +
        "prompt('domc:' + new Date().getTime());" + 
    );
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("domc".equals(strs[0])){
 result.getCurrentRun().setDocComplete(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}

3、首屏時間
首屏時間(FirstScreen Time),是從網頁應用的角度定義的指標,在Navigation Timing或者瀏覽器實現中并沒有相關指標值。首屏時間,是指用戶看到第一屏,即整個網頁頂部大小為當前窗口的區域,顯示完整的時間。常用的方法有,頁面標簽標記法、圖像相似度比較法和首屏高度內圖片加載法;
1)頁面標簽標記法,在HTML文檔中對應首屏內容的標簽結束位置,使用內聯的JavaScript代碼記錄當前時間戳,比較局限;2)圖像相似度比較法,通過比較連續截屏圖像的像素點變化趨勢確定首屏時間,最為科學和直觀的方式,但是比較消耗本地設備的運行資源;3)首屏高度內圖片加載法,通過尋找首屏區域內的所有圖片,計算它們加載完的時間去得到首屏時間,這樣比較符合網頁的實際體驗并且比較節省設備運行資源;
具體實現上我采用的是最后一種,即“首屏高度內圖片加載法”;因為通常需要考慮首屏時間的頁面,都是因為在首屏位置內放入了較多的圖片資源。現代瀏覽器處理圖片資源時是異步的,會先將圖片長寬應用于頁面排版,然后隨著收到圖片數據由上至下繪制顯示的。并且瀏覽器對每個頁面的TCP連接數限制,使得并不是所有圖片都能立刻開始下載和顯示。因此我們在DOM樹構建完成后即可遍歷獲得所有在設備屏幕高度內的所有圖片資源標簽,在所有圖片標簽中添加document.onload事件,在整頁加載完成(window.onLoad事件發生)時遍歷圖片標簽并獲得之前注冊的document.onload事件時間的最大值,該最大值減去navigationStart即認為近似的首屏時間。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取firstscreen時間;
js部分計算首屏時間的邏輯代碼:

function first_screen () {
 var imgs = document.getElementsByTagName("img"), fs = +new Date;
 var fsItems = [], that = this;
    function getOffsetTop(elem) {
        var top = 0;
        top = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop;
        try{
            top += elem.getBoundingClientRect().top;    
        }catch(e){
 
        }finally{
            return top;
        }
 
    }
    var loadEvent = function() {
        //gif避免
        if (this.removeEventListener) {
            this.removeEventListener("load", loadEvent, false);
        }
        fsItems.push({
            img : this,
            time : +new Date
        });
    }
    for (var i = 0; i < imgs.length; i++) {
        (function() {
            var img = imgs[i];
 
            if (img.addEventListener) {
 
                !img.complete && img.addEventListener("load", loadEvent, false);
            } else if (img.attachEvent) {
 
                img.attachEvent("onreadystatechange", function() {
                    if (img.readyState == "complete") {
                        loadEvent.call(img, loadEvent);
                    }
 
                });
            }
 
        })();
    }
    function firstscreen_time() {
        var sh = document.documentElement.clientHeight;
        for (var i = 0; i < fsItems.length; i++) {
            var item = fsItems[i], img = item['img'], time = item['time'], top = getOffsetTop(img);
            if (top > 0 && top < sh) {
                fs = time > fs ? time : fs;
            }
        }
        return fs;
    }      
    window.addEventListener('load', function() {
     prompt('firstscreen:' + firstscreen_time());
     });
}

webview的注入代碼:

private void registerOnLoadHandler(WebView view) {
    String jscontent = getJavaScriptAsString();
    view.loadUrl("javascript:" + jscontent + 
      "window.addEventListener('DOMContentLoaded', function() {" +
          "first_screen();
       });"
    );
}
 
@Override
public void onReceivedTitle (WebView view, String title) {
 registerOnLoadHandler(view);
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("firstscreen".equals(strs[0])){
 result.getCurrentRun().setFirstScreen(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}

4、整頁時間
整頁時間(Page Load Time),是指頁面完成整個加載過程的時刻。從Navigation Timing API上采集,就是loadEventEnd減去navigationStart。在傳統采集方法中,會使用window對象的onload事件來記錄時間戳,它表示瀏覽器認定該頁面已經載入完全了。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取load(window.onLoad事件)時間,代碼:

@Override
public void onReceivedTitle (WebView view, String title) {
    view.loadUrl("javascript:" + 
 "window.addEventListener('load', function() {" +
        "prompt('load:' + new Date().getTime());" + 
    );
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("load".equals(strs[0])){
 result.getCurrentRun().setFullyLoaded(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}

1、白屏時間
指瀏覽器開始顯示內容的時間。但是在傳統的采集方式里,是在HTML的head標簽結尾里記錄時間戳,來計算白屏時間。在這個時刻,瀏覽器開始解析body標簽內的內容。而現代瀏覽器不會等待CSS樹(所有CSS文件下載和解析完成)和DOM樹(整個body標簽解析完成)構建完成才開始繪制,而是馬上開始顯示中間結果。所以經常在低網速的環境中,觀察到頁面由上至下緩慢顯示完,或者先顯示文本內容后再重繪成帶有格式的頁面內容。
在android中我們通過使用webview.WebChromeClient的onReceivedTitle事件來近似獲得白屏時間。
2、DOM樹構建時間
指瀏覽器開始對基礎頁文本內容進行解析到從文本中構建出一個內部數據結構(DOM樹)的時間,這個事件是從HTML中的onLoad的延伸而來的,當一個頁面完成加載時,初始化腳本的方法是使用load事件,但這個類函數的缺點是僅在所有資源都完全加載后才被觸發,這有時會導致比較嚴重的延遲,開發人員隨后創建了domready事件,它在DOM加載之后及資源加載之前被觸發。domready被眾多JavaScript庫所采用,它在本地瀏覽器中以DOMContentLoaded事件的形式被使用。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取domc(window.DOMContentLoaded事件)時間,代碼:

@Override
public void onReceivedTitle (WebView view, String title) {
    view.loadUrl("javascript:" + 
 "window.addEventListener('DOMContentLoaded', function() {" +
        "prompt('domc:' + new Date().getTime());" + 
    );
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("domc".equals(strs[0])){
 result.getCurrentRun().setDocComplete(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}

3、首屏時間
首屏時間(FirstScreen Time),是從網頁應用的角度定義的指標,在Navigation Timing或者瀏覽器實現中并沒有相關指標值。首屏時間,是指用戶看到第一屏,即整個網頁頂部大小為當前窗口的區域,顯示完整的時間。常用的方法有,頁面標簽標記法、圖像相似度比較法和首屏高度內圖片加載法;

1)頁面標簽標記法,在HTML文檔中對應首屏內容的標簽結束位置,使用內聯的JavaScript代碼記錄當前時間戳,比較局限;2)圖像相似度比較法,通過比較連續截屏圖像的像素點變化趨勢確定首屏時間,最為科學和直觀的方式,但是比較消耗本地設備的運行資源;3)首屏高度內圖片加載法,通過尋找首屏區域內的所有圖片,計算它們加載完的時間去得到首屏時間,這樣比較符合網頁的實際體驗并且比較節省設備運行資源;
具體實現上我采用的是最后一種,即“首屏高度內圖片加載法”;因為通常需要考慮首屏時間的頁面,都是因為在首屏位置內放入了較多的圖片資源。現代瀏覽器處理圖片資源時是異步的,會先將圖片長寬應用于頁面排版,然后隨著收到圖片數據由上至下繪制顯示的。并且瀏覽器對每個頁面的TCP連接數限制,使得并不是所有圖片都能立刻開始下載和顯示。因此我們在DOM樹構建完成后即可遍歷獲得所有在設備屏幕高度內的所有圖片資源標簽,在所有圖片標簽中添加document.onload事件,在整頁加載完成(window.onLoad事件發生)時遍歷圖片標簽并獲得之前注冊的document.onload事件時間的最大值,該最大值減去navigationStart即認為近似的首屏時間。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取firstscreen時間;
js部分計算首屏時間的邏輯代碼:

function first_screen () {
 var imgs = document.getElementsByTagName("img"), fs = +new Date;
 var fsItems = [], that = this;
    function getOffsetTop(elem) {
        var top = 0;
        top = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop;
        try{
            top += elem.getBoundingClientRect().top;    
        }catch(e){
 
        }finally{
            return top;
        }
 
    }
    var loadEvent = function() {
        //gif避免
        if (this.removeEventListener) {
            this.removeEventListener("load", loadEvent, false);
        }
        fsItems.push({
            img : this,
            time : +new Date
        });
    }
    for (var i = 0; i < imgs.length; i++) {
        (function() {
            var img = imgs[i];
 
            if (img.addEventListener) {
 
                !img.complete && img.addEventListener("load", loadEvent, false);
            } else if (img.attachEvent) {
 
                img.attachEvent("onreadystatechange", function() {
                    if (img.readyState == "complete") {
                        loadEvent.call(img, loadEvent);
                    }
 
                });
            }
 
        })();
    }
    function firstscreen_time() {
        var sh = document.documentElement.clientHeight;
        for (var i = 0; i < fsItems.length; i++) {
            var item = fsItems[i], img = item['img'], time = item['time'], top = getOffsetTop(img);
            if (top > 0 && top < sh) {
                fs = time > fs ? time : fs;
            }
        }
        return fs;
    }      
    window.addEventListener('load', function() {
     prompt('firstscreen:' + firstscreen_time());
     });
}

webview的注入代碼:

private void registerOnLoadHandler(WebView view) {
    String jscontent = getJavaScriptAsString();
    view.loadUrl("javascript:" + jscontent + 
      "window.addEventListener('DOMContentLoaded', function() {" +
          "first_screen();
       });"
    );
}
 
@Override
public void onReceivedTitle (WebView view, String title) {
 registerOnLoadHandler(view);
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("firstscreen".equals(strs[0])){
 result.getCurrentRun().setFirstScreen(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}

4、整頁時間
整頁時間(Page Load Time),是指頁面完成整個加載過程的時刻。從Navigation Timing API上采集,就是loadEventEnd減去navigationStart。在傳統采集方法中,會使用window對象的onload事件來記錄時間戳,它表示瀏覽器認定該頁面已經載入完全了。
在android中我們通過注入js代碼到webview中的方式來實現;具體實現上,在WebChromeClient的onReceivedTitle事件被觸發時注入我們的js代碼,然后通過WebChromeClient的onJsPrompt事件來獲取load(window.onLoad事件)時間,代碼:

@Override
public void onReceivedTitle (WebView view, String title) {
    view.loadUrl("javascript:" + 
 "window.addEventListener('load', function() {" +
        "prompt('load:' + new Date().getTime());" + 
    );
}
 
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult r) {
 Log.i(UAQ_WEB_ACTIVITY, "**** Blocking Javascript Prompt :" + message);
 if(message != null){
 if(!preCacheRun){
 String[] strs = message.split(":");
 if(2 == strs.length){ 
 if("load".equals(strs[0])){
 result.getCurrentRun().setFullyLoaded(Long.valueOf(strs[1].trim()));
 }
 }
 } 
 }
 r.confirm(defaultValue);
 return true;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容