网站首页 > 教程分享 正文
首先,说明一下window.name这个属性,我们要用这个属性来保存从服务器返回的数据。
- window.name的值在同一浏览器窗口加载不同的页面后依然存在。(比如在同一浏览器窗口下,先访问页面a.html,将window.name设定为”Hello World”,然后再访问b.html,window.name仍然是”Hello World”。)
- window.name最多可以支持2MB的值。
接下来结合代码来说明这个解决方案。为了实现跨域访问,当然要找到两个不同的域,最简单的,用http://localhost/和http://127.0.0.1/就可以了。新建一个client.html并假定其在http://localhost/这个域下面,用来向http://127.0.0.1/域下的页面server.html发送异步请求。下面是发送请求的代码:
以下是代码片段:
var iframe1 = document.createElement("iframe");
iframe1.src = "http://127.0.0.1/server.html";
(function() {
// 当iframe加载完之后触发的函数
function iframe1_load() {
}
// 在IE下要用attachEvent来添加iframe的onload事件
if(iframe1.attachEvent) {
iframe1.attachEvent("onload", function(){
iframe1_load();
});
}
else {
iframe1.onload = iframe1_load;
}
})();
document.body.appendChild(iframe1);
注意这里的iframe1_load函数,它在iframe1完全加载完之后被浏览器调用,我们在这里取回从服务器返回的数据。上面说过,从服务器返回的数据应该是保存在window.name里的,改写一下iframe1_load:
以下是代码片段:
function iframe1_load() {
alert(iframe1.contentWindow.name);
}
但由于同源策略的原因,上面的语句会报错,因为iframe1访问的页面在http://127.0.0.1/这个域,而这上面的JavaScript所在的页面是在http://localhost/,所以client.html暂时还不能访问iframe1的大部分属性。这个时候聪明的同学就能想到,如果把iframe1导航到http://localhost/下面的页面不就可以访问window.name了吗?而且上面也说过window.name在换了页面之后,还是存在的。
根据上面的分析,在http://localhost/下建一个新的页面empty.html(不用往里添加代码,只要保证不404就好。),在iframe1_load函数中先把iframe1导航到http://localhost/empty.html,然后再从iframe1的window.name里取数据。注意,iframe1导航到新页面之后浏览器会再次调用iframe1_load,从而造成死循环,所以还要加个标记。
以下是代码片段:
var iframe1 = document.createElement("iframe");
iframe1.style.display = "none";
document.body.appendChild(iframe1);
(function () {
var same_domain = false;
// 当iframe加载完之后触发的函数
function iframe1_load() {
if (same_domain) {
// 取得从服务器返回的数据
alert(iframe1.contentWindow.name);
// 关闭iframe1的窗口
iframe1.contentWindow.close();
// 移除iframe1
document.body.removeChild(iframe1);
} else {
same_domain = true;
// 不能用iframe1.src = "empty.html",在IE下有错误
iframe1.contentWindow.location = "empty.html";
}
}
// 在IE下要用attachEvent来添加iframe的onload处理函数
if (iframe1.attachEvent) {
iframe1.attachEvent("onload", function () {
iframe1_load();
});
}
else {
iframe1.onload = iframe1_load;
}
})();
iframe1.src =
http://127.0.0.1/server.html
;
server.html的代码
以下是代码片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Server</title>
<script type="text/javascript">
window.name = "HELLO WORLD";
</script>
</head>
<body>
</body>
</html>
猜你喜欢
- 2024-10-10 快速了解JavaScript富文本编辑(javascript富文本编辑器)
- 2024-10-10 PHP面试题—第四回(php面试常见问题)
- 2024-10-10 页面嵌套iframe局部赋值(iframe嵌套页面vue)
- 2024-10-10 再不用怕Markdown中的绘图,GitHub官方支持Mermaid图表绘制工具
- 2024-10-10 「网络安全」常见攻击篇(20)——点击劫持
- 2024-10-10 iframe之间的消息通信(iframe页面通信)
- 2024-10-10 JavaScript 对象 实例(javascript对象的常用方法)
- 2024-10-10 Chrome 现已支持延迟加载网页中的 iframe,速度翻倍提升
- 2024-10-10 Python+selenium自动化测试之iframe嵌套定位
- 2024-10-10 前端开发必读!7个HTML属性助你提升用户体验
你 发表评论:
欢迎- 最近发表
-
- 免费10年VPS-serv00服务器,注册与自动化保号
- Consul微服务注册中心使用指南
- 谷歌云代理商:注册谷歌云服务器需要准备哪些资料?
- steam账号注册不了/注册失败?好用的解决方法看这里
- 微服务架构中的服务注册与发现有哪些?Zookeeper、Eu
- # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)
- 一文深入理解AP架构Nacos注册原理
- 群晖NAS本地搭建NVIDIA v-GPU License Server 授权许可服务器的教程
- IDEA 2024解决We could not validate your license XX
- 保障数据完整性:深入解析Oracle数据库的主键和外键约束
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)