function stopBubble(e) {
if (e && e.stopPropagation) {//如果传入了事件对象,那么就是非IE浏览器
e.stopPropagation();
} else {
window.event.cancelBubble = true;//使用IE的方式来取消事件冒泡
}
}
function stopDefault(e) {
if (e && e.preventDefault) {
e.preventDefault();//防止默认浏览器行为(W3C)
} else {
window.event.returnValue = false;
}
return false;
} function addEvent(element, type, handler) {
if (!handler.$$guid) {//为每一个事件处理函数赋予一个独立的ID
handler.$$guid = addEvent.guid++;
}
if (!element.events) {//为元素建立一个事件类型的散列表
element.events = {};
}
var handlers = element.events[type];
if (!handler) {
handlers = element.events[type] = {};
if (element["on" + type]) {//存储已有的事件处理函数(如果已经存在一个)
handlers[0] = element["on" + type];
}
}
handlers[handler.$$guid] = handler;//在散列表中存在该事件处理函数
element["on" + type] = handleEvent;
}
addEvent.guid = 1;//创建独立ID的计数器
function removeEvent(element, type, handler) {//从散列表中删除事件处理函数
if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
}
function handleEvent(event) {
var returnValue = true;
event = event || fixEvent(window.event);//获得事件对象(IE使用全局的事件对象)
var handlers = this.events[event.type];//获得事件处理函数散列表的引用
for (var i in handlers) {//依次执行每个事件处理函数
this.$$handlerEvent = handlers[i];
if (this.$$handlerEvent(event) === false) {
returnValue = false;
}
}
return returnValue;
}
function fixEvent(event) {//增加一些IE事件对象的缺乏的方法
event.preventDefault = fixEvent.preventDefault;//增加W3C标准事件方法
event.stopPropagation = fixEvent.stopPropagation;
return event;
}
fixEvent.preventDefault = function () {
this.returnValue = false;
}
fixEvent.stopPropagation = function () {
this.cancelBubble = true;
}
//获取指定元素elem的样式属性
function getStyle(elem, name) {
if (elem.style[name]) {//如果属性存在于style[]中,那么它已被设置了(并且是当前的)
return elem.style[name];
} else {
if (elem.currentStyle) {//尝试使用IE的方法
return elem.currentStyle[name];
} else if (document.defaultView && document.defaultView.getComputedStyle) {//或者W3C的方法,如果存在的话
//name=name.replace(/([A-Z)/g,"-$1");
name = name.toLowerCase();
var s = document.defaultView.getComputedStyle(elem, '');//获取样式对象并获取属性(存在的话)值
return s && s.getPropertyValue(name);
} else {
return null;
}
}
}
//获取元素的X(水平、左端)位置
function pageX(elem) {
return elem.offsetParent ?//查看我们是否位于根元素
elem.offsetLeft + pageX(elem.offsetParent) ://如果我们能继续得到上一个元素,增加当前的偏移量并继续向上递归
elem.offsetLeft;//否则获得当前的偏移量
}
//获得元素Y(垂直、顶端)位置
function pageY(elem) {
return elem.offsetParent ?//查看我们是否位于根元素
elem.offsetTop + pageY(elem.offsetParent) ://如果能继续得到上一个元素,增加当前的偏移量并继续向上递归
elem.offsetTop;//否则获取当前的偏移量
}
//获取元素相对于父亲的水平位置
function parentX(elem) {
return elem.parentNode == elem.offsetParent ?//如果offsetParent是元素的父亲,那么提前退出
elem.offsetLeft :
pageX(elem) - pageX(elem.parentNode);//否则,我们需要找到元素和元素的父亲相对于整个页面位置,并计算他们之前的差
}
//获取元素相对于父亲的垂直位置
function parentY(elem) {
return elem.parentNode == elem.offsetParent ?//如果offsetParent是元素的父亲,那么提前退出
elem.offsetTop :
pageX(elem) - pageY(elem.parentNode);//否则,我们需要找到元素和元素的父亲相对于整个页面位置,并计算他们之前的差
}
//恢复css原的属性值 防止reset css函数副作用的函数
function restoreCSS(elem, prop) {
for (var i in prop) {//重置所有属性,恢复它们的原有值
elem.style[i] = prop[i];
}
}
//设置CSS一组属性的函数,它可以恢复到原有设置
function resetCSS(elem, prop) {
var old = [];
for (var i in prop) {
old[i] = elem.style[i];//记录旧的属性值
elem.style[i] = prop[i];//并设置新的值
}
return old;//返回已经变化的值集合,预留给restoreCSS函数使用
}
function getHeight(elem) {//获得元素的真实高度
return parseInt(getStyle(elem, 'height'));//获得CSS的最终值并解析出可用的数值
}
function getWidth(elem) {//获得元素的真实宽度
return parseInt(getStyle(elem, 'width'));//获得CSS的最终值并解析出可用的数值
}
//查找元素完整的,可能的高度
function fullHeight(elem) {
//如果元素是显示的,那么使用offsetHeight就能得到高度,如果没有offsetHeight,则使用getHeight()
if (getStyle(elem, 'display') != 'none') {
return elem.offsetHeight || getHeight(elem);
}
//处理display为none的元素,所以重置它的css属性以获取更精确的读数
var old = resetCSS(elem, {
display: '',
visibility: 'hidden',
position: 'absolute'
});
var h = elem.clientHeight || getHeight(elem);//使用clientHeihgt找到元素的完整高度,如果还不生效,则使用getHeight函数
restoreCSS(elem, old);//恢复css原的属性
return h;//返回元素的完整高度
}
//查找元素完整的,可能的宽度
function fullWidth(elem) {
//如果元素是显示的,那么使用offsetWidth就能得到高度,如果没有offsetHeight,则使用getHeight()
if (getStyle(elem, 'display') != 'none') {
return elem.offsetWidth || getWidth(elem);
}
//处理display为none的元素,所以重置它的css属性以获取更精确的读数
var old = resetCSS(elem, {
display: '',
visibility: 'hidden',
position: 'absolute'
});
var h = elem.clientWidth || getWidth(elem);//使用clientWidth找到元素的完整高度,如果还不生效,则使用getWidth函数
restoreCSS(elem, old);//恢复css原的属性
return h;//返回元素的完整高度
} function hide(elem) {//隐藏元素
var curDisplay = getStyle(elem, 'display');//找到元素display的当前状态
if (curDisplay != 'none') {//记录它的display状态
elem.$oldDisplay = curDisplay;
}
elem.style.display = 'none';//设置display为none 隐藏元素
}
function show(elem) {//显示元素
elem.style.display = elem.$oldDisplay || '';//设置display属性为它的原始值,如没有记录原始值 则使用block
} function setOpacity(elem, level) {//设置元素透明度 级别从0-100
if (elem.filters) {//如果存在filters这个属性 则它是IE 所以设置元素的Alpha滤镜
elem.style.filters = "alpha(opacity=" + level + ")";
} else {
elem.style.opacity = level / 100;//使用W3C的opacity属性
}
}
function slideDown(elem) {
elem.style.height = '0px';//从0高度开始滑动
show(elem);//先显示元素(但是看不到它,因为它的高度是0)
var h = fullHeight(elem);//找到元素的完整的潜在高度
for (var i = 0; i <= 100; i += 5) {//在一秒钟内执行一个20帧的动画
//保证能够保持正确的i的闭包函数
(function () {
var pos = i;
setTimeout(function () {
elem.style.height = ((pos / 100) * h) + 'px';
}, (pos + 1) * 10);
})();
}
}
function fadeIn(elem) {
setOpacity(elem, 0);//从0透明度开始
show(elem);//先显示元素(但是看不到它,因为它的透明度是0)
for (var i = 0; i <= 100; i += 5) {//在一秒钟内执行一个20帧的动画
//保证能够保持正确的i的闭包函数
(function () {
var pos = i;
setTimeout(function () {
setOpacity(elem, pos);
}, (pos + 1) * 10);
})();
}
}
function getX(e) {//获取光标的水平位置
e = e || window.event;//标准化事件对象
return e.pageX || e.clientX + document.body.scrollLeft;//先检查非IE浏览器的位置,再检查IE的位置
}
function getY(e) {//获取光标的垂直位置
e = e || window.event;//标准化事件对象
return e.pageY || e.clientY + document.body.scrollTop;//先检查非IE浏览器的位置,再检查IE的位置
}
function getElementX(e) {//获得鼠标相对于当前元素(事件对象e的属性target)的X位置
return (e && e.layerX) || window.event.offsetX;//获得正确的偏移量
}
function getElementY(e) {//获得鼠标相对于当前元素(事件对象e的属性target)的Y位置
return (e && e.layerY) || window.event.offsetY;//获得正确的偏移量
}
function pageHeight() {//返回页面的高度(增加内容的时候可能会改变)
return document.body.scrollHeight;
}
function pageWidth() {//返回页面的宽度(增加内容的时候可能会改变)
return document.body.scrollWidth;
}
function scrollX() {//确定浏览器水平滚动位置的函数
var de = document.documentElement;
return self.pageXOffset ||//如果浏览器存在pageXOffset属性 则使用它
(de || de.scrollLeft) ||//尝试获取根节点的左端滚动的偏移量
document.body.scrollLeft;//尝试获取body元素的左端滚动的偏移量
}
function scrollY() {//确定浏览器垂直滚动位置的函数
var de = document.documentElement;
return self.pageYOffset ||//如果浏览器存在pageYOffset属性 则使用它
(de || de.scrollTop) ||//尝试获取根节点的顶端滚动的偏移量
document.body.scrollTop;//尝试获取body元素的顶端滚动的偏移量
}
function windowHeight() {//获取视口的高度
var de = document.documentElement;
return self.innerHeight ||////如果浏览器存在innerHeight属性 则使用它
(de && de.clientHeight) ||//尝试获取根节点的高度偏移量
document.body.clientHeight;//尝试获取body元素的高度偏移量
}
function windowWidth() {//获取视口的宽度
var de = document.documentElement;
return self.innerWidth ||////如果浏览器存在innerWidth属性 则使用它
(de && de.clientWidth) ||//尝试获取根节点的高度偏移量
document.body.clientWidth;//尝试获取body元素的高度偏移量
}

