最近在酷版上我要做一个内嵌别人的网页的在线服务页面,于是必须用到iframe,以前我以为移动端不支持iframe呢,原来这样都可以。。。。(呵呵,长见识了!我还是只菜鸟)

直接入正题,说说我遇到的困难或者说是我需要解决的问题:

1、重构人员提供页面之后,我给页面上的iframe设置一个src属性,发现那个页面根本不能上下滑动。我就到处搜,有的人说酷版移动端iframe里面不会像pc端一样自动产生滚动条,我真的信了!于是我不得不让产品去和即将上线的几个合作方谈一下,让他们在页面里设置一个document.domain,然后在body上注册一个onload事件,页面加载完成后设置iframe的高度,这样即使iframe没有自动产生滚动条有了固定高度也能够看到所有页面。内嵌页面内容html如下

<body onload="setParentIframeHeight()">
<div class="wraper">内容...</div> <script>
function setParentIframeHeight(){
document.domain=window.location.host.match(/[^.]+\.[^.]+$/)[0];
parent.document.getElementById('serviceBody').style.height = window.document.body.scrollHeight + "px";
}
</script>
</body>

这样做能解决问题,但是大大限制了能接入的页面的数量。

但是后来仔细看了一下下面的html,原来我被重构人员坑了,他给iframe加了一个scrolling = "no",这让伦家怎么出现滚动条啊!

<article id="serviceContent" style="width:100%;height:100%;">
<iframe id="serviceBody" width="100%" height="100%" frameborder="0" scrolling="no"></iframe><!--可能需JS计算高度 height="100%" -->
</article>

  

2、iframe内两个页面切换的问题

要切换iframe里的页面很简单,只要改变iframe的src属性值就可以了,有两种方式改变:

第一种:

document.getElementById('iframeId').src = "http://www.baidu.com";

第二种:

document.getElementById('iframeId').contentWindow.location.href = "http://www.sina.com.cn/";

  但是有个问题,就是用这两种方式改变iframe里的页面地址,并不会重新加载页面,也就是不会触发body的onload事件,导致切换页面的时候滚动条没有回到最上面,所以只是在第一次创建那个iframe的时候才触发了一次,后面的页面都没有触发body的onload,找了好久都没结果,没办法只能使用绝招,把iframe一起干掉,既然改变src不会刷新页面,那么就每次都重新创建一个iframe,这样才终于解决了问题。

function createNewpage(container,newSrc) {
var self = this; var iframe = document.createElement("iframe");
iframe.src = newSrc;
iframe.id = "serviceBody";
iframe.style.width = "100%";
iframe.style.height = "100%";
container.appendChild(iframe); if (window.navigator.userAgent.indexOf('IE') == -1) { //非IE的浏览器
iframe.onload = setIframe;
} else {
iframe.onreadystatechange = function() { //IE浏览器
if (iframe.readyState == 'complete') { //判断状态
setIframe();
}
}
} function setIframe(){
doSomething else;
}
}

上面的代码是参照这个改的:http://xiaogai1010.blog.163.com/blog/static/13717030820135932746318/

酷版移动端iframe改变src,重新加载页面问题探究的更多相关文章

  1. iframe中,重新加载页面

    比如在iframe中的页面,设置一个onclick事件的触发函数flush function flush(){ window.location.reload(); }

  2. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

  3. ExtJs非Iframe框架加载页面实现

    在用Ext开发App应用时,一般的框架都是左边为菜单栏,中间为tab页方式的显示区域.而tab页面大多采用的嵌入一个iframe来显示内容.但是采用iframe方式有一个很大的弊端就是每次在加载一个新 ...

  4. 移动端下拉刷新、加载更多插件dropload.js(基于jQuery/Zepto)

    移动端下拉刷新.加载更多插件dropload.js(基于jQuery/Zepto) 原文:http://www.grycheng.com/?p=1869 废话不多说,先让大家看一下案例效果: DEMO ...

  5. RE:通过移动端滑动手势实现数据加载

      背景:         基于要尝试的移动端项目需要有一个通过上拉下滑手势达成加载不同数据的功能,其涉及到滑动手势和ajax数据加载方面的知识点.故对整个实现过程做一个记录整理.个人JS功底有限,看 ...

  6. layer iframe加载单个图片或者加载页面

    加载单个图片 layer.open({ type: , title: false, closeBtn: , area: '150px', skin: 'layui-layer-nobg', //没有背 ...

  7. 基于zepto的H5/移动端tab切换触摸拖动加载更多数据

    以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...

  8. 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

    要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1 ...

  9. jQuery - 动态创建iframe并加载页面

    <html> <head> <script language="JavaScript" src="jquery-1.11.1.min.js& ...

随机推荐

  1. BZOJ3786 星际探索

    @(BZOJ)[DFS序, Splay] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其 ...

  2. Flux --> Redux --> Redux React 入门 基础实例使用

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  3. flask如何处理并发

    1.使用自身服务器的多进程或者多线程,参考werkzeug的run_simple函数的入参.注意,进程和线程不能同时开启 2.使用gunicorn使用多进程,-w worker 进程数,类型于运行多个 ...

  4. graphviz的使用

    安装:brew install graphviz 使用:dot -Tpng *.dot -o *.png 把dot文件转换为图片,* 换成具体的文件名, 这样你就成功的用脚本渲染出你要绘制的图片啦 参 ...

  5. Word2vector原理

    词向量: 用一个向量的形式表示一个词 词向量的一种表示方式是one-hot的表示形式:首先,统计出语料中的所有词汇,然后对每个词汇编号,针对每个词建立V维的向量,向量的每个维度表示一个词,所以,对应编 ...

  6. Python 一行命令ftp服务器

    Obligatory Twisted example: twistd -n ftp And probably useful: twistd ftp --help Usage: twistd [opti ...

  7. C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

    1.Vector是顺序容器.是一个动态数组.支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自己主动分配空间.添加为原来的两倍.vector随机存取效率高,可是在v ...

  8. C#语法复习2

    第五章 方法 1.方法是一块具有名称的代码 包括:方法体.方法头 局部变量必须被赋值才可以执行下面的操作.实例变量有隐式初始化.有时候,类型推断可以用var关键字,类似于C++当中的auto.用于局部 ...

  9. sed 修连接文件,有坑

    -bash-4.1# ll /etc/rc.local  lrwxrwxrwx. 1 root root 13 Aug 15  2014 /etc/rc.local -> rc.d/rc.loc ...

  10. HashMap底层原理以及与ConCurrentHashMap区别

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bu ...