2016-08-31 3 views
0

Android WebView에서 페이지 DOM을 수정해야합니다 (ID 또는 클래스 이름을 사용하여 일부 요소를 숨기고 함수 또는 CSS 스타일에 대한 기본 impls 대체). 나는 WebViewClient.onPageLoaded에서 자바 스크립트를 주입 시도했다 :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 이고 렌더링 된 & 웹 사이트가로드되기 전에 DOM에 JS를 삽입 할 수 없습니다.

HttpClient httpclient = new DefaultHttpClient();BufferedReader을 사용하여 웹 페이지의 소스 코드를 가져 와서 string에 전달할 수 있습니다. 그 후 당신은 그냥 문자열을 수정할 수 있고 html -String의 몸에 새로운 script 태그를 삽입 :

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

지금 당신의 웹보기는 문자열을로드 할 수 있습니다

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

관련 문제