tools

98 阅读2分钟

一些常用工具

1、deepClone

var obj = {
    name: 'To',
    age: 24,
    sex: 'male',
    cars: ['BMW', 'audi'],
    girlfriend: {
    	name: 'shanshan',
    	age: 24,
    	gender: 'female'
    }
}
var obj1 = {}

function clone(origin, target) {
    var temp = target || {}
    if (typeof (origin) != 'object' && origin =='null') { // 如果是原始值或者null的话
    	temp = origin
    } else {
    	for (var k in origin) {
    		if (origin.hasOwnProperty(k)) { // 不复制原型链上的属性
    			if (Object.prototype.toString.call(origin[k]).indexOf('Array') >= 0) { // 如果是数组
    				temp[k] = []
    			} else { // 对象
    				temp[k] = {}
    			}
    			arguments.callee(origin[k], temp[k]) // 如果这行 temp[k] = clone(origin[k], temp[k]) 那么生效
    		}
    	}
    }
    return temp
}

typeof (完美检测所有类型)

function checkType(target) {
			var template = {
				'[object Array]': 'array',
				'[object Number]': 'number object',
				'[object Boolean]': 'boolean object',
				'[object String]': 'string object',
				'[object Object]': 'object'
			}
			if (target === null) {
				return 'null'
			} else {
				switch (typeof (target)) {
					case 'object':
						var toStr = Object.prototype.toString.call(target)
						return template[toStr]
					default:
						return typeof (target)
				}
			}
		}

数组去重

1.利用对象
	Array.prototype.unique = function () {

			var temp = {}
			var arr = []

			for (var i = 0; i < this.length; i++){
				if (!temp[this[i]]){
					tem[this[i]] = '去重'
					arr.push(this[i])
				}
			}
			return arr
		}
		
2.

找出字符串中第一个出现的只出现一次的字符

function firstUnique(str){
		var obj={},
			arr= []
		for(var a = 0; a < str.length; a++){
			if (!obj[str[a]]){
				obj[str[a]] = {
					count:1,
					index:a,
					label:str[a]
				}
			} else{
				obj[str[a]].count++
			}
		}
		for (var k in obj){
			arr.push(obj[k])
		}
	 	arr = arr.filter(function(a){
			return a.count === 1
		})
		arr.sort(function(a,b){
			if (a.count <  b.count ){
				return -1
			} else {
				return 1
			}

		})
		return arr[0]
	}

insertAfter 在某元素之后插入一个元素

    Element.prototype.insertAfter = function(target,origin){
        if (origin.nextElementSibling == null){
            origin.appendChild(target)
        } else{
            this.insertBefore(target,origin.nextElementSibling)
        }
    }

getScrollOffset 获取滚动条滚动距离

getScrollOffset(){
    if(window.pageXOffset){
        return {
            x:window.pageXOffset,
            y:window.pageXOffset
        }
    }else {
        return {
            x:document.body.scrollLeft + document.documentElement.scrollLeft,
            y:document.body.scrollTop + document.documentElement.scrollTop
        }
    }
}

getViewportSize 获取可视窗口尺寸

getViewportSize(){
    if(window.innerWidth){
        return {
            h:window.innerHeight,
            x:window.innerWidth,
        }
    }else {
        if (document.compatMode = 'BackCompat'){ // 怪异模式
            return {
                x:document.body.clientWidth,
                y:document.body.clientHeight
            }
        } else {
            return {
                x:document.documentElement.clientWidth,
                y:document.documentElement.clientHeight
            }
        }
    }
}

统一this指向和兼容性的事件绑定

    function addEvent(ele, type, handler) {
        if (ele.addEventListener) {
            ele.addEventListener(type, handler,false)
        } else if (ele.attachEvent) {
            ele.attachEvent(ele, type, function () {
                handler.call(ele)
            })
        } else {
            ele[`on${type}`] = handler
        }
    }

阻止冒泡

怎么阻止,是从事件源对象处阻止吗?

    function stopBubble(e) { // 阻止冒泡
        if (e.stopropagation) {
            e.stopropagation()
        } else {
            e.cancelBubble = true
        }
    }

阻止默认事件

   function cancelDefault(e) { // 阻止默认事件
        if (e.preventDefault) {
            e.preventDefault()
        } else {
            e.returnValue = false
        }
    }

元素的拖拽事件


        function dragElement(ele) {
            var posX = 0,
                posY = 0

            addEvent(ele, 'mousedown', elmousedown)

            addEvent(ele, 'mouseup', elmouseup)

            function elmousedown(e) { // 鼠标按下事件
                cancelDefault(e)
                stopBubble(e)
                posX = e.pageX - ele.style.left.split('px')[0]
                posY = e.pageY - ele.style.top.split('px')[0]
                
                document.addEventListener('mousemove', move, false)

            }
            function elmouseup(e) { // 松开鼠标 解除移动事件
                document.removeEventListener('mousemove', move, false)
            }
            function move(e) { // 方块跟随鼠标移动
                var event = e || window.event
                
                ele.style.left = event.pageX - posX + 'px'
                ele.style.top = event.pageY - posY + 'px'
            }
        }