javascript方法封装集合

本文介绍了三种实用的JavaScript技巧:实现跨浏览器兼容性的getElementsByClassName方法、模拟DOMContentLoaded事件确保页面加载完成即触发回调,以及封装事件处理函数,简化添加、移除事件监听器等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、兼容性实现getElementsByClassName

function getElesByClassName(className, parentId) {
    //先通过能力检测,看是否支持
    if(!document.getElementsByClassName) {
        document.getElementsByClassName = function(className, parentId) {
            var parent = parentId ? document.getElementById(parentId) : document;
            var ret = [];
            var eles = parent.getElementsByTagName('*');
            for(i=0; i<eles.length; i++) {
                if(eles[i].className == className
                   || eles[i].className.indexOf(className + ' ')>=0
                   || eles[i].className.indexOf(' ' + className + ' ')>=0
                   || eles[i].className.indexOf(' ' + className)>=0) {
                       ret.push(eles[i])
                   }
            }
            return ret
        }
    }
    return document.getElementsByClassName(className);
}

二、兼容实现DOMContentLoaded事件

function myReady(fn) {
    //对于现代浏览器,对DOMContentLoaded事件的处理,采用标准的事件绑定方式
    if(document.addEventListener) {
        document.addEventListener("DOMContentLoaded", fn, false);
    } else {
        IEContentLoaded(fn);
    }

    //IE下模拟DOMContentLoaded
    function IEContentLoaded(fn) {
        var docu = window.document;
        var done = false;

        //只执行一次用户回调函数的init
        var init = function() {
            if(!done) {
                done = true;
                fn();
            }
        };

        //IE下的监测函数
        (function() {
            try {
                //DOM树未创建完之前调用doScroll会抛出错误
                docu.documentElement.doScroll("left")
            } catch(e) {
                setTimeout(arguments.callee, 50);
                return;
            }
            init();
        })();

        //监听document的加载状态
        docu.onreadystatechange = function() {
            //如果用户是在domReady之后绑定的函数,就立马执行。
            if(docu.readyState == 'complete') {
                docu.onreadystatechange = null;
                init();
            }
        }
    }
}

三、对javascript事件的封装

/**
 * Created by 赵亚峰 on 2018/8/22.
 */
var eventUtil = {
    //添加事件
    addHandle: function(ele, type, handle) {
        if(ele.addEventListener) {
            ele.addEventListener(type, handle, false);
        } else if(ele.attachEvent) {
            ele.attachEvent('on'+type, handle);
        } else {
            ele['on'+type] = handle;
        }
    },

    //删除事件
    removeHandle: function(ele, type, handle) {
        if(ele.removeEventListener) {
            ele.removeEventListener(type, handle, false);
        } else if(ele.detachEvent) {
            ele.detachEvent('on'+type, handle);
        } else {
            ele['on'+type] = null;
        }
    },

    //获取事件对象event;
    getEvent: function(event) {
        return event ? event : window.event;
    },

    //获取事件类型
    getType: function(event) {
        return event.type;
    },

    //获取事件源
    getElement: function(event) {
        return event.target || event.srcElement;
    },

    //阻止浏览器的默认行为
    preventDefault: function(event) {
        if(event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    //阻止事件冒泡
    stopPropagation: function(event) {
        if(event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值