Home Reference Source Repository

src/common/util/dom.js

/**
 * @file melon dom 相关的小工具
 * @author leon([email protected])
 */

exports.on = function (target, eventName, handler) {
    if (target.addEventListener) {
        target.addEventListener(eventName, handler);
    }
    else {
        target.attachEvent('on' + eventName, handler);
    }
};

exports.off = function (target, eventName, handler) {

    if (target.removeEventListener) {
        target.removeEventListener(eventName, handler);
    }
    else {
        target.detachEvent('on' + eventName, handler);
    }

};

exports.contains = function (container, contained) {
    if (container.contains) {
        return container.contains(contained);
    }
    while ((contained = contained.parentNode)) {
        if (contained === container) {
            return true;
        }
    }
    return false;
};

/**
 * 获取文档的兼容根节点
 *
 * @inner
 * @param {?HTMLElement=} el 节点引用,跨 frame 时需要
 * @return {HTMLElement} 兼容的有效根节点
 */
function getCompatElement(el) {
    var doc = el && el.ownerDocument || document;
    var compatMode = doc.compatMode;
    return !compatMode || compatMode === 'CSS1Compat'
        ? doc.documentElement
        : doc.body;
}

exports.getScrollLeft = function () {
    return window.pageXOffset || getCompatElement().scrollLeft;
};

exports.getScrollTop = function () {
    return window.pageYOffset || getCompatElement().scrollTop;
};

exports.getClientHeight = function () {
    return getCompatElement().clientHeight;
};

exports.getClientWidth = function () {
    return getCompatElement().clientWidth;
};

exports.getPosition = function (element) {

    var bound = element.getBoundingClientRect();

    var root = document.documentElement;
    var body = document.body;

    var clientTop = root.clientTop || body.clientTop || 0;
    var clientLeft = root.clientLeft || body.clientLeft || 0;
    var scrollTop = window.pageYOffset || root.scrollTop;
    var scrollLeft = window.pageXOffset || root.scrollLeft;

    return {
        left: parseFloat(bound.left) + scrollLeft - clientLeft,
        top: parseFloat(bound.top) + scrollTop - clientTop,
        width: bound.width,
        height: bound.height
    };

};

exports.hasClass = function (element, cls) {
    return element.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
};

exports.addClass = function (element, cls) {
    if (!this.hasClass(element, cls)) {
        element.className += ' ' + cls;
    }
};

exports.removeClass = function (element, cls) {
    if (this.hasClass(element, cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        element.className = element.className.replace(reg, ' ');
    }
};