零散的JavaScript公用方法的更多相关文章

  1. JavaScript使用方法和技巧大全

        有些时候你精通一门语言,但是会发现你其实整天在和其它语言打交道,也许你以为这些微不足道,不至于影响你的开发进度,但恰恰是这些你不重视的东西会浪费你很多时间,我一直以为我早在几年前就已经精通Ja ...

  2. JavaScript - reduce方法,reduceRight方法 (Array)

    JavaScript - reduce方法 (Array) 解释:reduce() 方法接收一个函数作为累加器(accumulator),数组 中的每个值(从左到右)开始合并,最终为一个值. 语法:a ...

  3. JavaScript slice() 方法

    JavaScript slice() 方法  JavaScript Array 对象 实例 在数组中读取元素: var fruits = ["Banana", "Oran ...

  4. JavaScript toLocaleString() 方法

    JavaScript toLocaleString() 方法 JavaScript Array 对象 定义和用法 把数组转换为本地字符串. 语法 arrayObject.toLocaleString( ...

  5. 关于JavaScript lastIndexOf() 方法 w3school.com.cn写的不一定全对

    关于JavaScript lastIndexOf() 方法 w3school.com.cn的表述是 定义和用法 lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的 ...

  6. javascript一些方法兼容

    javascript一些方法兼容 标签(空格分隔): javascript 方法收集 [TOC] Object.keys 参考地址 if (!Object.keys) Object.keys = fu ...

  7. 在Swift中使用JavaScript的方法和技巧

    本文作者Nate Cook是一位独立的Web及移动应用开发者,是继Mattt大神之后NSHipster的主要维护者,也是非常知名活跃的Swift博主,并且还是支持自动生成Swift在线文档的Swift ...

  8. 把C编译成javascript的方法

    把C编译成javascript的方法,便于嵌入到HTML5中 https://github.com/kripken/emscripten

  9. DbHelperSQL 判断数据库表结构公用方法

    #region 公用方法        /// <summary>        /// 判断是否存在某表的某个字段        /// </summary>        ...

随机推荐

  1. 发布园友设计的新款博客皮肤BlueSky

    园友#a为大家设计了一款“简单.纯粹,一点淡雅,一点宁静”的博客皮肤——BlueSky,欢迎您的享用!感谢#a的精心设计! 如果您有兴趣为大家设计博客皮肤,请将您设计的html/css/images文 ...

  2. C/C++代码覆盖工具gcov与lcov入门

    C/C++代码覆盖工具gcov与lcov入门 gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具.下面介绍一下如何利用gcov来收集代码覆盖信息.想要用gcov收集代码覆盖信息,需要在g ...

  3. Ext.NET-布局篇

    概述 前一篇介绍了Ext.NET基础知识,并对Ext.NET布局进行了简要的说明,本文中我们用一个完整的示例代码来看看Ext.NET的布局. 示例代码下载地址>>>>> ...

  4. [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)

    题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...

  5. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

  6. android之Activity回传数据

    约定:当Activity发生跳转时将原来的Activity成为父Activity,将新出现的Activity成为子Activity. 情景设置 下面是个发短信的Activity 当我们点击图中的+按钮 ...

  7. Python 一些总结和比较

    数据类型

  8. 现代软件工程 第七章 【MSF】练习与讨论

    7.7  移山开发方法——比TFS敏捷更精简 几个软件学院的学生来请教阿超,同学们自豪地说,我们要用全套TFS敏捷开发模式开发项目! 真的?阿超不敢相信. 同学: 对!我们要用全5个工作项类型 – 任 ...

  9. Linux 安装mysql+apache+php

    安装mysql 1.  yum install mysql mysql-server 2. 修改mysql密码 >use mysql    >update user set passwor ...

  10. (Extjs)对于GridPanel的各种操作

    刚才做了个有点特殊的需求,在某窗口关闭时,要把Gridpanel中的选择行清空,因为如果不清空,直接双击,就不能即时更新出来我想要的内容. 答案是:Grid.getSelectionModel().c ...