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

本文讨论了在网页加载后如何确保正确获取元素高度,以动态调整其他元素大小,重点解决了在不同浏览器环境下执行代码时遇到的问题,并介绍了如何通过自定义函数等待页面和目标元素完全加载。

在工作中遇到了一下问题

需求

需要在界面初始化之后,根据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传参数 传递多个参数的问题

 

### 作用 `$(document).ready(function(){})` 的主要作用是在文档的 DOM(文档对象模型)完全加载并解析完成后,立即执行传入的回调函数。这意味着,无论页面中的图片、样式表等其他资源是否加载完成,只要 DOM 结构构建完成,就会执行 `ready()` 方法中的代码。这样可以确保在操作 DOM 元素,这些元素已经存在于文档中,避免因元素未加载而导致的操作失败。 ### 用法 `$(document).ready()` 方法接受一个回调函数作为参数,这个回调函数会在 DOM 加载完成后执行。以下是几种常见的用法示例: #### 基本用法 ```javascript $(document).ready(function() { // 在这里编写需要在 DOM 加载完成后执行的代码 console.log('DOM 已经加载完成'); }); ``` #### 简化写法 在 jQuery 中,`$(document).ready()` 有一个简化的写法 `$(function(){})`,它们的作用是完全相同的: ```javascript $(function() { // 同样是在 DOM 加载完成后执行的代码 console.log('DOM 已经加载完成,这是简化写法'); }); ``` ### 原理 `$(document).ready()` 的实现原理与浏览器的事件机制和 jQuery 的内部逻辑有关。 当页面开始加载,浏览器会解析 HTML 文档并构建 DOM 树。在这个过程中,jQuery 会监听一些关键的事件,主要是 `DOMContentLoaded` 事件(现代浏览器支持)和 `readystatechange` 事件(旧版 IE 支持)。 - **`DOMContentLoaded` 事件**:现代浏览器(如 Chrome、Firefox 等)支持 `DOMContentLoaded` 事件,当 HTML 文档被完全加载和解析完成后,不等待图片、样式表等资源加载完成,就会触发该事件。 - **`readystatechange` 事件**:旧版的 Internet Explorer 不支持 `DOMContentLoaded` 事件,jQuery 通过监听 `readystatechange` 事件来模拟相同的功能。当文档的 `readyState` 属性变为 `'interactive'` 或 `'complete'` ,认为 DOM 已经加载完成。 当这些事件触发,jQuery 会执行 `$(document).ready()` 方法中传入的回调函数。 以下是一个简化的伪代码,展示了 `$(document).ready()` 可能的实现原理: ```javascript // 模拟 jQuery 的 ready 方法 function ready(callback) { if (document.readyState === 'complete' || document.readyState === 'interactive') { // 如果文档已经加载完成,立即执行回调函数 callback(); } else { // 监听 DOMContentLoaded 事件(现代浏览器) document.addEventListener('DOMContentLoaded', callback); // 监听 readystatechange 事件(旧版 IEdocument.onreadystatechange = function() { if (document.readyState === 'interactive' || document.readyState === 'complete') { callback(); } }; } } // 使用 ready 方法 ready(function() { console.log('DOM 已经加载完成,这是模拟的 ready 方法'); }); ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值