zoukankan      html  css  js  c++  java
  • jQuery效果之封装模拟placeholder效果,让低版本浏览器也支持

    页面中的输入框默认的提示文字一般使用placeholder属性就可以了,即:

    <input type="text" name="username" placeholder="请输入用户名" value="" id="username"/>

    最多加点样式控制下默认文字的颜色

    input::-webkit-input-placeholder{color:#AAAAAA;}

    但是在低版本的浏览器却不支持这个placeholder属性,那么真的要在低版本浏览器也要实现跟placeholder一样的效果,就需要写个插件来兼容下,下面就细讲一下怎样用jquery来实现这个模拟效果。

    实现这个模拟效果,页面的一般调用方式:

    $('input').placeholder();

    首先,先写jquery插件的一般结构:

    ;(function($){
        $.fn.placeholder = function(){
            //实现placeholder的代码
        }
    })(jQuery)

    下面我们就要判断浏览器是否支持placeholder属性

    ;(function($){
        $.fn.placeholder = function(){
    
            this.each(function(){
                var _this = this;
                var supportPlaceholder = 'placeholder' in document.createElement('input');
                if(!supportPlaceholder){
                    //不支持placeholder属性的操作
    
                }
            });
        }
    })(jQuery)

    我们要支持链式操作,如下:

    ;(function($){
        $.fn.placeholder = function(){
    
             return this.each(function(){
                var _this = this;
                var supportPlaceholder = 'placeholder' in document.createElement('input');
                if(!supportPlaceholder){
                    //不支持placeholder属性的操作
    
                }
            });
        }
    })(jQuery)

    默认配置项:

    options = $.extend({
        placeholderColor:'#aaaaaa',
        isSpan:false, //是否使用插入span标签模拟placeholder的方式,默认是不需要
        onInput:true //实时监听输入框
    },options);

    如果不需要通过span来模拟placeholder效果,那么就需要通过输入框的value值来判断,如下代码:

    if(!options.isSpan){
        $(_this).focus(function () {
            var pattern = new RegExp("^" + defaultValue + "$|^$");
            pattern.test($(_this).val()) && $(_this).val('').css('color', defaultColor);
        }).blur(function () {
            if($(_this).val() == defaultValue) {
                $(_this).css('color', defaultColor);
            }
            else if($(_this).val().length == 0) {
                $(_this).val(defaultValue).css('color', options.placeholderColor)
            }
        }).trigger('blur');
    }

    如果需要同span标签来模拟placeholder效果,代码如下:

    var $simulationSpan = $('<span class="wrap-placeholder">'+defaultValue+'</span>');
    $simulationSpan.css({
        'position':'absolute',
        'display':'inline-block',
        'overflow':'hidden',
        'width':$(_this).outerWidth(),
        'height':$(_this).outerHeight(),
        'color':options.placeholderColor,
        'margin-left':$(_this).css('margin-left'),
        'margin-top':$(_this).css('margin-top'),
        'padding-left':parseInt($(_this).css('padding-left')) + 2 + 'px',
        'padding-top':_this.nodeName.toLowerCase() == 'textarea' ? parseInt($(_this).css('padding-top')) + 2 : 0,
        'line-height':_this.nodeName.toLowerCase() == 'textarea' ? $(_this).css('line-weight') : $(_this).outerHeight() + 'px',
        'font-size':$(_this).css('font-size'),
        'font-family':$(_this).css('font-family'),
        'font-weight':$(_this).css('font-weight')
    });
    
    //通过before把当前$simulationSpan添加到$(_this)前面,并让$(_this)聚焦
    $(_this).before($simulationSpan.click(function () {
        $(_this).trigger('focus');
    }));
    
    //当前输入框聚焦文本内容不为空时,模拟span隐藏
    $(_this).val().length != 0 && $simulationSpan.hide();
    
    if (options.onInput) {
        //绑定oninput/onpropertychange事件
        var inputChangeEvent = typeof(_this.oninput) == 'object' ? 'input' : 'propertychange';
        $(_this).bind(inputChangeEvent, function () {
            $simulationSpan[0].style.display = $(_this).val().length != 0 ? 'none' : 'inline-block';
        });
    }else {
        $(_this).focus(function () {
            $simulationSpan.hide();
        }).blur(function () {
            /^$/.test($(_this).val()) && $simulationSpan.show();
        });
    };

    整体代码:

    ;(function($){
        $.fn.placeholder = function(options){
            options = $.extend({
                placeholderColor:'#aaaaaa',
                isSpan:false, //是否使用插入span标签模拟placeholder的方式,默认是不需要
                onInput:true //实时监听输入框
            },options);
    
             return this.each(function(){
                var _this = this;
                var supportPlaceholder = 'placeholder' in document.createElement('input');
                if(!supportPlaceholder){
                    //不支持placeholder属性的操作
                    var defaultValue = $(_this).attr('placeholder');
                    var defaultColor = $(_this).css('color');
                    if(!options.isSpan){
                        $(_this).focus(function () {
                            var pattern = new RegExp("^" + defaultValue + "$|^$");
                            pattern.test($(_this).val()) && $(_this).val('').css('color', defaultColor);
                        }).blur(function () {
                            if($(_this).val() == defaultValue) {
                                $(_this).css('color', defaultColor);
                            }
                            else if($(_this).val().length == 0) {
                                $(_this).val(defaultValue).css('color', options.placeholderColor)
                            }
                        }).trigger('blur');
                    }else{
                        var $simulationSpan = $('<span class="wrap-placeholder">'+defaultValue+'</span>');
                        $simulationSpan.css({
                            'position':'absolute',
                            'display':'inline-block',
                            'overflow':'hidden',
                            'width':$(_this).outerWidth(),
                            'height':$(_this).outerHeight(),
                            'color':options.placeholderColor,
                            'margin-left':$(_this).css('margin-left'),
                            'margin-top':$(_this).css('margin-top'),
                            'padding-left':parseInt($(_this).css('padding-left')) + 2 + 'px',
                            'padding-top':_this.nodeName.toLowerCase() == 'textarea' ? parseInt($(_this).css('padding-top')) + 2 : 0,
                            'line-height':_this.nodeName.toLowerCase() == 'textarea' ? $(_this).css('line-weight') : $(_this).outerHeight() + 'px',
                            'font-size':$(_this).css('font-size'),
                            'font-family':$(_this).css('font-family'),
                            'font-weight':$(_this).css('font-weight')
                        });
    
                        //通过before把当前$simulationSpan添加到$(_this)前面,并让$(_this)聚焦
                        $(_this).before($simulationSpan.click(function () {
                            $(_this).trigger('focus');
                        }));
    
                        //当前输入框聚焦文本内容不为空时,模拟span隐藏
                        $(_this).val().length != 0 && $simulationSpan.hide();
    
                        if (options.onInput) {
                            //绑定oninput/onpropertychange事件
                            var inputChangeEvent = typeof(_this.oninput) == 'object' ? 'input' : 'propertychange';
                            $(_this).bind(inputChangeEvent, function () {
                                $simulationSpan[0].style.display = $(_this).val().length != 0 ? 'none' : 'inline-block';
                            });
                        }else {
                            $(_this).focus(function () {
                                $simulationSpan.hide();
                            }).blur(function () {
                                /^$/.test($(_this).val()) && $simulationSpan.show();
                            });
                        };
                    }
                }
            });
        }
    })(jQuery);

    调用方式,需要通过span标签来模拟的话:

    $("#username").placeholder({
        isSpan:true
    });
  • 相关阅读:
    面试官问我:记录存在就更新,不存在就插入有啥思路怎么办?愣着干嘛?进来白嫖啊! (上)
    面试官问我:char和varchar的区别 怎么办?愣着干嘛?进来白嫖啊!
    面试官竟然疯狂问我数据库的组提交?怎么办?愣着干嘛?进来白嫖呀!
    面试官疯狂问我联表查询怎么办? 愣着干嘛?进来白嫖啊!
    面试官狂问我各种锁怎么办?愣着干嘛?进来白嫖啊!
    面试被问:如何排查慢查询(执行计划)怎么办?愣着干嘛?进来白嫖呀!
    B站挂了之后出现的tengine是个啥?
    Python
    Python
    Python
  • 原文地址:https://www.cnblogs.com/moqiutao/p/7133755.html
Copyright © 2011-2022 走看看