一些元素位置设置的通用要领
/**
* 查找元素的左端位置,
* 代码依靠:getStyle来自 https://gist.github.com/hehongwei44/9abf63536accd0f2eeb7
* */
function posX(elem) {
return parseInt(getStyle(elem, "left"));
}
/**
* 查找元素的顶端位置
* */
function posY(elem) {
return parseInt(getStyle(elem, "top"));
}
/*设置元素x和y位置(与当前位置无关)的一对函数*/
/**
* 设置元素程度的函数
* */
function setX(elem, pos) {
elem.style.left = pos + "px";
}
/**
* 设置元素垂直位置的函数
* */
function setY(elem, pos) {
elem.style.top = pos + "px";
}
/**
* 在元素的程度位置上增添像素间隔的函数
* */
function addX(elem, pos) {
setX(posX(elem) + pos);
}
/**
* 在元素的垂直位置上增添像素间隔的函数
* */
function addY(elem, pos) {
setY(posY(elem) + pos);
}
代码泉源:https://gist.github.com/hehongwei44/7f0eca7c0a0ae19adc9f
元素相对于全部父亲节点的left和top的辅佐函数
/**
* 元素elem相对于父亲元素的左端和顶端的位置
* 依靠剧本:https://gist.github.com/hehongwei44/8d33a6e35ee045722e75
* */
/**
* 猎取元素相对于父亲元素的程度位置
* */
function parentX(elem) {
/**
* 假如offsetParent是元素的父亲,那末提早提出
* 不然,我们须要找到元素和元素的父亲相对于全部页面位置,并盘算他们之间的差
* */
return elem.parentNode == elem.offsetParent ? elem.offsetLeft : pageX(elem) - pageX(elem.parentNode);
}
/**
* 猎取元素相对于父亲元素的顶端位置
*
* */
function parentY(elem) {
/**
* 假如offsetParent是元素的父亲,那末提早提出
* 不然,我们须要找到元素和元素的父亲相对于全部页面位置,并盘算他们之间的差
* */
return elem.parentNode == elem.offsetParent ? elem.offsetTop : pageY(elem) - pageY(elem.parentNode);
}
代码泉源:https://gist.github.com/hehongwei44/d8530ae974b1aabbab55
元素相对于全部文档的left和top的辅佐函数
/*元素elem相对于全部文档的左端和顶端的位置*/
/**
* 猎取元素的程度位置
* */
function pageX(elem) {
/**
* 参看我们是不是位于根元素
* 假如我们能继承获得上一个元素,增添当前偏移量并继承向下递归.
* 不然,猎取当前的偏移量.
* */
return elem.offsetParent ? elem.offsetLeft + pageX(elem.offsetParent) : elem.offsetLeft;
}
/**
* 猎取元素的顶端位置
*
* */
function pageY(elem) {
/**
* 参看我们是不是位于根元素
* 假如我们能继承获得上一个元素,增添当前偏移量并继承向下递归.
* 不然,猎取当前的偏移量.
*/
return elem.offsetParent ? elem.offsetTop + pageY(elem.offsetParent) : elem.offsetTop;
}
代码泉源:https://gist.github.com/hehongwei44/8d33a6e35ee045722e75
事宜模子的封装
/**
*
* @author Dean Edwards
* @date 2005/10
* @link http://dean.edwards.name/weblog/2005/10/add-event/
* @transform https://github.com/hehongwei44
* @compatibility IE6+ ,FF, chrome
*
* */
//挪用体式格局->addEvent(window, "load", function(){})
function addEvent(element, type, handler) {
//假如浏览器原生支撑W3C的规范行动addEventListener函数,则直接绑定函数句柄.
if (element.addEventListener) {
//flase示意不支撑事宜捕获,主流浏览器都支撑该规范,IE9+
element.addEventListener(type, handler, false);
} else {
// 为每一个事宜句柄赋值一个自力的ID,addEvent.guid的初始值为1.
if (!handler.$$guid) handler.$$guid = addEvent.guid++;
// 为元素竖立一个事宜范例的散列表
if (!element.events) element.events = {};
// 为每对元素/事宜竖立一个事宜处置惩罚函数的散列表
var handlers = element.events[type];
if (!handlers) {
handlers = element.events[type] = {};
// 存储已有的事宜处置惩罚函数(假如已存在一个),ps:用来特别处置惩罚"on+type"的范例事宜.
if (element["on" + type]) {
handlers[0] = element["on" + type];
}
}
// 在散列表中存储该事宜的处置惩罚函数.
handlers[handler.$$guid] = handler;
// 赋以一个全局事宜处置惩罚函数来处置惩罚一切的事情
element["on" + type] = handleEvent;
}
}
// 建立自力ID的计数器
addEvent.guid = 1;
function removeEvent(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else {
// 从散列表中删除事宜处置惩罚函数
if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
}
}
//事宜处置惩罚函数
function handleEvent(event) {
var returnValue = true;
// 猎取事宜对象(IE运用全局事宜对象)
event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
// 猎取事宜处置惩罚函数散列表的援用.
var handlers = this.events[event.type];
// 顺次实行每一个事宜处置惩罚函数
for (var i in handlers) {
this.$$handleEvent = handlers[i];
//实行回调函数
if (this.$$handleEvent(event) === false) {
returnValue = false;
}
}
return returnValue;
}
//从新包装event对象,使其兼容IE和W3C规范.
function fixEvent(event) {
// 增添W3C规范事宜要领.
event.preventDefault = fixEvent.preventDefault;
event.stopPropagation = fixEvent.stopPropagation;
return event;
}
//IE浏览器阻挠默许行动的体式格局
fixEvent.preventDefault = function () {
//this指向event对象
this.returnValue = false;
}
//IE浏览器阻挠冒泡的体式格局
fixEvent.stopPropagation = function () {
//this指向event对象
this.cancelBubble = true;
};
代码泉源:https://gist.github.com/hehongwei44/3c9ec099751f8f2e197e
阻挠事宜冒泡和默许行动的通用函数
/**
* 阻挠事宜冒泡的通用函数
* */
function stopBubble(e) {
if (e && e.stopPropagation) {
e.stopPropagation();
} else {
window.event.cancelBubble = true;
}
}
/**
* 防备发作默许浏览器行动的通用函数
* */
function stopDefault(e) {
if (e && e.preventDefault) {
e.preventDefault();
} else {
window.event.returnValue = false;
}
return false;
}
代码泉源:https://gist.github.com/hehongwei44/5fb2134a70ab8379849e