【问题标题】:In Android Webview, am I able to modify a webpage's DOM?在 Android Webview 中,我可以修改网页的 DOM 吗?
【发布时间】:2011-01-14 05:08:05
【问题描述】:

假设我通过 webview 加载第 3 方 URL。

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new MyWebChromeClient());
        webview.loadUrl("http://ebay.com");         
    }

我是否可以在此 WebView 中注入一些东西,以用我自己的替换 ebay 徽标?

【问题讨论】:

  • 用自己的标志代替别人的标志听起来是个很糟糕的主意。
  • 这只是 webview 可以做什么和不能做什么的一个例子。我实际上想从该第三方网站 Linkedin 中删除所有 标签(因为该网站有错误)。
  • 这是 PoliceOverflow 还是 Stackoverflow?
  • 这里有同样的问题:stackoverflow.com/questions/7309123/…
  • 是的,您可以这样做。例如,请参阅我的这个问题,因为我正在做类似的事情。请记住,做这样的事情可能违反您显示页面的服务的条款和条件。在最好的情况下,它会处于灰色区域,但我同意你的观点,有些网站有时只是坏了,你的用户会喜欢“修复”。 stackoverflow.com/questions/19522716/…

标签: javascript android templates webview


【解决方案1】:

扩展 CommonsWare 的正确答案:

WebView webview = new WebView();
webview.setWebViewClient(new WebClient());
webView.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("stackoverflow.com");

然后在 WebClient 中:

public class WebClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) 
    {       
        // Obvious next step is: document.forms[0].submit()
        view.loadUrl("javascript:document.forms[0].q.value='[android]'");       
    }
}

简而言之,您等待页面加载。然后你 loadUrl("javascript:[your javascript here]").

【讨论】:

  • 确保您在 webview 上将 javascript enabled 设置为 true,否则您将浪费大量时间尝试像我一样进行调试。
  • 为什么需要重写 shouldOverrideUrlLoading?
  • 我不需要shouldOverrideUrlLoading 而不是view.loadUrl 看起来你需要view.evaluateJavascript("document.forms[0].q.value='[android]'", null)
  • 基于这个答案,我能够想出以下内容,它展示了如何戳 DOM 来初始化表单上的字段。 github.com/slogan621/tscharts-register/blob/master/app/src/main/… - 感谢您的出色回答让我开始了。
【解决方案2】:

不直接。您可以通过loadUrl() 在当前网页的上下文中调用Javascript 代码,就像书签一样。但是,您无法从 Java 代码直接访问 DOM。

【讨论】:

  • 虽然直接访问部分是正确的,但是对 Dom 的完全间接访问,使用 javaScriptBridge 只需传递完整的 Html 就可以获得整个页面。然后可以通过字符串操作以任何方式修改此页面并重新加载回 webview。
【解决方案3】:
WebView webview = new WebView();

//Maybe need to set to enabled javascript?
webView.getSettings().setJavaScriptEnabled(true);

webview.setWebViewClient(new WebClient());

webview.loadUrl("stackoverflow.com");

【讨论】:

  • 这与问题无关。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多