array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 iframe跨域position fixed失效超简单解决方案 - 爱码网

如果有朋友使用跨域iframe的时候遇到了这个问题,那么欢迎你试一下这个办法,我再全网都没搜到非常完善的解决方案,有个兄弟的帖子帮了我很大的忙,但是我解决了问题的时候却找不到他的帖子了,实在抱歉

首先声明一下场景

  1. 一个html页面,作为父页面,拥有iframe标签,iframe的src地址为【2】
  2. 一个html页面,作为子页面
  3. 两个html页面位于不同域下
  • 页面1(父页面)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面1(父页面)</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body style="">

    <iframe id="child" src="http://127.0.0.1:9527/2" width="100%" height="1100px"></iframe>

</body>
<script>
</script>
</html>
  • 页面2
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面2(子页面)</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body style="height: 1000px;">
    <div class="fixed" style="position:fixed;top: 50px; right: 50px">
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
    </div>
    <div style="height: 1000px;background-color: #62a8ea">
    </div>
</body>
<script>
</script>
</html>

页面内容很简单,我后端用的是java,主页面的访问路径我在后端设置为http://localhost:9527/1, 子页面设置为http://localhost:9527/2,所以iframe的src属性设置为了http://localhost:9527/1

访问主页面会是这个样子
iframe跨域position fixed失效超简单解决方案
但是,当鼠标向下滚动的时候就会发现漂浮的div并不是固定在顶端的

如果直接访问子页面,会发现漂浮是一直在顶部的
iframe跨域position fixed失效超简单解决方案

鼠标向下滚动的时候,就会发现,子页面的position定位并没有根据父页面的滚动而定位

这个时候有一个解决办法就是设置合适高度
设置父页面的iframe的高度为500px,这个时候iframe出现滚动条,之所以上面的不好使是因为上面的那个截图的滚动条是父页面的,这个滚动条是子页面的滚动条

iframe跨域position fixed失效超简单解决方案
iframe跨域position fixed失效超简单解决方案
这个时候滚动滚动条,发现fixed是可以的,这回知道为什么了吧。但是这种方式并不是很完善,毕竟出现了滚动条,在某些业务下并不一定合适。下面还有一种方式,是通过监听父页面的鼠标滚动事件,获取父页面的当前高度,传给子页面,然后子页面进行重新css定位,来达到悬浮的效果。下面是代码
父页面还是原来的代码,并没有改变,监听与设置css都在子页面中进行就ok了

  • 子页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面2(子页面)</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body style="height: 1000px;">
    <div class="fixed" style="position:fixed;top: 50px; right: 50px">
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
    </div>
    <div style="height: 1000px;background-color: #62a8ea">
    </div>
</body>
<script>
    $(parent.window).scroll(function(){
        console.log('xxx')
        $('.fixed').css({
            top : $(parent.window).scrollTop()
        });
    }); 

</script>
</html>

重点就是script里的代码,根据父页面的监听滚动,设置子页面悬浮div的高度为父页面的滚动高度

页面展示
iframe跨域position fixed失效超简单解决方案
这个滚动条是父页面的滚动条哦
iframe跨域position fixed失效超简单解决方案
当滚动条滚动的时候,漂浮几个字还是在页面上方的,按理说这样就可以了

但是不妨有朋友遇到了这种情况,iframe的src与父页面不属于同一个域下,这个时候就会出现问题

iframe跨域position fixed失效超简单解决方案
我的地址刚才是127.0.0.1:9527/1,iframe的src的地址是127.0.0.1:9527/2
刚才都同属于一个域下,正常定位没有问题,但是现在我父页面的地址变成了localhost,我使用localhost访问的时候,定位就不好使了,同时控制台打印出了报错的原因,iframe跨域,查阅资料如下

怎么样是跨域
iframe跨域position fixed失效超简单解决方案

跨域问题怎么解决
iframe跨域position fixed失效超简单解决方案
通过这个api在跨域的iframe里进行信息交互,ok,至此问题就可以解决了,上一部解决问题的思路是通过父页面的滚动监听,将高度设置为子页面悬浮div的高度,都是在子页面中进行的,现在子页面的js报错,因为跨域了,通过这个api可以实现 父页面监听当前页面的滚动高度,将数据传递给子页面,子页面监听到高度变化,改变自己的div,就是这个么个思路,下面是代码

  • 父页面改造
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面1(父页面)</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body style="">

    <iframe id="child" src="http://127.0.0.1:9527/2" width="100%" height="1100px"></iframe>

</body>
<script>
    $(parent.window).scroll(function(){
        document.getElementById('child').contentWindow.postMessage($(parent.window).scrollTop(), "http://127.0.0.1:9527/2")
    });
</script>
</html>

将子页面中监听父页面高度的代码放到父页面中
并且将获取到的高度发送给子页面 document.getElementById(‘child’).contentWindow.postMessage($(parent.window).scrollTop(), “http://127.0.0.1:9527/2”)

  • 子页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面2(子页面)</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body style="height: 1000px;">
    <div class="fixed" style="position:fixed;top: 50px; right: 50px">
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
        <h1>漂浮</h1>
    </div>
    <div style="height: 1000px;background-color: #62a8ea">
    </div>
</body>
<script>
    window.addEventListener('message',function(event){
        console.log(event.data);
        $('.fixed').css({
            top : event.data
        });
    }, false);

</script>
</html>

子页面监听父页面传来的消息,并修改悬浮div的css
页面呈现如下
iframe跨域position fixed失效超简单解决方案
滚动鼠标后
iframe跨域position fixed失效超简单解决方案

至此,完美的解决掉了

  • 跨域
  • iframe position fixed问题

相关文章: