2017-03-06 47 views
2

有一個網站我想在我的應用程序中使用它顯示內容。WebView ContentChanged事件

我必須運行一個像getNames()這樣的JavaScript代碼,它將填充名稱中的div。執行代碼後,需要1-2秒才能填充。

我想在div填滿時更新應用程序。問題是,我找不到像webView1.ContentChanged或webView1.SourceChanged這樣的事件。唯一的方法是創建一個Timer,將其設置爲3秒,然後在執行getNames()時啓動它,然後獲取源代碼。

任何人有什麼想法?

感謝

回答

1

的WebView沒有內置的事件,支持檢測的內容發生變化。您可以使用帶有JavaScript eval函數的InvokeScriptAsync以使用HTML事件處理程序,並使用HTML事件處理程序中的window.external.notify通過WebView.ScriptNotify通知應用程序。

關於如何檢測由JavaScript改變HTML內容,你可以參考DOM mutation events replacement

MDN->Web technology for developers->Web APIs->MutationObserver

我做了一個簡單的代碼示例爲您提供:

<WebView Source="ms-appx-web:///HTMLPage1.html" ScriptNotify="WebView_ScriptNotify"></WebView> 

<!DOCTYPE html> 
 

 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
 
<head> 
 
    <meta charset="utf-8" /> 
 
    <title></title> 
 
    <script type="text/javascript"> 
 

 
     function detectContent() 
 
     { 
 
      var target = document.getElementById('div'); 
 

 
      var observer = new MutationObserver(function (mutations) { 
 
       mutations.forEach(function (mutation) { 
 
        window.external.notify('div changed'); 
 
        update("div changed"); 
 
       }); 
 
      }); 
 
      var config = { attributes: true, childList: true, characterData: true }; 
 
      observer.observe(target, config); 
 
     } 
 

 
     function update(e) 
 
     { 
 
      var div = document.getElementById("div"); 
 
      div.innerHTML = e; 
 
     } 
 
    </script> 
 
</head> 
 
<body onload="detectContent();"> 
 
    <div id="div" style="margin-top:100px;"></div> 
 
    <br /> 
 
    <input value="update" onclick="update('abc');" type="button"/> 
 
</body> 
 
</html>

private void WebView_ScriptNotify(object sender, NotifyEventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine(e.Value); 
} 

然後如果Div的內容被改變,WebView的ScriptNotify事件將被觸發。在我的代碼示例中,Webview只是加載本地html頁面。

就你而言,如果網站不屬於你,你需要使用InvokeScriptAsync在WebView navigatstarting事件中注入javascript代碼。