-
Notifications
You must be signed in to change notification settings - Fork 1
/
proxy.html
137 lines (126 loc) · 4.51 KB
/
proxy.html
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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Wed, 26 Feb 1997 08:21:57 GMT">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<style type="text/css">
html, body {
width: 100%;
height: 100%;
margin: 0;
}
</style>
<script type="text/javascript">
// 启用JS引入, 会有安全性问题, 慎重使用!
var ENABLED_JS_INCLUDE = false;
function appendIFrame(iframe) {
document.body.innerHTML = iframe;
return document.querySelector('iframe');
}
function appendElement(doc, tag, options) {
var element = doc.createElement(tag);
Object.keys(options).forEach(function(key) {
element[key] = options[key];
});
doc.body.appendChild(element);
}
// 包含css脚本
function includeStyle(style, iframeWindow) {
appendElement(iframeWindow.document, 'style', {
type: 'text/css',
innerText: style.replace(/\s/g, '')
});
}
// 包含js脚本
function includeScript(script, iframeWindow) {
appendElement(iframeWindow.document, 'script', {
type: 'text/javascript',
innerText: script.replace(/\s/g, '')
});
}
// 导入css文件
function importStyle(href, iframeWindow) {
if (!href) return;
appendElement(iframeWindow.document, 'link', {
rel: 'stylesheet',
href: href.replace(/\s/g, '')
});
}
// 导入js文件
function importScript(src, iframeWindow) {
if (!src) return;
appendElement(iframeWindow.document, 'script', {
type: 'text/javascript',
src: src.replace(/\s/g, '')
});
}
// 添加到目标iframe
function appendToIframe(options) {
var iframeTag = options.iframe;
var styleText = options.includeStyle;
var scriptText = options.includeScript;
var styleURL = options.importStyle;
var scriptURL = options.importScript;
try {
var iframe = appendIFrame(iframeTag);
// iframe.onload = function() {
var contentWindow = iframe.contentWindow;
contentWindow.addEventListener('DOMContentLoaded', function(event) { // DOMContentLoaded 更快响应
styleText && includeStyle(styleText, contentWindow);
styleURL && importStyle(styleURL, contentWindow);
if (ENABLED_JS_INCLUDE) {
// 包含 js 脚本
scriptText && includeScript(scriptText, contentWindow);
// 导入 js 文件
scriptURL && importScript(scriptURL, contentWindow);
}
});
} catch(e) {
console.error(e);
}
}
function init(window) {
var originREG = /origin=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
var iframeNameREG = /iframe=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
var url = window.location.search;
var originMatch = url.match(originREG);
var iframeMatch = url.match(iframeNameREG);
if (iframeMatch) {
var includeStyleREG = /include[Ss]tyle=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
var includeScriptREG = /include[Ss]cript=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
var importStyleREG = /import[Ss]tyle=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
var importScriptREG = /import[Ss]cript=([\:\/\!\(\)\-\*_\~\.\w\%]+)/;
// window.onload = function() {
window.addEventListener('DOMContentLoaded', function(event) { // DOMContentLoaded 更快响应
var includeStyleMatch = url.match(includeStyleREG);
var includeScriptMatch = url.match(includeScriptREG);
var importStyleMatch = url.match(importStyleREG);
var importScriptMatch = url.match(importScriptREG);
appendToIframe({
iframe: iframeMatch && decodeURIComponent(iframeMatch[1]),
includeStyle: includeStyleMatch && decodeURIComponent(includeStyleMatch[1]),
includeScript: includeScriptMatch && decodeURIComponent(includeScriptMatch[1]),
importStyle: importStyleMatch && decodeURIComponent(importStyleMatch[1]),
importScript: importScriptMatch && decodeURIComponent(importScriptMatch[1])
});
});
} else if (originMatch) {
window.onmessage = function(event) {
// 确定来源, 可能接收到其他域的信息.
if (event.origin !== originMatch[1]) {
return;
}
var options = JSON.parse(event.data);
appendToIframe(options);
}
}
}
init(window);
</script>
</head>
<body>
</body>
</html>