主窗口window.open一个新窗口,并用postMessage发送json数据给新窗口,但是新窗口加载太慢,导致postMessage发送到新窗口没有反应,如何保证新窗口加载完成后再postMessage
时间: 2024-12-21 08:31:01 浏览: 5
如果你发现新窗口加载速度较慢,导致postMessage发送后没有立即响应,可以考虑使用异步或者回调的方式来处理这个情况。一种常见的做法是在新窗口打开后,设置一个定时器或者Promise来延迟发送消息,直到新窗口已经装载完毕。以下是这种方法的一个示例:
```javascript
// 在主窗口
var newWindow = window.open('http://new-url.com');
// 使用Promise或者setTimeout
Promise.resolve(newWindow).then(() => {
return new Promise((resolve) => {
newWindow.addEventListener('load', function() {
resolve(); // 当新窗口加载完成时,调用resolve()
});
}).then(() => {
newWindow.postMessage(jsonData, '*');
});
}).catch((error) => {
console.error('Failed to open the new window:', error);
});
相关问题
前端发一个post给flaks 后端返回后打开一个新网页显示返回结果
前端通过 JavaScript 的 `fetch` 或 `axios` 等库向 Flask 后台发送 POST 请求,通常包含数据作为请求体。后端接收到请求后处理数据并返回响应,这个响应可以是一个 JSON 对象,包含需要展示的信息。
例如,前端代码示例:
```javascript
const url = 'http://your-flask-api.com/endpoint'; // 替换为实际Flask应用URL
const data = { key: 'value' }; // 发送的数据
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(dataFromServer => {
// 打开一个新的标签页或者窗口显示返回的结果
window.open('data:text/html;charset=utf-8,' + encodeURIComponent(`
<!DOCTYPE html>
<html><body>
<h1>返回结果</h1>
${dataFromServer.message || '服务器返回的内容'}
</body></html>
`));
})
.catch(error => console.error('Error:', error));
```
在这个例子中,后端收到 POST 请求后,返回的数据会被解析并用于动态生成一个新的 HTML 页面,然后在新的窗口中显示出来。
window.open 打开网页后怎么给网页赋值
`window.open()` 方法通常用于在新窗口或当前窗口的上下文中打开一个新的URL。如果想在打开新的页面之后向其内容区域赋值,比如设置某个元素的HTML或者JavaScript变量,由于浏览器安全策略,直接操作远程页面的内容是不可能的,因为这涉及到跨域问题。
然而,你可以通过一些间接的方式来影响目标页面:
1. **通过POST请求**:如果你有服务器端的支持,可以先发送一个POST请求到目标页面的地址,包含你需要设置的数据,然后在目标页面接收到请求后更新内容。
```javascript
fetch('https://target.com/data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: 'value' })
})
.then(response => response.text())
.then(data => document.getElementById('someElement').innerHTML = data);
```
2. **使用Web Workers**:如果允许的话,可以在新窗口中创建一个Web Worker,worker可以访问document对象并处理数据,但必须将数据序列化并传递给worker。
3. **利用postMessage API**:如果目标页面和当前页面同源,可以使用`postMessage`进行通信。父页面发送消息,目标页面接收并响应。
```javascript
// 父页面
let iframe = window.open();
iframe.contentWindow.postMessage({ key: 'value' }, '*');
// 目标页面
window.addEventListener('message', function(event) {
if (event.origin === 'http://your-source.com') {
document.getElementById('someElement').innerHTML = event.data.key;
}
});
```
请注意,以上方法都需要考虑兼容性和安全性,并遵守相关规定,例如同源策略等。在实际应用中,应尽量避免直接操作其他域名下的文档内容。
阅读全文