【问题标题】:How to display a part of the webpage using WebViewController plugin in Flutter?如何在 Flutter 中使用 WebViewController 插件显示网页的一部分?
【发布时间】:2019-10-04 10:27:41
【问题描述】:

我有一个 div id 作为campaign-nav 和一个class id 作为campaign-term-list 以及

我不想显示页眉、菜单和页脚。在 Android 中,我可以使用以下代码:(找到的 WebViewController android 代码:Display a part of the webpage on the webview android

如何在 Flutter 中使用 WebViewController 插件显示网页的一部分?

view.getSettings().setJavaScriptEnabled(true);
        view.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageFinished(WebView view, String URL)
            {
                view.loadUrl("javascript:(function() { " +
                        "var head = document.getElementsByClassName('header')[0].style.display='none'; " +
                        "var head = document.getElementsByClassName('blog-sidebar')[0].style.display='none'; " +
                        "var head = document.getElementsByClassName('footer-container')[0].style.display='none'; " +
                        "})()");

            }
        });
        view.loadUrl("your url");

更新: Flutter 例子有;

 final Completer<WebViewController> _controller = Completer<WebViewController>();

他们使用 _controller 作为;

new WebView(
              initialUrl:
                  'h****s://mysite.com/campaing/',
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
              },
              javascriptChannels: <JavascriptChannel>[
                _toasterJavascriptChannel(context),
              ].toSet(),

              onPageFinished: (String url) {
                print('Page finished loading: $url');

                //Here is I put a boolean variable so I can show a progress indicator
                setState(() {
                  _loadedPage = true;

                });
              },
            ),

更新 2: 在我的网页中,我有如下所示的页脚。

<div id="footer">
    <div class="container">
        <div class="row">
            <div class="col-md-4">
                <div class="footer-menu">

我把你的代码放在下面 _controller.complete(webViewController);部分。但仍然显示页脚。

onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
                webViewController.evaluateJavascript("document.getElementsByClassName('footer-menu')[0].style.display='none';");
              },

当我尝试将 webViewController.evaluateJavascript 放入 onPageFinished 部分时,它找不到“.evaluateJavascript”部分。

更新 3: 完整代码:(不工作)

new WebView(
              initialUrl: 'https://stackoverflow.com',
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (controller){
                _myController = controller;
              },
              javascriptChannels: <JavascriptChannel>[
                _toasterJavascriptChannel(context),
              ].toSet(),
              onPageFinished: (url){
                print('Page finished loading: $url');
                _myController.evaluateJavascript("document.getElementsByClassName('header')[0].style.display='none';");
                setState(() {
                  _loadedPage = true;
                });
              },
            ),

【问题讨论】:

    标签: webview flutter


    【解决方案1】:

    到目前为止,我自己还没有完成,但正如 webview_flutter 包中的官方 API 中所述,您应该能够通过调用 WebViewController 提供的 evaluateJavascript 方法来实现这一点,如 @987654322 所示@。

    WebView(
      initialUrl: 'https://stackoverflow.com',
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (controller) {
        // here you can access the WebViewController
        controller.evaluateJavascript("document.getElementsByClassName('header')[0].style.display='none';");
      },
      ...
    

    我使用了来自您的 sn-p 的示例 JavaScript 代码作为参考。如 API 中所述,您可能需要等到 WebView 运行网站上的所有 JavaScript 代码,然后再运行您自己的代码,以确保所有内容都已加载并且您尝试查找的元素存在。为此,WebView 提供了一个 onPageFinished 回调:

    ...
    WebViewController _controller;
    ...
    
    WebView(
      initialUrl: 'https://stackoverflow.com',
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (controller) {
        _controller = controller;
      },
      onPageFinished: (url) {
        _controller.evaluateJavascript("document.getElementsByClassName('header')[0].style.display='none';");
      },
      ...
    

    【讨论】:

    • 插件示例使用 _controller,如我更新的问题中所示。我找不到 _controller.evaluateJavascript?知道为什么吗?
    • 我使用您的代码并更新我的问题。它没有找到 .evaluateJavascript 部分。
    • 我也在 AppBar 中从插件示例代码中复制了这个。动作:[ NavigationControls(_controller.future), ],
    【解决方案2】:
    I loaded google website and customizing the UI and it was working, but when i want to customize microsoft power apps in my webview of mobile it was not working, but when i tested in my mac chrome browser, i am able to customize in console by typing the javascript style commands. 
    
    The below code is working for customizing the mobile webView    
    
    return WebView(
              initialUrl: "https://www.google.com/",
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
                _myController = webViewController;
    
    
              // ignore: prefer_collection_literals
              javascriptChannels: <JavascriptChannel>[
                _toasterJavascriptChannel(context),
              ].toSet(),
              navigationDelegate: (NavigationRequest request) {
                if (request.url.startsWith('https://www.youtube.com/')) {
                  print('blocking navigation to $request}');
                  return NavigationDecision.prevent;
                }
                print('allowing navigation to $request');
                return NavigationDecision.navigate;
              },
              onPageFinished: (String url) {
                print('Page finished loading: $url');
    
    _myController.evaluateJavascript("document.getElementsByClassName(\"zGVn2e\")[0].style.display='none';");
              },
            );
          }),
        );
      }
    

    阅读下面的文章以获得完整的教程: https://medium.com/@yugandhar0189/flutter-ios-android-customize-the-ui-inside-the-webview-e72fbe51dd44

    【讨论】:

      【解决方案3】:

      提供 WebView 小部件的 Flutter 插件。

      在 iOS 上,WebView 小部件由 WKWebView 支持;在 Android 上,WebView 小部件由 WebView 支持。

      使用这个库 here you can use this lib

      【讨论】:

      • 我正在使用的那个插件
      • 我更新了我的代码 (Update-3:) 你知道如何让它在 _myController.evaluateJavascript 部分工作吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2021-06-25
      相关资源
      最近更新 更多