`

在Firefox,IE上使用document.ready时的相关问题

    博客分类:
  • JS
 
阅读更多

在工作中遇到了一下问题

需求

需要在界面初始化之后,根据A div的高度设定B div的高度。其中A div是固定表示的。

实现

$(function(){
    //省略...
    var c = $("#A").height(); //在Firefox和IE上运行时,c的值有可能会为0
    $("#B").css("height", c + "px");
    //省略...
})

 以上代码在chrome上运行正常,在Firefox和IE上,有几率运行失败,c的值有可能会为0

 

调查

1,经查,【c=0】时,【$(document).height() == 0】,界面显示空白。所以怀疑,在执行以上代码时,画面描绘尚未完成。

2,以上代码改为$(window).load时执行,问题依然存在

$(window).load(function(){
    //省略...
    var c = $("#A").height(); //在Firefox和IE上运行时,c的值有可能会为0
    $("#B").css("height", c + "px");
    //省略...
})

对应方法

在进行界面初始化时,检查document的状态,如果document尚未初始化完成,则使用timeout进行等待,并设置回调,当document初始化完成后,实行回调函数。该部分做为共通处理。

//document状态判断
function isDocumentReady(){
	var h = $(document).height();
	//测试发现,在IE上时,document虽然初始化完了,但目标对象的初始化可能尚未完成
    //添加以下代码,等待目标对象的初始化完成
    if($("#A").length != 0){
		h = $("#A").height();
	}
	return h > 0;
}
//设置Timeout,等待界面初始化完成
function waitForReady(callback){
	if(isDocumentReady() > 0){
		window[callback]();
	}else{
		setTimeout("waitForReady('"+ callback +"')", 100);
	}
}

 

每个界面需要,编写并注册回调函数,调用状态检查函数

$(window).load(function(){
	if(isDocumentReady()){
		initPage();
	}else{
		waitForReady('initPage');
	}
})

function initPage(){
    //省略...
    var c = $("#A").height();
    $("#B").css("height", c + "px");
    //省略...
})

 

课题

对$(document).ready,$(window).load的执行时机,网上说是在【页面载入后执行】【文档都准备就绪】之后执行。不是很明白,所谓的【页面载入】和【文档准备就绪】是什么概念,如果说页面载入了或文档准备就绪了,那此时界面的布局,描画,渲染是什麽是不是也应该完成了?那上面的问题是什么原因,为什么$(document).height() 会等于0。是Firfox和IE的BUG?

 

参考

js 把字符串当函数执行的方法

JS中setTimeout()的用法详解

setTimeout传参数 传递多个参数的问题

 

分享到:
评论

相关推荐

    比Jquery的document.ready更快的方法

    个是上次在博客园看到的一篇文章,经测试,确实比jquery的$(document).ready(function(){....})更快,并且在ie和火狐等主流浏览器上都没问题

    when-dom-ready:21世纪的$(document).ready()

    Firefox 29+ Safari 8+ Chrome33+ 歌剧23+ 安装 npm install --save when-dom-ready 或进行快速测试: < script src =" https://unpkg.com/when-dom-ready " > </ script > 用法 import ...

    jquery的$(document).ready()和onload的加载顺序

    改完后,Firefox下测试正常流畅,IE下就要等个十几秒jquery的效果才出现,黄花菜都凉了。 起初以为是和本身onload加载的方法冲突。网上普遍的说法是$(document).ready()是在页面DOM解析完成后执行,而onload事件是在...

    图库新版jQuery焦点图 JS代码

    //document.writeln ('<dd>06月21日 修复IE6下兼容问题</dd>'); //document.writeln ('<dd>06月01日 懒人图库2012新版上线</dd>'); //document.writeln ('<dd>05月26日 新增北方网通服务器</dd>'); //document....

    ptd:一个小的javascript库

    它支持现代浏览器(IE 9+、Chrome、Safari、Firefox)。 用法: $ptd.ready()函数类似于 jQuery 的$(document).ready()函数。 当所有 DOM 内容被加载,然后不再监听该事件时,它会触发。 $ptd.ready(function()...

    使用jquery给input和textarea设定ie中的focus

    这里主要说的是在IE下的focus的问题,因为在firefox中是支持 代码如下:input:focus textarea:focus 在IE下:focus是无效的,所以,我们要在点击以后给input和textarea加上新的样式以配合实现:focus效果. 我们首先来...

    uploadify在Firefox下丢失session问题的解决方法

    今天在用uploadify上传插件时遇到了一个问题,由于我后台做了权限管理,每个请求都有去读session判断权限,但用这个插件时发现登录后上传不了,原因是在读session时认为没有权限而被拦截了,后来在后台打印登录时...

    jquery-vertical-timeline:一个简单的jQuery垂直时间轴

    浏览器支持IE10 + Firefox 4+ Chrome 4+ Safari 3.1+ Opera 10.5+ 手持Safari 3.2+ Android浏览器2.1+ Opera 10+ Blackberry 7+ Firefox Android 32+ IE 10+如何使用查看的底部以了解如何初始化和使用插件简单用法...

    jquery 仿制苹果系统导航菜单

    基于jquery做的网页版仿苹果系统导航菜单,效果非常流畅 华丽 不解释。。。 用法: 在页面头部标签<head></head>中加入下面的代码 ...我已经在IE 6, IE 7, Opera 9, Firefox 2, Firefox 3 and Safari 2上测试通过。

    如何解决谷歌浏览器下jquery无法获取图片的尺寸

    以上代码在IE和火狐中没有问题,但是在谷歌中可能会出现问题,之所以没货的尺寸就是因为图片没有加载完成。 修改方法如下: $(document).ready(function(){ $img.load(function(){ var img_h=$img.height(); var...

    原生JS实现DOM加载完成马上执行JS代码的方法

    用原生JS我们经常使用[removed]事件来加载页面。但是[removed]是在页面元素都加载完毕后才执行,如果页面内有大的图片的话,会在...Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。 MSDN关于JSCRIPT的

    相册 多图片上传

    兼容各种主流浏览器:chrome Firefox IE ... IE7以上都兼容,IE6没试过。 因为Uploadify是用flash做的,所以如果浏览器上面看不到"上传"按钮,请先检查你的flash是否已安装。 压缩包里包含两个项目,一个是多图上传...

    javascript IE中的DOM ready应用技巧

    Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。 MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是...

    StickyToppy:在向下滚动页面时,使页面标题或其他块元素在页面顶部可见

    置顶 在向下滚动页面时,使页面标题或其他块元素在页面顶部可见 用法: 下载源码 将其包含在您的项目中 初始化: StickyToppy.init('selector');... Firefox 21 Chrome25 歌剧12 Safari 5 IE 8

    fakeloader:一个使多页网站看起来像单页应用程序一样加载的jQuery插件

    支持谷歌浏览器,Firefox,IE9 + 需要jQuery 在“ 上阅读有关实际实施的信息得到它 [CSS]( )这个怎么运作加载叠加层已添加到页面的默认标记(见下文)中,并默认显示。 在document.ready上,或在触发时,将删除...

    lite-datatable-js

    要求jQuery.1.4 +桌面浏览器支持IE9 +,Firefox 4 +,Chrome,Safari 4 +,Opera 11+(其他浏览器可能可用,但我没有对其进行测试)分叉如果您发现需要LiteDataTable当前不支持的功能,请通过LiteDataTable问题跟踪...

    jquery1.9.1中文版

    //deferred对象被使用在DOM(Document Object Model翻译:文档对象模型)准备之时 //deferred(延迟)对象:从jQuery 1.5.0版本开始引入的一个新功能 //在DOM准备好时调用 readyList, //一个中心引用对于jQuery...

    jquery1.9.1中文汉化版

    //deferred对象被使用在DOM(Document Object Model翻译:文档对象模型)准备之时 //deferred(延迟)对象:从jQuery 1.5.0版本开始引入的一个新功能 //在DOM准备好时调用 readyList, //一个中心引用对于...

Global site tag (gtag.js) - Google Analytics