gpt4 book ai didi

javascript - 为什么我可以在第一次尝试时从 iframe 写入 sessionStorage,但不能连续尝试? (Chrome 版本 74)

转载 作者:行者123 更新时间:2023-11-27 22:55:55 24 4
gpt4 key购买 nike

此问题已出现在最新版本的 Chrome (74.0.3729.108) 中。这是本地文件系统所独有的,因为当应用程序位于服务器上时,我有其他方法可以在 iframe 中加载相邻文档。

在我的应用程序中,我们已经能够通过将 iframe 写入 DOM,使用 JavaScript 从文件系统加载文档,然后让 iframe 中的文档将其 innerHTML 写入 sessionStorage 。 iframe 完成加载后,我们使用 iframe 上的 onload 属性捕获它,并处理将项目写入 sessionStorage

我已将其缩小到一些基本代码,发现这仅在第一次尝试时有效,然后在第一次失败后进行任何尝试。

这是一个最小的 HTML 文档:

<!DOCTYPE html>
<html>
<head>
<title>Chrome iFrame Tester</title>
<script src="iframe-load.js"></script>
</head>
<body onload="OnLoad()">
<div id="result"></div>
</body>
</html>

这是 JavaScript:

var urls = ['file://C:/Users/afrench/Documents/Other/Misc%20Code/Chrome%20iFrame/Doc1.html', 
'file://C:/Users/afrench/Documents/Other/Misc%20Code/Chrome%20iFrame/Doc2.html'];

HandleLoad = function () {
'use strict';

var data;

try {
data = window.sessionStorage['data'];
delete window.sessionStorage['data'];
} catch (ignore) {
// something went wrong
}

var container = document.getElementById('container');
window.document.body.removeChild(container);

if (data !== null && data !== undefined) {
var resultContainer = document.getElementById('result');
resultContainer.innerHTML += data;
}

if (urls.length > 0) {
OnLoad();
}
}

function OnLoad() {
var url = urls[0];

if (url) {
urls.splice(0, 1);

var container = document.createElement('div');
container.id = 'container';
container.style.visibility = 'hidden';
window.document.body.appendChild(container);
container.innerHTML = '<iframe src="' + url + '" onload="HandleLoad();"></iframe>';
}
}

在文件系统中,我们将 HTML 写入 index.html,紧挨着它的是两个最小的 HTML 文件,Doc1.htmlDoc2 .html。除了 body 的 div 中的标识语句外,它们的内容都是相同的:

相邻文档 HTML:

<!DOCTYPE html>
<html>
<head>
<title>Chrome iFrame Tester</title>
<script>
function OnLoad() {
try {
window.sessionStorage['data'] = window.document.body.innerHTML;
} catch {
// no luck
}
}
</script>
</head>
<body onload="OnLoad()">
<div>This is Doc 1's content!</div>
</body>
</html>

运行时,我们应该看到两个相邻文档的内容 HTML 写入了 index.html 中的 result div。

当我运行这个最小示例时,我可以看到内容已成功写入 sessionStorage,然后写入第一个文档的 DOM,但下一次尝试失败。我该怎么做才能让它始终如一地工作,以及它失败的原因是什么?

最佳答案

我不确定是什么导致了奇怪的行为,所以希望其他人可以提供一些关于这里到底发生了什么的见解。

与此同时,这是使用 window.postMessage 的替代解决方案:

index.html

<!DOCTYPE html>
<html>
<head>
<title>Chrome iFrame Tester</title>
<script src="iframe-load.js"></script>
</head>
<body onload="OnLoad()">
<div id="result"></div>
</body>
</html>

iframe-load.js

var urls = ['file://C:/Users/afrench/Documents/Other/Misc%20Code/Chrome%20iFrame/Doc1.html', 
'file://C:/Users/afrench/Documents/Other/Misc%20Code/Chrome%20iFrame/Doc2.html'];

window.addEventListener('message', event => {
'use strict';

var data = event.data;

var container = document.getElementById('container');
window.document.body.removeChild(container);

if (data) {
var resultContainer = document.getElementById('result');
resultContainer.innerHTML += data;
}

if (urls.length > 0) {
OnLoad();
}
})

function OnLoad() {
var url = urls.shift();

if (url) {
var container = document.createElement('div');
container.id = 'container';
container.style.visibility = 'hidden';
window.document.body.appendChild(container);
container.innerHTML = '<iframe src="' + url + '"></iframe>';
}
}

文档1.html

<!DOCTYPE html>
<html>
<head>
<title>Chrome iFrame Tester</title>
<script>
function OnLoad() {
window.parent.postMessage(window.document.body.innerHTML, '*');
}
</script>
</head>
<body onload="OnLoad()">
<div>This is Doc 1's content!</div>
</body>
</html>

关于javascript - 为什么我可以在第一次尝试时从 iframe 写入 sessionStorage,但不能连续尝试? (Chrome 版本 74),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com