我需要处理本地文件与网页浏览器中的Java脚本.这个过程很繁琐,包括很多RegEx.exec()
个,需要一些时间才能完成,所以我把FileReader()
和处理程序都放在Web Worker中.最终产品在Google Chrome和Microsoft Edge上运行良好,但在macOS Safari上有问题.
在MacOS Safari 16.5.1中,当通过file:///path/to/localfile.html
直接从本地文件系统加载HTML文件时,此(简化的)Java代码无法工作:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script id="worker" type="javascript/worker">
self.onmessage = function(evt) {
var file = evt.data;
var filereader = new FileReaderSync();
console.log(filereader.readAsText(file,'UTF-8'));
};
</script>
<script type="text/javascript">
function on_change(evt) {
const workerblob = new Blob(
[document.querySelector('#worker').textContent],
{type:"text/javascript"});
new Worker(window.URL.createObjectURL(workerblob)).postMessage(evt.target.files[0]);
};
</script>
</head>
<body>
<input id="fileselector" type="file" onchange="on_change(event)">
</body>
</html>
Safari Java脚本控制台显示3条错误消息:
- 无法加载
blob:null/ff4c37bb-8ddb-4082-a492-425423e35ef9
. - 无法加载资源:Cross origin requests are not allowed when using same-origin fetch mode.
-
NotReadableError
:I/O读取操作失败.
所以这是某种CORS问题,但我不知道告诉浏览器"允许来源",因为要加载的资源是本地文件.
这附近有什么工作吗?
更多详细信息:
- 如果HTML由HTTP服务器托管并通过常规的HTTP/HTTPS请求加载,则它会按预期工作.
- Chrome和Edge都不会抱怨CORS问题,因为HTML文件是从本地文件系统加载的.
- Safari只会在Web Worker中调用
FileReader()
时才会抱怨CORS问题.
因为客户不想要另一台Web服务器,所以我应该把这个HTML文件作为最终产品交付.因此,我需要它在从本地文件系统加载时才能工作.
第Yes I've tried 100 and get the same result. In fact I'm using 100 in my final product and just want to simplify the post. It's a CORS related issue so both 100 and 103 shall work in the same way.页