WKWebView+JavaScript.m
6.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//
// WKWebView+JavaScript.m
// CNLiveScioLive
//
// Created by CNLive-zxw on 2020/7/6.
// Copyright © 2020 CNLive. All rights reserved.
//
#import "WKWebView+JavaScript.h"
#import "UIColor+Change.h"
#define HTML_STRING_NIL_TO_NONE_IF(x) [WKWebView STRING_NIL_TO_NONE:x]
@implementation WKWebView (JavaScript)
+ (NSString *)STRING_NIL_TO_NONE:(NSString *)x {
if (x == nil || ([x isKindOfClass:[NSNull class]]) || ([x isKindOfClass:[NSString class]]&&x.length<=0) || [x isEqual:NULL]){
return @"";
} else {
return [NSString stringWithFormat:@"%@",x];
}
}
/// 获取某个标签的结点个数
- (int)nodeCountOfTag:(NSString *)tag {
__block int len = 0;
[self evaluateJavaScript:@"document.getElementsByTagName('%@').length" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
len = [response intValue];
}];
return len;
// NSString *jsString = [NSString stringWithFormat:@"document.getElementsByTagName('%@').length", tag];
//
// int len = [[self evaluateJavaScript:jsString completionHandler:nil] intValue];
// return len;
}
/// 获取当前页面URL
- (NSString *)getCurrentURL {
// return HTML_STRING_NIL_TO_NONE_IF([self evaluateJavaScript:@"document.location.href" completionHandler:nil]);
__block NSString *result = @"";
[self evaluateJavaScript:@"document.location.href" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
result = HTML_STRING_NIL_TO_NONE_IF(response);
}];
return result;
}
/// 获取标题
- (NSString *)getTitle {
__block NSString *result = @"";
[self evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
result = HTML_STRING_NIL_TO_NONE_IF(response);
}];
return result;
// return HTML_STRING_NIL_TO_NONE_IF([self evaluateJavaScript:@"document.title" completionHandler:nil]);
}
/// 获取文章内容
- (NSString *)getContent{
__block NSString *result = @"";
[self evaluateJavaScript:@"document.documentElement.innerText" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
// if (!result) {
// result = [self evaluateJavaScript:@"document.body.innerText" completionHandler:nil];
// }
result = HTML_STRING_NIL_TO_NONE_IF(result);
}];
return result;
// NSString *result = [self evaluateJavaScript:@"document.documentElement.innerText" completionHandler:nil];
// if (!result) {
// result = [self evaluateJavaScript:@"document.body.innerText" completionHandler:nil];
// }
// result = HTML_STRING_NIL_TO_NONE_IF(result);
// return result;
}
/// 获取所有图片链接
- (NSMutableArray *)getImgs {
__block NSMutableArray *arrImgURL = [[NSMutableArray alloc] init];
int node = [self nodeCountOfTag:@"img"];
for (int i = 0; i < node; i++) {
NSString *jsString = [NSString stringWithFormat:@"document.getElementsByTagName('img')[%d].src", i];
// NSString *img = [self evaluateJavaScript:jsString completionHandler:nil];
[self evaluateJavaScript:jsString completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
[arrImgURL addObject:response];
}];
// [arrImgURL addObject:img];
}
return arrImgURL;
}
/// 获取当前页面所有点击链接
- (NSArray *)getOnClicks {
__block NSMutableArray *arrOnClicks = [[NSMutableArray alloc] init];
int node = [self nodeCountOfTag:@"a"];
for (int i = 0; i < node; i++) {
NSString *jsString = [NSString stringWithFormat:@"document.getElementsByTagName('a')[%d].getAttribute('onclick')", i];
// NSString *clickString = [self evaluateJavaScript:jsString completionHandler:nil];
[self evaluateJavaScript:jsString completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSLog(@"value: %@ error: %@", response, error);
[arrOnClicks addObject:response];
}];
// [arrOnClicks addObject:clickString];
}
return arrOnClicks;
}
/// 改变背景颜色
- (void)setBackgroundColor:(UIColor *)color {
NSString * jsString = [NSString stringWithFormat:@"document.body.style.backgroundColor = '%@'",[color webColorString]];
[self evaluateJavaScript:jsString completionHandler:nil];
}
/// 为所有图片添加点击事件(网页中有些图片添加无效)
- (void)addClickEventOnImg {
int node = [self nodeCountOfTag:@"img"];
for (int i = 0; i < node; i++) {
//利用重定向获取img.src,为区分,给url添加'img:'前缀
NSString *jsString = [NSString stringWithFormat:
@"document.getElementsByTagName('img')[%d].onclick = \
function() { document.location.href = 'img:' + this.src; }",i];
[self evaluateJavaScript:jsString completionHandler:nil];
}
}
/// 改变指定标签的字体颜色
- (void)setFontColor:(UIColor *)color withTag:(NSString *)tagName {
NSString *jsString = [NSString stringWithFormat:
@"var nodes = document.getElementsByTagName('%@'); \
for(var i=0;i<nodes.length;i++){\
nodes[i].style.color = '%@';}", tagName, [color webColorString]];
[self evaluateJavaScript:jsString completionHandler:nil];
}
/// 改变指定标签的字体大小
- (void)setFontSize:(int)size withTag:(NSString *)tagName {
NSString *jsString = [NSString stringWithFormat:
@"var nodes = document.getElementsByTagName('%@'); \
for(var i=0;i<nodes.length;i++){\
nodes[i].style.fontSize = '%dpx';}", tagName, size];
[self evaluateJavaScript:jsString completionHandler:nil];
}
/// 设置网页没有拷贝粘贴
- (void)disableTouchCallout {
[self evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:nil];
[self evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil];
}
@end