Chorme下iframe加载会出现两次大家有没有遇到过这种情况?在我的项目中就遇到这种问题了,所以我想把我的解决办法说一下以让大家不用在这个上面费时间,我的问题是在用JQuery插件SimpleModal的时候发现的,会加载两次html请求,后来一步一步调试加查看一下资料,iframe的onload会在chorme下调用两次,下面是一个小demo可以让你查看出来;
<html> <head></head> <body><div id="msg">状态:</div></body> <script> var msg = document.getElementById("msg"); var iframe = document.createElement("iframe"); iframe.onload = function(){ msg.innerHTML += "onload,"; } document.body.appendChild(iframe); iframe.src = "http://www.baidu.com" ; </script> </html>
请把这段代码放在chorme下和firefox下分别运行,会发现chorme下会调用两次onload方法,原因是:你是先把iframe append在body上,此时iframe调用了一次onload,但src是空的当然不会发生什么事情,然后给src赋值又调了一次,然后baidu被加载进来。怎么解决呢?知道了这个原理之后其实就很容易了,我们把赋值src放到append之前就好了,保证让iframe加在body之前给src赋值,如下:
<html> <head></head> <body><div id="msg">状态:</div></body> <script> var msg = document.getElementById("msg"); var iframe = document.createElement("iframe"); iframe.onload = function(){ msg.innerHTML += "onload,"; } iframe.src = "http://www.baidu.com" ; document.body.appendChild(iframe); </script> </html>
JQuery的弹框插件SimpleModal也有这个问题,用过这个插件的同学们不知道有没有发现chorme下会读到两次请求呢?其实问题就在于它的一段代码如下:
// create the overlay s.d.overlay = $('<div></div>') .attr('id', s.o.overlayId) .addClass('simplemodal-overlay') .css($.extend(s.o.overlayCss, { display: 'none', opacity: s.o.opacity / 100, height: s.o.modal ? w[0] : 0, width: s.o.modal ? w[1] : 0, position: 'fixed', left: 0, top: 0, zIndex: s.o.zIndex + 1 })) .appendTo(s.o.appendTo); // create the container s.d.container = $('<div></div>') .attr('id', s.o.containerId) .addClass('simplemodal-container') .css($.extend(s.o.containerCss, { display: 'none', position: 'fixed', zIndex: s.o.zIndex + 2 })) .append(s.o.close && s.o.closeHTML ? $(s.o.closeHTML).addClass(s.o.closeClass) : '') .appendTo(s.o.appendTo); s.d.wrap = $('<div></div>') .attr('tabIndex', -1) .addClass('simplemodal-wrap') .css({height: '100%', outline: 0, width: '100%'}) .appendTo(s.d.container); // add styling and attributes to the data // append to body to get correct dimensions, then move to wrap s.d.data = data .attr('id', data.attr('id') || s.o.dataId) .addClass('simplemodal-data') .css($.extend(s.o.dataCss, { display: 'none' })).appendTo('body'); data = null; s.setContainerDimensions(); s.d.data.appendTo(s.d.wrap);
请看最后两句,先是把s.d.data放在Body里,然后调用setContainerDimensions计算完位置后,又重新append到wrap上,这样两次append导致了请求了两次,javascript运行很快的,所以chomre下出现第一次请求还未完成就取消了,又重新请求的,这样在工程里会出现很多问题,那么解决方法就用上述demo的原理,改完如下:
// create the overlay s.d.overlay = $('<div></div>') .attr('id', s.o.overlayId) .addClass('simplemodal-overlay') .css($.extend(s.o.overlayCss, { display: 'none', opacity: s.o.opacity / 100, height: s.o.modal ? w[0] : 0, width: s.o.modal ? w[1] : 0, position: 'fixed', left: 0, top: 0, zIndex: s.o.zIndex + 1 })) .appendTo(s.o.appendTo); // create the container s.d.container = $('<div></div>') .attr('id', s.o.containerId) .addClass('simplemodal-container') .css($.extend(s.o.containerCss, { display: 'none', position: 'fixed', zIndex: s.o.zIndex + 2 })) .append(s.o.close && s.o.closeHTML ? $(s.o.closeHTML).addClass(s.o.closeClass) : '') .appendTo(s.o.appendTo); s.d.wrap = $('<div></div>') .attr('tabIndex', -1) .addClass('simplemodal-wrap') .css({height: '100%', outline: 0, width: '100%'}) .appendTo(s.d.container); // add styling and attributes to the data // append to body to get correct dimensions, then move to wrap s.d.data = data .attr('id', data.attr('id') || s.o.dataId) .addClass('simplemodal-data') .css($.extend(s.o.dataCss, { display: 'none' })); var tempSrc = data.find("iframe").attr("src"); data.find("iframe").removeAttr("src"); s.d.data.appendTo('body'); data = null; s.setContainerDimensions(); s.d.data.appendTo(s.d.wrap); s.d.data.find("iframe").attr("src",tempSrc);
我们先把src拿出来,这样append的时候就会是空的,就不会重复请求src中的url,等都append完后再把src换给他,解决!
相关推荐
创建iframe对象,添加load事件, 再将iframe添加到body中。Chrome/Opera中会造成load事件的handler执行两次。
在win7系统下,谷歌chorme浏览器很多时候会出现假死现在,页面有时会无反应(尤其是有弹出选择框时),但最大化最小化(F11)后恢复正常,但很快又无反应假死。附件中提出了解决假死的办法,绝对有效。
google chorme 谷歌 浏览器
AxureRP_for_chorme_0_6_3版本 ,谷歌AxureRP插件。 AxureRP_for_chorme_0_6_3版本 ,谷歌AxureRP插件。
chorme插件开发,APP加载实例代码,来源于开发文档,方便
目前chorme计划取消flash的支持,但很多网站依旧需要用到flash,本文件不用手动导入注册表,直接双击添加注册表即可,亲测有效。
chorme.dll
AxureRP_for_chorme
AxureRP_for_chorme
离线安装,非常好用!!离线安装,非常好用!!离线安装,非常好用!!离线安装,非常好用!!离线安装,非常好用!!(凑字数……)
AxureRP_for_chorme_0_6_2 谷歌插件下载
谷歌浏览器查看本地html文件,包括zip版和crx版,AxureRP_for_chorme
最新版ie tab for chorme 离线插件
嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有...
多标签的用途太多了,特别在现在的发展下,功能型软件主打都是可分页、可分屏、自适应、高度自由组合等等要求。多标签灵活,功能更加密集,适合分屏、多屏的使用;比如说炒股的就需要多屏,那么就要可分离标签来搞定...
主要给大家介绍了ubuntu下chorme提示输入秘钥环的解决方法,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
AxureRP_for_chorme
chorme liveReload 是chorme的一个插件 结合grunt 可实现实时刷新