利用iframe和location.hash实现跨域

利用iframe和location.hash实现跨域原理是利用location.hash来进行传值。在url:http://a.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传递信息,cs1.html首先创建自动创建一个隐藏

大家好,又见面了,我是你们的朋友全栈君。       原理是利用location.hash来进行传值。在url: http://a.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传递信息,cs1.html首先创建自动创建一个隐藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html页面,这时的hash值可以做参数传递用。cs2.html响应请求后再将通过修改cs1.html的hash值来传递数据(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于a.com域名下的一个代理iframe;Firefox可以修改)。同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一点有变化则获取获取hash值。代码如下:

先是a.com下的文件cs1.html文件:

function startRequest(){
    var ifr = document.createElement('iframe');
    ifr.style.display = 'none';
    ifr.src = 'http://www.cnblogs.com/lab/cscript/cs2.html#paramdo';
    document.body.appendChild(ifr);
}


function checkHash() {
    try {
        var data = location.hash ? location.hash.substring(1) : '';
        if (console.log) {
            console.log('Now the data is '+data);
        }
    } catch(e) {};
}
setInterval(checkHash, 2000);

cnblogs.com域名下的cs2.html:

//模拟一个简单的参数处理操作
switch(location.hash){
    case '#paramdo':
        callBack();
        break;
    case '#paramset':
        //do something……
        break;
} /


function callBack(){
    try {
        parent.location.hash = 'somedata';
    } catch (e) {
        // ie、chrome的安全机制无法修改parent.location.hash,
        // 所以要利用一个中间的cnblogs域下的代理iframe
        var ifrproxy = document.createElement('iframe');
        ifrproxy.style.display = 'none';
        ifrproxy.src = 'http://a.com/test/cscript/cs3.html#somedata';    // 注意该文件在"a.com"域下
        document.body.appendChild(ifrproxy);
    }
}

a.com下的域名cs3.html

//因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
parent.parent.location.hash = self.location.hash.substring(1);

当然这样做也存在很多缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等……

原帖地址:JavaScript跨域总结与解决办法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++入门教程–-12作用域

    c++入门教程–-12作用域

    2021年3月12日
    194
  • pycharm的虚拟环境

    pycharm的虚拟环境选中file==》closeproject退出项目进入下方的情况现在我们在桌面新创建一个文件test.py可以看到可以执行test.py右键选中test.py,选择pycharm的方式打开test.py,会发现无法调试,出现NoPythonInterpreter的错误,为什么命令行可以执行test.py,pycharm执行test.py文件就不可以了呢?这是为什么呢?我们新建一个项目来查看原因第一个location为你项目的路径,可以点击右边的文件夹进行选择。第二个locatio.

    2022年8月25日
    7
  • Python保留小数又不想四舍五入咋办?

    Python保留小数又不想四舍五入咋办?保留小数又不想四舍五入咋办?找了一会不知道用什么函数实现,突然想到可以这样…a=25.35568a=a-a%0.01print(a)

    2022年8月11日
    7
  • mt4平台交易系统下载_mt4软件下载工具

    mt4平台交易系统下载_mt4软件下载工具我们在使用ea回测的时候,如果使用自带的数据回测,因为数据质量问题,无法回测出ea的实际盈亏能力。这时就需要一个高质量的数据来回测,而自带的数据往往不能满足这一点我今天要介绍的是一款tickstory的数据下载。以英镑美元为例:1、选中你要下载的货币对,右键,选择导出mt4中。2、选择导出的时间范围,最高可以10年。3、选择时间周期,按照默认的就行。4、选择…

    2022年8月15日
    7
  • 常见邮件发送失败原因分析以及解决方法是_手机邮箱发送失败

    常见邮件发送失败原因分析以及解决方法是_手机邮箱发送失败一.发到sina.com的邮件会被退回二.发到tom.com的邮件会被退回三.发到aol.com的邮件会被退回五.收到退信错误提示为”5545.7.1Rejectedxxx.xxx.xxx.xxxfoundindnsbl.sorbs.net”,怎么办?六。为什么直接发新邮件到hotmail.com不成功,而回复hotmail.com的邮件可以成功?七.发给Yahoo的邮件出现"553Mailfrom61.185.81.172notallowed-VS99-I.

    2022年10月7日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号