网页 手机端 初版

This commit is contained in:
WoNiu 2024-03-31 20:15:43 +08:00
parent cef3227375
commit 87b3157e14
5 changed files with 157 additions and 31 deletions

View File

@ -1,20 +1,102 @@
class JavaScriptString { class JavaScriptString {
/// ///
static String clickEventkJSString = static String clickEventJSString =
'''document.addEventListener('click', function(event) { '''document.addEventListener('click', function(event) {
var x = event.clientX; var x = event.clientX;
var y = event.clientY; var y = event.clientY;
console.log('点击坐标x=' + x + ', y=' + y); console.log('点击坐标x=' + x + ', y=' + y);
window.flutter_inappwebview.callHandler('Click', x, y); window.flutter_inappwebview.callHandler('click', x, y);
});'''; });''';
///
static String touchendEventJSString =
'''document.addEventListener('touchend', function(event) {
var x = event.changedTouches[0].clientX;
var y = event.changedTouches[0].clientY;
//
var target = event.target;
// class和id
var targetClass = target.className;
var targetId = target.id;
console.log('Class: ' + targetClass);
console.log('Id: ' + targetId);
console.log('触摸坐标x=' + x + ', y=' + y);
window.flutter_inappwebview.callHandler('touchend', x, y);
});''';
/// 退
static String loginOutJsString = '''
\$.ajax({
type: "GET",
url: "/api/logout.do",
success: function(t) {
"index.html" != location.pathname ? window.location.href = "index.html" : location.reload()
},
error: function(t) {
var e = \$.parseJSON(t.responseText + "");
alert(e.msg, 2)
}
})
''';
/// ///
static String clickJSString(int x, int y) { static String clickJSString(int x, int y) {
return 'document.elementFromPoint($x, $y).click();'; return 'document.elementFromPoint($x, $y).click();';
} }
///
static String touchendJsString(int x, int y) {
return '''
''';
}
///
static String getClassTouchendJsString(int x, int y) {
return '''
try{
//
var x = $x;
var y = $y;
// touchstart事件
var touchstartEvent = new TouchEvent('touchstart', {
bubbles: true,
cancelable: true,
view: window,
changedTouches: [new Touch({ identifier: Date.now(), target: document.body, clientX: x, clientY: y })],
targetTouches: [new Touch({ identifier: Date.now(), target: document.body, clientX: x, clientY: y })]
});
// touchstartEvent
document.body.dispatchEvent(touchstartEvent);
// touchend事件
var touchendEvent = new TouchEvent('touchend', {
bubbles: true,
cancelable: true,
view: window,
changedTouches: [new Touch({ identifier: Date.now(), target: document.body, clientX: x, clientY: y })],
targetTouches: [new Touch({ identifier: Date.now(), target: document.body, clientX: x, clientY: y })]
});
// touchend事件
document.body.dispatchEvent(touchendEvent);
} catch (t) {
console.log('模拟触摸错误 -- ' + t);
}
''';
}
/// ///
static String inputJsString(int value) { static String inputJsString(int value) {
return ''' return '''
@ -24,7 +106,7 @@ var inputEvent = new Event('input', {
cancelable: true, cancelable: true,
}); });
var inputElement = document.querySelector(".bet-money"); var inputElement = document.querySelector(".input");
inputElement.value = "$value"; inputElement.value = "$value";

View File

@ -1,8 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:web_synchronization_tool/main_page.dart'; import 'package:web_synchronization_tool/main_page.dart';
import 'package:web_synchronization_tool/windows/windows_main_page.dart'; import 'package:web_synchronization_tool/windows/windows_main_page.dart';
void main() { void main() async {
// await InAppWebViewController.setWebContentsDebuggingEnabled(true);
runApp(const MyApp()); runApp(const MyApp());
} }

View File

@ -1,3 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:web_synchronization_tool/web_widget.dart'; import 'package:web_synchronization_tool/web_widget.dart';
@ -16,22 +17,35 @@ class _MainPageState extends State<MainPage> {
late InAppWebViewController mainController; late InAppWebViewController mainController;
late InAppWebViewController controller; late InAppWebViewController controller;
bool asyncState = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
} }
/// @override
addClickEventJS(){ void dispose() {
super.dispose();
final clickJsUS = UserScript(groupName: 'click',source: JavaScriptString.clickEventkJSString, injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START); WebStorageManager.instance().deleteAllData();
}
///
addTouchendEventJS(){
final clickJsUS = UserScript(groupName: 'touchend',source: JavaScriptString.touchendEventJSString, injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START);
mainController.addUserScript(userScript: clickJsUS); mainController.addUserScript(userScript: clickJsUS);
mainController.addJavaScriptHandler(handlerName: 'Click', callback: (args){ mainController.addJavaScriptHandler(handlerName: 'touchend', callback: (args){
controller.evaluateJavascript(source: JavaScriptString.clickJSString(args.first, args.last) ); if (asyncState){
int x = double.parse(args.first.toString()).toInt();
int y = double.parse(args.last.toString()).toInt();
controller.evaluateJavascript(source: JavaScriptString.clickJSString(x, y) );
// controller.evaluateJavascript(source: JavaScriptString.touchendJsString(x, y) );
// controller.evaluateJavascript(source: JavaScriptString.getClassTouchendJsString(x, y) );
}
}); });
} }
@ -40,6 +54,7 @@ class _MainPageState extends State<MainPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: Column( body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Container( Container(
height: 50, height: 50,
@ -49,7 +64,7 @@ class _MainPageState extends State<MainPage> {
children: [ children: [
TextButton( TextButton(
onPressed: () { onPressed: () {
controller.evaluateJavascript(source: JavaScriptString.clickJSString(600, 280) ); controller.evaluateJavascript(source: JavaScriptString.clickJSString(50, 100) );
}, },
child: const Text('模拟点击测试')), child: const Text('模拟点击测试')),
TextButton( TextButton(
@ -58,12 +73,15 @@ class _MainPageState extends State<MainPage> {
controller.evaluateJavascript(source: JavaScriptString.inputJsString(45) ); controller.evaluateJavascript(source: JavaScriptString.inputJsString(45) );
}, },
child: const Text('模拟输入测试')), child: const Text('模拟输入测试')),
const SizedBox( Row(
width: 50, children: [
child: TextField( const Text('同步'),
keyboardType: TextInputType.number, Switch(value: asyncState, onChanged: (value){
decoration: InputDecoration(prefixText: '网页数量'), setState(() {
), asyncState = value;
});
})
],
) )
], ],
), ),
@ -75,19 +93,30 @@ class _MainPageState extends State<MainPage> {
} }
Widget pageViewWidget() { Widget pageViewWidget() {
return PageView( return Row(
children: <Widget>[ children: <Widget>[
KeepAlivePage( Expanded(
child: WebWidget(controlerCallBack: (_mainController) { child: Container(
mainController = _mainController; color: Colors.yellow,
child: KeepAlivePage(
addClickEventJS(); child: WebWidget(controlerCallBack: (_mainController) {
}), mainController = _mainController;
addTouchendEventJS();
}),
),
),
), ),
KeepAlivePage( Expanded(
child: WebWidget(controlerCallBack: (_controller) { child: Container(
controller = _controller; color: Colors.blue,
}), child: KeepAlivePage(
child: WebWidget(controlerCallBack: (_controller) {
controller = _controller;
}),
),
),
) )
], ],
); );

View File

@ -21,8 +21,19 @@ class _WebWidgetState extends State<WebWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InAppWebView( return InAppWebView(
initialUrlRequest: initialUrlRequest:
URLRequest(url: WebUri('http://www.df6831.com/game/')), URLRequest(url: WebUri('http://www.df6831.com')),
initialSettings: InAppWebViewSettings(initialScale: 200,loadWithOverviewMode: false,useWideViewPort: false), initialSettings: InAppWebViewSettings(
initialScale: 180,
loadWithOverviewMode: false,
useWideViewPort: false,
preferredContentMode: UserPreferredContentMode.MOBILE,
cacheEnabled: false, //
clearSessionCache: true,//
databaseEnabled:false, //
domStorageEnabled: false,// dom
incognito: true, //
sharedCookiesEnabled: false, // Cookie
),
onWebViewCreated: (_controller) { onWebViewCreated: (_controller) {
widget.controlerCallBack(_controller); widget.controlerCallBack(_controller);
}, },

View File

@ -52,7 +52,7 @@ class _WindowsPageState extends State<WindowsPage> {
}); });
mainController.addScriptToExecuteOnDocumentCreated( mainController.addScriptToExecuteOnDocumentCreated(
JavaScriptString.clickEventkJSString).then((value){ JavaScriptString.clickEventJSString).then((value){
print(value); print(value);
}); });