首先是获取窗口的高度:
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中添加事件,是这样子的
这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢?
如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,主角改登场了,在IE中我们可以使用attachEvent方法
2 |
btn1Obj.attachEvent( "onclick" ,method1);
|
3 |
btn1Obj.attachEvent( "onclick" ,method2);
|
4 |
btn1Obj.attachEvent( "onclick" ,method3);
|
使用格式是前面是事件类型,注意的是需要加on,比如onclick,onsubmit,onchange,执行顺序是
method3->method2->method1
可惜这个微软的私人方法,火狐和其他浏览器都不支持,幸运的是他们都支持W3C标准的addEventListener方法
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);
|
06 |
else if (elm.attachEvent) {
|
07 |
var r = elm.attachEvent(‘on‘ + evType, fn);
|
11 |
elm[ 'on' + evType] = fn;
|
下面是Dean Edwards 的版本
01 |
function addEvent(element, type, handler) {
|
03 |
if (!handler.$$guid) handler.$$guid = addEvent.guid++;
|
05 |
if (!element.events) element.events = {};
|
07 |
var handlers = element.events[type];
|
09 |
handlers = element.events[type] = {}; |
11 |
if (element[ "on" + type]) {
|
12 |
handlers[0] = element[ "on" + type];
|
16 |
handlers[handler.$$guid] = handler; |
18 |
element[ "on" + type] = handleEvent;
|
22 |
function removeEvent(element, type, handler) {
|
24 |
if (element.events && element.events[type]) {
|
25 |
delete element.events[type][handler.$$guid];
|
28 |
function handleEvent(event) {
|
29 |
var returnValue = true ;
|
31 |
event = event || fixEvent(window.event); |
33 |
var handlers = this .events[event.type];
|
35 |
for ( var i in handlers) {
|
36 |
this .$$handleEvent = handlers[i];
|
37 |
if ( this .$$handleEvent(event) === false ) {
|
44 |
function fixEvent(event) {
|
46 |
event.preventDefault = fixEvent.preventDefault; |
47 |
event.stopPropagation = fixEvent.stopPropagation; |
50 |
fixEvent.preventDefault = function () {
|
51 |
this .returnValue = false ;
|
53 |
fixEvent.stopPropagation = function () {
|
54 |
this .cancelBubble = true ;
|
功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。
最后贡献一个HTML5工作组的版本:
01 |
var addEvent=( function (){
|
02 |
if (document.addEventListener){
|
03 |
return function (el,type,fn){
|
05 |
for ( var i=0;i<el.length;i++){
|
06 |
addEvent(el[i],type,fn); |
09 |
el.addEventListener(type,fn, false );
|
13 |
return function (el,type,fn){
|
15 |
for ( var i=0;i<el.length;i++){
|
16 |
addEvent(el[i],type,fn); |
19 |
el.attachEvent(‘on‘+type, function (){
|
20 |
return fn.call(el,window.event);
|
可能细心的读者发现了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>
相关推荐
这通常涉及到监听窗口的resize事件,并在事件触发时重新设置canvas的宽度和高度。 在内容中,作者详细描述了如何在Vue.js项目中监听窗口变化事件,并给出了具体的实现方案。方案主要包含以下几个步骤: 1. 在Vue...
CSS媒体查询允许开发者定义不同屏幕尺寸下的样式规则,而JavaScript则可以监听窗口大小的变化,触发相应的响应。例如,当窗口尺寸缩小到一定程度,插件可能将原本的多列布局转换为单列布局,以适应更小的屏幕。 在...
7. **事件监听**:监听窗口的`resize`事件,当窗口尺寸改变时,可以实时更新页面布局。 【标签】:“源码”和“工具” 关于“源码”,理解高度自适应窗口的实现需要查看和理解相关的源代码,这可能涉及到HTML、CSS...
在Vue.js 2.0项目中,有时我们需要实时获取并响应浏览器窗口的高度变化,以便根据屏幕大小调整布局或实现响应式设计。这个需求可以通过监听`window`对象的`onresize`事件来实现。下面我们将详细讲解如何在Vue中监听...
在本文中,我们将会深入探讨如何利用JavaScript来控制页面元素的显示位置,使其固定在屏幕的某个特定位置,并且能够监听屏幕高度的变化,根据变化情况动态地调整元素的位置或样式属性。这一过程涉及到网页设计与前端...
在Vue应用中,有时我们需要监听窗口的滚动事件,以便根据用户的滚动行为执行特定的操作,比如加载更多数据或改变页面元素的状态。下面将详细介绍如何在Vue中实现窗口滚动条的实时监听。 1. **监听滚动事件** 在Vue...
我们了解了CSS基础知识、JavaScript基础知识、获取浏览器窗口的高度、实现DIV层自适应高度、实现DIV层自适应宽度和监听窗口resize事件等知识点。这些知识点将帮助我们更好地实现网页的自适应设计。
通过getWindowVisibleDisplayFrame()可以获取窗口的可见区域高度,通过和屏幕高度相减,就可以得到软键盘的高度。下面是一个完整的示例代码: ```java public class SoftKeyboardStateWatcher implements ...
本文将详细介绍如何在Android中实现软键盘监听,以及如何获取软键盘的高度,同时考虑了`android:windowSoftInputMode`设置为`adjustPan`、`adjustResize`和`adjustUnspecified`三种情况。 首先,我们需要理解`...
首先,我们可以使用`window.innerWidth`和`window.innerHeight`来获取浏览器窗口的总宽度和高度,包括工具栏和其他用户界面元素。但请注意,这两个属性并不包括滚动条的宽度和高度。 在Internet Explorer中,获取...
在给定的项目"ListernWindowDemo"中,可能包含了一个示例程序,演示了如何监听窗口变化并实时获取工具栏窗口的信息。实际的代码实现可能会包含一个消息循环,通过`GetMessage`和`DispatchMessage`处理来自系统的消息...
在易语言中,我们可以创建一个窗口过程,监听并处理WM_NCHITTEST消息。首先,我们需要定义一个窗口过程函数,该函数接收消息参数,并根据消息类型返回不同的结果。当接收到WM_NCHITTEST消息时,我们需要编写逻辑来...
2. **窗口事件监听**:为了实现吸附功能,我们需要监听窗口的“移动”事件。当窗口被移动时,事件处理函数会被调用,此时可以进行吸附逻辑的判断和处理。 3. **吸附逻辑**:在“移动”事件处理函数中,通过获取窗口...
自Android API 21开始,系统提供了`View.OnApplyWindowInsetsListener`接口,可以监听到窗口边界的改变,包括软键盘的显示和隐藏。以下是使用该接口的例子: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_...
总的来说,处理`adjustNothing`模式下的键盘高度需要理解Android窗口管理机制,以及如何监听和计算键盘高度。通过正确地调整输入框位置,我们可以确保在键盘弹出时,用户仍能正常交互。这个过程涉及到Android UI布局...
这通常可以通过设置窗口的坐标(x, y)和大小(宽度,高度)来实现。在Windows系统中,可以使用WinAPI函数如`CreateWindowEx`;在Qt框架中,使用`QWidget::move`和`QWidget::resize`方法;在Java的Swing或JavaFX中,...
Spy++可以显示窗口的左上角坐标(X和Y)以及窗口的宽度和高度,这有助于开发者精确控制窗口在屏幕上的显示效果。 "窗口消息监控"是Spy++的另一大功能。Windows操作系统通过消息队列来处理窗口事件,如鼠标点击、...
拖拽功能通常通过监听窗口的`mousedown`和`mousemove`事件实现。当鼠标按下时,记录当前的鼠标位置,然后在鼠标移动时更新窗口的位置。以下是一个简单的示例: ```javascript const { BrowserWindow } = require('...