如何在 Flutter WebView 中注入一段简单的代码来隐藏网站的一部分(页脚)?

How to inject a simple code in Flutter WebView to hide a part of the website (footer)?

我是 Flutter 的新手,目前,我正在制作一个非常简单的应用程序,它只是一个 WebView。我的问题是如何将此代码插入我的 Flutter WebView?

footer#footer, div#st_notification_1, #sidebar_box {
    display: none!important;
}

目前,我正在尝试在我的应用程序选项卡之一上使用 Flutter 团队的 WebView 插件。我尝试加载并隐藏页脚的网站是:

Syncshop

下面是我试图隐藏页脚的那个选项卡 Webview 的代码

更新:已修复。下面的代码对我有用 注:我也重新检查了网站,将上面网站页脚的class名称对应的getElementsById改为getElementsByClassName

注2:Flutter包中有很多WebView应用,我使用的是Flutter团队的Flutter Webview。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

class ProfileAccount extends StatefulWidget {
  ProfileAccount({Key key}) : super(key: key);

  @override
  _ProfileAccountState createState() => _ProfileAccountState();
}

class _ProfileAccountState extends State<ProfileAccount> {
    WebViewController _myController;
    final Completer<WebViewController> _controller =
     Completer<WebViewController>();
  @override
  Widget build(BuildContext context) {
    return SafeArea(
          child: Scaffold(
            body: WebView(
              initialUrl: 'https://syncshop.online/en/login',
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (controller) {
                _myController = controller;
              },
          onPageFinished: (initialUrl) {
            _myController.evaluateJavascript("document.getElementsByClassName('footer-container')[0].style.display='none';");
          },
        )
      ),
    );
  }
}

你可以试试

flutterWebviewPlugin.evalJavascript('alert("Hello World")')

记住 evalJavascript() 需要 JS 而不是 HTML,所以你不能使用 like

flutterWebviewPlugin.evalJavascript('<script language="JavaScript" type="text/javascript">alert("Hello World")</script>')

这里是完整的例子供您参考,

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

class JSInWebView extends StatefulWidget {
  @override
  JSInWebViewState createState() {
    return new JSInWebViewState();
  }
}

class JSInWebViewState extends State<JSInWebView> {
  final flutterWebviewPlugin = new FlutterWebviewPlugin();
  // alternatively you can define variable as var js = "YOUR_SCRIPT"; and use it inside evalJavascript

  @override
  void initState(){
    super.initState();
    flutterWebviewPlugin.evalJavascript("alert('Hi, I just executed')");
  }

  @override
  void dispose() {
    flutterWebviewPlugin.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return WebviewScaffold(
      url: 'https://google.com',
      hidden: true,
      appBar: AppBar(title: Text("Elite")),
    );
  }
}

感谢您在这里的回答。我将它们与 this javascript answer 结合起来,创建了一个函数,可以轻松注入完整的 css 文件。如果您有大量覆盖或者您想在单独的文件中随时间跟踪它们,这会很方便。

在您的网络视图中:

onPageFinished: (finish) async {
    // Override CSS values
    String overrideJs = await jsInjectionString(context, 'assets/my_css_override.css');
    _webController.evaluateJavascript(overrideJs);    
 },

别处:

  // Build the javascript injection string to override css
  Future<String> jsInjectionString(BuildContext context, String asset) async {
    String cssOverride = await loadStringAsset(context, asset);
    return "const cssOverrideStyle = document.createElement('style');"
        "cssOverrideStyle.textContent = `$cssOverride`;"
        "document.head.append(cssOverrideStyle);";
  }

  // Load a string asset
  Future<String> loadStringAsset(BuildContext context, String asset) async {
    return await DefaultAssetBundle.of(context).loadString(asset);
  }