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. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  2. .net破解二(修改dll)

    多谢大家支持! 昨天说了一下反编译与剥壳(.net破解一(反编译,反混淆-剥壳,工具推荐)),今天就来修改修改dll,为了方便,我自己写一个简单程序用来测试 代码如下: 一个 ConsoleAppli ...

  3. 你是否还在质疑EF的性能

    1. 写在前面的话 一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是 ...

  4. JavaScript学习笔记-简单的计时钟表

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  5. SqlServer中——查找杀死阻塞进程

    查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM ...

  6. iOS开发--音乐文件播放工具类的封装(包含了音效的封装)

    一.头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface ...

  7. iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView

    一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的 ...

  8. ActiveMQ_安全配置(五)

    如果Activemq不加安全配置,那么任何知道队列所在服务器IP的人都可以发送接收队列消息 安全配置主要是通过配置账号密码增强安全性 参考资料:http://activemq.apache.org/s ...

  9. java基础语法要点<一>(基于1.8)

    http://yishouce.com/java/run http://www.shucunwang.com/RunCode/java/ 数据类型 8种基本数据类型及对应的 类型封装器 byte, s ...

  10. Maven-搭建普通maven项目

    点击Eclipse菜单栏File->New->Ohter->Maven得到如下图所示对话框: 选中Maven Project并点击Next,到下一个对话框(默认)继续点击Next得到 ...