2016-08-31 10 views
0

Android WebViewのページDOMを修正する必要があります(idやclassnameを使用していくつかの要素を隠し、関数やCSSスタイルのデフォルトimplsを置き換えてください)。私はWebViewClient.onPageLoadedではJavaScriptを注入しようとしました:Android WebViewでDOMを変更するには?

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     getSupportActionBar().setTitle("Finishing "); 
     getSupportActionBar().setSubtitle(url); 
     view.loadUrl("javascript:alert('hello world 2');"); 
     getSupportActionBar().setTitle("Finished"); 
    } 
}); 

(実際には隠れてするのではなく、ここにJSで警告を示します)。これは、ロードされていないすべてのページが表示されるため、実際には望んでいないことです。 onPageStartedで何らかの理由jsのロードについては

は動作しません - それは、元のURLをロードすることを防止する:

webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      getSupportActionBar().setTitle("Started "); 
      getSupportActionBar().setSubtitle(url); 

      webView.evaluateJavascript("alert('hello world 1');", null); 
      // view.loadUrl("javascript:alert('hello world 1');") prevents too 
     } 

は前にロードするページの開始をJS を注入することが可能ですか? WebViewにDOMイベントのコールバックを持つためのどんなトリックですか?

答えて

0

DOM レンダリングされた&がロードされているため、側面が読み込まれる前にJSをDOMに挿入することはできません。

HttpClient httpclient = new DefaultHttpClient();BufferedReaderを使用してウェブページのソースコードを取得し、stringに渡すことができます。その後はあなただけ、その文字列を変更する可能性があり、html -stringのボディに新しいscriptタグを挿入します。

<script> 
    alert("Hey, whats up?"); 
</script> 

今、あなたのWebViewは、文字列をロードすることができます

webView.loadData(yourHtmlString, "text/html; charset=utf-8", "UTF-8"); 

をそして、それはロードする必要がありますアラートポップアップが表示されます。

+0

これは解決策ですが、元のページのスクリプトのために時々動作しない可能性があります。それを適切にするために私はhtmlを解析し、スクリプトチェーンを実行してスクリプトを実行させ、元のページのスクリプトを実行する必要があり、かなり難しいです。 BTW。実際の目的は要素を隠すことではなく、ラッパーを作成することまたは要素を不可視にするためにCSSを変更することでした。 – 4ntoine

0

私はこのような問題を解決しましたが、私はこれをonPageFinishedメソッドで解決しました。 DOM操作の前にwebviewを非表示にすることができます。したがって、ユーザーはプロセスの影響を受けません。

public class WebClient extends WebViewClient { 
    ... 

     @Override 
     public void onPageFinished(WebView view, String url) { 

       view.loadUrl("javascript:document.getElementById(\"jumbotron-test\").innerHTML = \"\";void(0);"); 
       webView.setVisibility(View.VISIBLE); 

     } 
    } 
+0

「ロードされていないすべてのページが表示されるため、実際にはこれが望ましくありません。 – 4ntoine

関連する問題