`

“监听”窗口的“高度”

    博客分类:
  • js
 
阅读更多

 

 

首先是获取窗口的高度:

function getContentHeight(){
		// scrollHeight:网页全文高度;clientHeight:可见区域的高度
		var h = 0;
		var body = document.body;
		var docEle = document.documentElement;
		try{
			if($.browser.safari) {
				h = docEle.scrollHeight;
			} else {
				h = Math.max(body.scrollHeight,body.clientHeight)+20;
			}
		}catch(e){
			h = body.clientHeight +20;
		}
		return h;
	};

 然后,监听事件:

function onEvent(node, event, cb) {
		//attachEvent:ie ; addEventListener:others
		if (node == null) {
			return false;
		}
		if ((typeof cb).toLowerCase() != "function") {
			return;
		}
		if (node.attachEvent) {
			node.attachEvent("on" + event, cb);
		} else {
			if (node.addEventListener) {
				node.addEventListener(event, cb, false);
			} else {
				node["on" + event] = cb;
			}
		}
		return true;
	}

 定义何种事件需要监听:

	
	onEvent(window, "load", adjustWindow);//load网页加载事件
	onEvent(window, "load", function(){
//	       DOMSubtreeModified——当文档或者元素的子树因为添加或删除节点而改变时触发;
//	       DOMNodeInserted——当一个节点作为另一个节点的子节点插入时触发;
//	       DOMNodeRemoved——当一个节点作为另一个节点的子节点删除时触发;
		onEvent(body, "DOMSubtreeModified", adjustWindow);
		onEvent(body, "DOMNodeInserted", adjustWindow);
		onEvent(body, "DOMNodeRemoved", adjustWindow);
	});

 ===============================================================================

扩展:转

一般我们在JS中添加事件,是这样子的

1 obj.onclick=method

这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢?

1 obj.onclick=method1;
2 obj.onclick=method2;
3 obj.onclick=method3;

如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,主角改登场了,在IE中我们可以使用attachEvent方法

1 //object.attachEvent(event,function);
2 btn1Obj.attachEvent("onclick",method1);
3 btn1Obj.attachEvent("onclick",method2);
4 btn1Obj.attachEvent("onclick",method3);

使用格式是前面是事件类型,注意的是需要加on,比如onclick,onsubmit,onchange,执行顺序是

method3->method2->method1

可惜这个微软的私人方法,火狐和其他浏览器都不支持,幸运的是他们都支持W3C标准的addEventListener方法

1 //element.addEventListener(type,listener,useCapture);
2 btn1Obj.addEventListener("click",method1,false);
3 btn1Obj.addEventListener("click",method2,false);
4 btn1Obj.addEventListener("click",method3,false);

执行顺序为method1->method2->method3

做前端开发工程师,最悲剧的某过于浏览器兼容问题了,上面有两种添加事件的方法,为了同一添加事件的方法,我们不得不再重新写一个通用的添加事件函数,幸亏再有前人帮我们做了这件事

01 function addEvent(elm, evType, fn, useCapture) {
02 if (elm.addEventListener) {
03 elm.addEventListener(evType, fn, useCapture);//DOM2.0
04 return true;
05 }
06 else if (elm.attachEvent) {
07 var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+
08 return r;
09 }
10 else {
11 elm['on' + evType] = fn;//DOM 0
12 }
13 }

下面是Dean Edwards 的版本

01 function addEvent(element, type, handler) {
02 //为每一个事件处理函数分派一个唯一的ID
03 if (!handler.$$guid) handler.$$guid = addEvent.guid++;
04 //为元素的事件类型创建一个哈希表
05 if (!element.events) element.events = {};
06 //为每一个"元素/事件"对创建一个事件处理程序的哈希表
07 var handlers = element.events[type];
08 if (!handlers) {
09 handlers = element.events[type] = {};
10 //存储存在的事件处理函数(如果有)
11 if (element["on" + type]) {
12 handlers[0] = element["on" + type];
13 }
14 }
15 //将事件处理函数存入哈希表
16 handlers[handler.$$guid] = handler;
17 //指派一个全局的事件处理函数来做所有的工作
18 element["on" + type] = handleEvent;
19 };
20 //用来创建唯一的ID的计数器
21 addEvent.guid = 1;
22 function removeEvent(element, type, handler) {
23 //从哈希表中删除事件处理函数
24 if (element.events && element.events[type]) {
25 delete element.events[type][handler.$$guid];
26 }
27 };
28 function handleEvent(event) {
29 var returnValue = true;
30 //抓获事件对象(IE使用全局事件对象)
31 event = event || fixEvent(window.event);
32 //取得事件处理函数的哈希表的引用
33 var handlers = this.events[event.type];
34 //执行每一个处理函数
35 for (var in handlers) {
36 this.$$handleEvent = handlers[i];
37 if (this.$$handleEvent(event) === false) {
38 returnValue = false;
39 }
40 }
41 return returnValue;
42 };
43 //为IE的事件对象添加一些“缺失的”函数
44 function fixEvent(event) {
45 //添加标准的W3C方法
46 event.preventDefault = fixEvent.preventDefault;
47 event.stopPropagation = fixEvent.stopPropagation;
48 return event;
49 };
50 fixEvent.preventDefault = function() {
51 this.returnValue = false;
52 };
53 fixEvent.stopPropagation = function() {
54 this.cancelBubble = true;
55 };

功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。

最后贡献一个HTML5工作组的版本:

01 var addEvent=(function(){
02 if(document.addEventListener){
03 return function(el,type,fn){
04 if(el.length){
05 for(var i=0;i<el.length;i++){
06 addEvent(el[i],type,fn);
07 }
08 }else{
09 el.addEventListener(type,fn,false);
10 }
11 };
12 }else{
13 return function(el,type,fn){
14 if(el.length){
15 for(var i=0;i<el.length;i++){
16 addEvent(el[i],type,fn);
17 }
18 }else{
19 el.attachEvent(‘on‘+type,function(){
20 return fn.call(el,window.event);
21 });
22 }
23 };
24 }
25 })();

可能细心的读者发现了IE的attachEvent和W3C标准的addEventListener绑定多个事件的执行顺序是不一样的

文章转自:http://www.popo4j.com/article/js-add-event-attachEvent-and-addEventListener.html

=============================================================

扩展:转

<script type="text/javascript"> 
var     s   =   " "; 
s   +=   "/r/n<br>网页可见区域宽: "+   document.body.clientWidth; 
s   +=   "/r/n<br>网页可见区域高: "+   document.body.clientHeight; 
s   +=   "/r/n<br>网页可见区域宽: "+   document.body.offsetWidth     + "   (包括边线的宽) "; 
s   +=   "/r/n<br>网页可见区域高: "+   document.body.offsetHeight   + "   (包括边线的宽) "; 
s   +=   "/r/n<br>网页正文全文宽: "+   document.body.scrollWidth; 
s   +=   "/r/n<br>网页正文全文高: "+   document.body.scrollHeight; 
s   +=   "/r/n<br>网页被卷去的高: "+   document.body.scrollTop; 
s   +=   "/r/n<br>网页被卷去的左: "+   document.body.scrollLeft; 
s   +=   "/r/n<br>网页正文部分上: "+   window.screenTop; 
s   +=   "/r/n<br>网页正文部分左: "+   window.screenLeft; 
s   +=   "/r/n<br>屏幕分辨率的高: "+   window.screen.height; 
s   +=   "/r/n<br>屏幕分辨率的宽: "+   window.screen.width; 
s   +=   "/r/n<br>屏幕可用工作区高度: "+   window.screen.availHeight+" (去掉状态栏)"; 
s   +=   "/r/n<br>屏幕可用工作区宽度: "+   window.screen.availWidth; 
//alert(s);
document.write(s);
</script>  

分享到:
评论

相关推荐

    浅谈VUE监听窗口变化事件的问题

    这通常涉及到监听窗口的resize事件,并在事件触发时重新设置canvas的宽度和高度。 在内容中,作者详细描述了如何在Vue.js项目中监听窗口变化事件,并给出了具体的实现方案。方案主要包含以下几个步骤: 1. 在Vue...

    门户窗口高度自适应插件

    CSS媒体查询允许开发者定义不同屏幕尺寸下的样式规则,而JavaScript则可以监听窗口大小的变化,触发相应的响应。例如,当窗口尺寸缩小到一定程度,插件可能将原本的多列布局转换为单列布局,以适应更小的屏幕。 在...

    高度自适应窗口

    7. **事件监听**:监听窗口的`resize`事件,当窗口尺寸改变时,可以实时更新页面布局。 【标签】:“源码”和“工具” 关于“源码”,理解高度自适应窗口的实现需要查看和理解相关的源代码,这可能涉及到HTML、CSS...

    vue 监听屏幕高度的实例

    在Vue.js 2.0项目中,有时我们需要实时获取并响应浏览器窗口的高度变化,以便根据屏幕大小调整布局或实现响应式设计。这个需求可以通过监听`window`对象的`onresize`事件来实现。下面我们将详细讲解如何在Vue中监听...

    js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法

    在本文中,我们将会深入探讨如何利用JavaScript来控制页面元素的显示位置,使其固定在屏幕的某个特定位置,并且能够监听屏幕高度的变化,根据变化情况动态地调整元素的位置或样式属性。这一过程涉及到网页设计与前端...

    vue监听 vue实时监听窗⼝滚动条

    在Vue应用中,有时我们需要监听窗口的滚动事件,以便根据用户的滚动行为执行特定的操作,比如加载更多数据或改变页面元素的状态。下面将详细介绍如何在Vue中实现窗口滚动条的实时监听。 1. **监听滚动事件** 在Vue...

    使用JS+CSS实现DIV层自适应高度和宽度

    我们了解了CSS基础知识、JavaScript基础知识、获取浏览器窗口的高度、实现DIV层自适应高度、实现DIV层自适应宽度和监听窗口resize事件等知识点。这些知识点将帮助我们更好地实现网页的自适应设计。

    Android监听键盘状态获取键盘高度的实现方法

    通过getWindowVisibleDisplayFrame()可以获取窗口的可见区域高度,通过和屏幕高度相减,就可以得到软键盘的高度。下面是一个完整的示例代码: ```java public class SoftKeyboardStateWatcher implements ...

    android中监听软键盘的弹出与隐藏,并获取软键盘的高度

    本文将详细介绍如何在Android中实现软键盘监听,以及如何获取软键盘的高度,同时考虑了`android:windowSoftInputMode`设置为`adjustPan`、`adjustResize`和`adjustUnspecified`三种情况。 首先,我们需要理解`...

    JS获取浏览器的高度和宽度

    首先,我们可以使用`window.innerWidth`和`window.innerHeight`来获取浏览器窗口的总宽度和高度,包括工具栏和其他用户界面元素。但请注意,这两个属性并不包括滚动条的宽度和高度。 在Internet Explorer中,获取...

    VS2013 c++ 获取工具栏窗口标题及宽高

    在给定的项目"ListernWindowDemo"中,可能包含了一个示例程序,演示了如何监听窗口变化并实时获取工具栏窗口的信息。实际的代码实现可能会包含一个消息循环,通过`GetMessage`和`DispatchMessage`处理来自系统的消息...

    易语言窗口无边框调整尺寸,移动窗口

    在易语言中,我们可以创建一个窗口过程,监听并处理WM_NCHITTEST消息。首先,我们需要定义一个窗口过程函数,该函数接收消息参数,并根据消息类型返回不同的结果。当接收到WM_NCHITTEST消息时,我们需要编写逻辑来...

    易语言吸附组合窗口运用

    2. **窗口事件监听**:为了实现吸附功能,我们需要监听窗口的“移动”事件。当窗口被移动时,事件处理函数会被调用,此时可以进行吸附逻辑的判断和处理。 3. **吸附逻辑**:在“移动”事件处理函数中,通过获取窗口...

    android监听软键盘状态

    自Android API 21开始,系统提供了`View.OnApplyWindowInsetsListener`接口,可以监听到窗口边界的改变,包括软键盘的显示和隐藏。以下是使用该接口的例子: ```java if (Build.VERSION.SDK_INT &gt;= Build.VERSION_...

    android adjustNothing下获取键盘高度

    总的来说,处理`adjustNothing`模式下的键盘高度需要理解Android窗口管理机制,以及如何监听和计算键盘高度。通过正确地调整输入框位置,我们可以确保在键盘弹出时,用户仍能正常交互。这个过程涉及到Android UI布局...

    在固定位置创建子窗口,点击父窗口自动隐藏子窗口

    这通常可以通过设置窗口的坐标(x, y)和大小(宽度,高度)来实现。在Windows系统中,可以使用WinAPI函数如`CreateWindowEx`;在Qt框架中,使用`QWidget::move`和`QWidget::resize`方法;在Java的Swing或JavaFX中,...

    spy++查找窗口信息,包括句柄,尺寸,位置,监控窗口消息等等。

    Spy++可以显示窗口的左上角坐标(X和Y)以及窗口的宽度和高度,这有助于开发者精确控制窗口在屏幕上的显示效果。 "窗口消息监控"是Spy++的另一大功能。Windows操作系统通过消息队列来处理窗口事件,如鼠标点击、...

    在Electron内嵌的独立项目中怎么实现拖拽、最大化、最小化、关闭

    拖拽功能通常通过监听窗口的`mousedown`和`mousemove`事件实现。当鼠标按下时,记录当前的鼠标位置,然后在鼠标移动时更新窗口的位置。以下是一个简单的示例: ```javascript const { BrowserWindow } = require('...

Global site tag (gtag.js) - Google Analytics