如何在 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 插件。我尝试加载并隐藏页脚的网站是:
下面是我试图隐藏页脚的那个选项卡 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);
}
我是 Flutter 的新手,目前,我正在制作一个非常简单的应用程序,它只是一个 WebView。我的问题是如何将此代码插入我的 Flutter WebView?
footer#footer, div#st_notification_1, #sidebar_box {
display: none!important;
}
目前,我正在尝试在我的应用程序选项卡之一上使用 Flutter 团队的 WebView 插件。我尝试加载并隐藏页脚的网站是:
下面是我试图隐藏页脚的那个选项卡 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);
}