Vraag Hoe HTML-inhoud op te halen en te wijzigen vanuit WebView met Http Post


ik ontwikkel een Android-app die een deel van een HTML-pagina laat zien.voor de eerste stap gebruik ik de betreffende code HTML-inhoud ophalen uit WebView.

  • Volledige HTML-afbeelding

part 1

  • Dat deel wil ik laten zien

    part 2

    /* An instance of this class will be registered as a JavaScript interface */
    class MyJavaScriptInterface
    {
        @SuppressWarnings("unused")
        public void processHTML(String html)
        {
            // process the html as needed by the app
        }
    }
    
    final WebView browser = (WebView)findViewById(R.id.browser);
    /* JavaScript must be enabled if you want it to work, obviously */
    browser.getSettings().setJavaScriptEnabled(true);
    
    /* Register a new JavaScript interface called HTMLOUT */
    browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
    
    /* WebViewClient must be set BEFORE calling loadUrl! */
    browser.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            /* This call inject JavaScript into the page which just finished loading. */
            browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });
    
    /* load a web page */
    browser.loadUrl("http://example.com/gethtml.html"); 
    

maar wanneer een gebruiker op een knop in de tweede afbeelding klikt, wordt een HTTP-postmethode aangeroepen en dit is de resultaat-HTML
enter image description here

mijn vraag is hoe de Post-resultaat-HTML op te halen en aan te passen voordat deze aan de gebruiker getoond wordt? en toon zoiets als dit enter image description here


12
2017-08-25 17:51


oorsprong


antwoorden:


Een eenvoudige oplossing zou kunnen zijn om aangepaste CSS-code in uw webview te injecteren, waardoor de stijl van het HTML-element dat u "alleen" wilt weergeven, wordt gewijzigd.

U moet een CSS als volgt injecteren:

#central-box {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    // depends on the structure of the page
}

Zie ook in dit antwoord voor een voorbeeld van hoe het te doen.


1
2017-09-01 12:01



Er zijn minstens drie manieren om dit te doen en ik sta dicht bij elk van hen:

  1. Je hebt al een globaal idee van de snelle en vervuilde methode van @lifeisfoo, maar om zowel GET als POST pre-API 21 te gebruiken, zou je opPageCommitVisible (WebView-weergave, String-URL) moeten gebruiken. Als onPageFinished (WebView-weergave, String-URL) en shouldOverrideUrlLoading (WebView-weergave, String-URL) alleen activeren bij GET-aanvragen.

Dit is waarom, rechtstreeks van de SDK ... ..."onPageCommitVisible callback kan worden gebruikt om te bepalen op welk moment het veilig is om een ​​gerecyclede WebView zichtbaar te maken, zodat er geen oude inhoud wordt weergegeven. Het wordt op het vroegste punt opgeroepen waarop kan worden gegarandeerd dat onDraw (Canvas) geen inhoud meer uit vorige navigatie haalt. De volgende trekking geeft de achtergrondkleur van de WebView weer of een deel van de inhoud van de nieuw geladen pagina."het heeft een beroep gedaan op alle content-updates POST of GET.

  1. Iets beter kun je een lokale proxywebpagina maken met de javascript-interface en andere leuke bits die al op hun plaats zitten en als een bron worden opgeslagen, als de gewenste inhoud in het iframe van het volledige venster wordt geladen, krijg je echt een goede controle, kun je interactief zijn met uw proxy met onPageFinished omdat het zich in een iframe bevindt, kunt u met de doelpagina communiceren met onLoadResource, interceptie afhandelen met behulp van de oude shouldInterceptRequest die een WebResourceResponse retourneert en POST-driven updates verwerkt met onFormResubmission.

  2. Ten slotte, als API-ondersteuning ouder dan 21 geen groot probleem is, zou de beste methode zijn om de nieuwe shouldInterceptRequest te gebruiken die het nieuwe WebResourceRequest-object bevat waarmee u verschillende afhandeling voor verschillende aanvraagtypen kunt specificeren.

Hier zijn de API-koppelingen voor het nieuwe WebResourceRequest-object en de nieuwe methode shouldInterceptRequest op de WebViewClient ...

http://developer.android.com/reference/android/webkit/WebResourceRequest.html

http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest(android.webkit.WebView, android.webkit.WebResourceRequest)

hoop dat het helpt :)


0
2017-09-04 11:25