码迷,mamicode.com
首页 > 其他好文 > 详细

placeholder兼容

时间:2015-02-27 13:12:55      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

placeholder在低版本浏览器上是不兼容的,包括ie6-9,甚至部分的手机浏览器也是不支持的。所以就出现了很多的兼容实现。我自己做了一个利用label模拟实现的代码,贴出来分享一下,欢迎拍砖。上代码。。。。

(function(_WIN){
    var PLACE = ‘placeholder‘,
        inputs = document.getElementsByTagName(‘input‘),
        body = document.getElementsByTagName(‘body‘)[0],
        domArr = [];
    //获取属性值
    function getStyle(element,attr){
        var result = null;
        if(element.currentStyle){
            result = element.currentStyle[attr];
        }
        // else if(window.getComputedStyle) {
        //     result = window.getComputedStyle(element,null)[attr];
        // }
        return result;
    }
    //设置属性
    function setStyle(tar,param){
        var val;
        if(Object.prototype.toString.call(param) === ‘[object Object]‘) {
            for(i in param){
                val = param[i];
                tar.style[i] = val;
            }
        }
    }
    //获取元素的绝对位置
    function getElementAbsPos(e) {  
        var offsetTop = e.offsetTop,
            offsetLeft = e.offsetLeft;  
        while(e = e.offsetParent) {  
            offsetTop += e.offsetTop;  
            offsetLeft += e.offsetLeft;  
        } 
        return {left:offsetLeft,top:offsetTop};  
    }
    //设置label
    function setLabel(tar,labelDom){
        var hei = getStyle(tar,‘height‘) || 0,
            wid = getStyle(tar,‘width‘) || 0, 
            paddingLeft = getStyle(tar,‘padding-left‘) || 0
            scrollHeight = document.body.scrollHeight,
            currentHei = parseFloat(getStyle(tar.parentNode,‘height‘)),
            tarPosition = getElementAbsPos(tar);

        setStyle(labelDom,{‘height‘:hei, ‘width‘:wid, ‘paddingLeft‘:paddingLeft, 
            ‘display‘:‘block‘, ‘position‘:‘absolute‘, ‘lineHeight‘:hei,
            ‘top‘:tarPosition.top + ‘px‘, ‘left‘:tarPosition.left + ‘px‘,
            ‘fontSize‘:‘14px‘, ‘color‘:‘#999‘});
    }
    //获取元素的属性
    function getAttr(target,property){
        var value = target.getAttribute(property);
        return value;
    }
    //绑定事件的公共方法
    function bindDomEvent(obj, evtType, handler) {
        var oldHandler;
        // if (obj.addEventListener) {
        //     obj.addEventListener(evtType, handler, false);
        // } else {
            evtType = evtType.toLowerCase();
            if (obj.attachEvent) {
                obj.attachEvent(‘on‘ + evtType, handler);
            } else {
                oldHandler = obj[‘on‘ + evtType];
                obj[‘on‘ + evtType] = function () {
                    if (oldHandler) {
                        oldHandler.apply(this, arguments);
                    }
                    return handler.apply(this, arguments);
                };
            }
        //}
    }
    //label的点击事件
    function clickFn(that,labelDom){
        bindDomEvent(labelDom,‘click‘,function(){
            setStyle(labelDom,{‘color‘:‘#ccc‘});
            //兼容ie7
            that.focus();
        });
    }
    //input的键盘事件
    function keydownFn(that,labelDom){
        bindDomEvent(that,‘keydown‘,function(){
            setStyle(labelDom,{‘color‘:‘#999‘, ‘display‘:‘none‘});
        });
    }
    //input的焦点事件
    function blurFn(that,labelDom){
        var result = null;
        bindDomEvent(that,‘blur‘,function(){
            if(that.value){
                result = ‘none‘;
            }else {
                result = ‘block‘;
            }
            setStyle(labelDom,{‘color‘:‘#999‘,‘display‘:result});
        });
    }
    //入口执行
    if(!(PLACE in document.createElement(‘input‘))){
        body.style.position = ‘relative‘;
        for(var z = 0, len = inputs.length; z < len; z++){
            var that = inputs[z];
            if(getAttr(that,‘data-placeholder‘)){
                var placeholderVal = getAttr(that,‘data-placeholder‘),
                    val = getAttr(that,PLACE) || ‘‘;
                if(placeholderVal){
                    var labelDom = document.createElement(‘label‘),
                        id = getAttr(that,‘id‘);
                    labelDom.className = ‘label‘ + z;
                    labelDom.setAttribute(‘for‘,id);
                    labelDom.innerHTML = val;
                    body.appendChild(labelDom);
                    //调用设置label
                    setLabel(that,labelDom);
                    //绑定事件
                    clickFn(that,labelDom);
                    keydownFn(that,labelDom);
                    blurFn(that,labelDom);
                }
            }
        }
    }
})(window);

这个方式可以兼容所有的浏览器,但是相应的会牺牲速度。

so提供另一种方式,利用事件。思路如下:

1.判断是否支持placeholder,如果支持的话,使用原生的;如果不支持的话,读取placeholder的值放入value里面,修改value的颜色。

2.当获取焦点的时候改变value颜色。

3.keydown的时候清除这个value,显示用户输入的,改变value的颜色。

4.失去焦点的时候判断输入是否有值,如果没有的话再把原来的placeholder的文字放回去。

注:这种方式如果type=password的话,就会显示。。。但是相比上面的方式,速度有提升。最主要的是,这种方式在绑定事件的时候要慎重。(如果input上面本来就有blur等事件,如果代码不是一个人独立管理等等)

 

placeholder兼容

标签:

原文地址:http://www.cnblogs.com/xizai/p/4302935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!