欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

心得体会

程序员文章站 2022-03-02 14:58:01
...

1. 匿名函数自执行

var x = 1;
(function(){
     console.log(x);
     x += 1;
     return x
})();
console.log(x);

这个匿名函数就是「内部函数」,「外部函数」就是全局作用域从而形成闭包。
=>自定义函数,均可访问window对象中的变量。

2. 解决Android手机端点击input弹出键盘遮盖问题:

Ios端下虚拟键盘与window不在一个层面,但在Android下会形成遮盖情况,思路是当浏览器高度变化时使fixed层的div变为relative/static.

// 下载层处理
    var xx = 0;
    $(window).on('resize', function() {
        if(xx == 0){
            $('.banner').css('position','relative');
            xx = 1;
        }else {
            $('.banner').css('position','fixed');
            xx = 0;
        }
    });

3. web端页面跳转 App store/App

页面布局结构:

<div class="banner">
    <img src="../img/activity/new_user2.png" />
    <div class="downLoad" onclick="download()">
        <a id="CallApp" href="javascript:void(0);">下载APP</a>
        <input id="DownloadApp" type="hidden" value="http://web.3pzs.com/app_update1/android5.apk">
        <input id="DownloadApp2" type="hidden" value="https://itunes.apple.com/us/app/shan-pin-zhai-song/id1165264474?l=zh&ls=1&mt=8">
    </div>
</div>

其中两个input的value值为Ios,Android两端的通用链接(universal link),创建iframe跳转。
ps: 这里设置了一个延迟显示,1.5s后不管手机是否有App,均跳转到App store 页面。

以下点击下载按钮的方法:

// 触发事件
function download() {
    $('.confirm-btn').on('click', function() {
        // 判断是ios,还是Android
        if(ua.indexOf('os') > 0) {
            window.location = config.download_url2;
        } else {
            window.location = config.download_url;
        }
    });

    var ua = navigator.userAgent.toLowerCase(); 
    $('#CallApp').attr('href', 'spzjs://');
    // 设置时间变量
    var t;
    // 命名空间config
    config = {
        /*scheme:必须,通配头由ios,Andriod提供*/
        scheme: 'spzjs://',
        download_url: document.getElementById('DownloadApp').value,
        download_url2: document.getElementById('DownloadApp2').value,
        // 时间间隔
        timeout: 1500
    };

    // 打开客户端方法
    function openclient() {
        var startTime = Date.now();
        var ifr = document.createElement('iframe');

        ifr.src = config.scheme;
        ifr.style.display = 'none';
        document.body.appendChild(ifr);
        var t = setTimeout(function() {
            var endTime = Date.now();

            if(!startTime || endTime - startTime < config.timeout + 200) {
                $('.shade').fadeIn(300);
                $('.login-block').hide();
                $('.input-modal').fadeIn(300);

            }
        }, config.timeout);

        window.onblur = function() {
            clearTimeout(t);
        }
    }

    openclient();
}

4. js Tips

1.两个obj是否全等:
(1)
if(JSON.stringify(ObjA) == JSON.stringify(ObjB)){
    console.log('全等!')
}
(2)
function isEqual(obj1, obj2){  
    if(isEqual.result === undefined){  
        isEqual.result = false;  
    }  
    if(obj1 === obj2){  
       return true;  
    }  
    for(var i in obj1){  
        if(i in obj2){  
            //如果是对象,那么递归  
            if(isObject(obj1[i])){  
                isEqual.result = false;  
                isEqual(obj1[i], obj2[i]);  
            }else{  
                //如果为null或undefined 将不具备 toString方法  
                if(obj1[i] !== null && obj2[i] !== null && obj1[i] !== undefined && obj2[i] !== undefined){  
                    if(obj1[i].toString() !== obj2[i].toString()){  
                //转换为字符串判断是否全等。  
                        isEqual.result = false;  
                    }else{  
                        isEqual.result = true;  
                    }  
                }else{  
                    if(obj1[i] === obj2[i]){  
                        isEqual.result = true;  
                    }else{  
                        isEqual.result = false;  
                    }  
                }  
            }  
        }else{  
            isEqual.result = false;  
        }  
    }  
   return isEqual.result;  
}  
2. 两个以上的input,点击其中一个有删除按钮,点击另一个之前消失,当前有:

    $('.input-district-row input').on('input focus', function() {
        if($(this).val() != '') {
            $(this).next().show();
        } else {
            $(this).next().hide();
        }
        $(this).parents().siblings().find('.search-clear').hide()      
    });
3.禁止拖动
    $('body').on('touchmove', function(e) {
        e.preventDefault()
    });

5. input 与 span 高度不相等的问题

  1. 将他们都设置为: float: 'left'; 然后固定高度,但安卓手机会出现1px的误差问题, 此时解决办法是将input的高度设置为0, padding设置为原来高度的一半。

  2. 亦或清除换行的影响解决这个问题:

<input>
<span>

改为

<input
><span>

6. echo.js 图片预加载

基本思路是找到元素的相对与视口的位置,如果在的话直接将src变为data-echo里的数据加载,不在的话增加滚动监听事件,到达视口的时候加载。 (ps: 如果是异步加载出来的图片应该在回调函数的最后进行init())

        function(root) {
            // 命名空间export
            var exports = {};
            var callback = function() {};
            var offset, poll, throttle, unload;
            var inView = function(element, view) {
                // getBoundingClientRect 获得页面中元素的左,上,右和下分别相对浏览器视窗的位置。
                var box = element.getBoundingClientRect();
                return(box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
            };
            var debounce = function() {
                clearTimeout(poll);
                poll = setTimeout(exports.render, throttle);
            };
            // 初始化
            exports.init = function(opts) {
                opts = opts || {};
                var offsetAll = opts.offset || 0;
                var offsetVertical = opts.offsetVertical || offsetAll;
                var offsetHorizontal = opts.offsetHorizontal || offsetAll;
                var optionToInt = function(opt, fallback) {
                    return parseInt(opt || fallback, 10);
                };
                offset = {
                    t: optionToInt(opts.offsetTop, offsetVertical),
                    b: optionToInt(opts.offsetBottom, offsetVertical),
                    l: optionToInt(opts.offsetLeft, offsetHorizontal),
                    r: optionToInt(opts.offsetRight, offsetHorizontal)
                };
                // 延迟
                throttle = optionToInt(opts.throttle, 250);
                unload = !!opts.unload;
                callback = opts.callback || callback;
                exports.render();
                // 事件监听
                if(document.addEventListener) {
                    root.addEventListener('load', debounce, false);
                    root.addEventListener('scroll', debounce, false);
                } 
                // 兼容ie的attachEvent
                else {
                    root.attachEvent('onload', debounce);
                    root.attachEvent('onscroll', debounce);
                }
            };
            // 渲染
            exports.render = function() {
                var nodes = document.querySelectorAll('img[data-echo]');
                var length = nodes.length;
                var src, elem;
                var view = {
                    l: 0 - offset.l,
                    t: 0 - offset.t,
                    b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
                    r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
                };
                for(var i = 0; i < length; i++) {
                    elem = nodes[i];
                    // 在视口
                    if(inView(elem, view)) {
                        // 未加载
                        if(unload) {
                            elem.setAttribute('data-echo-placeholder', elem.src);
                        }
                        elem.src = elem.getAttribute('data-echo');
                        // 已加载
                        if(!unload) {
                            elem.removeAttribute('data-echo');
                        }
                        callback(elem, 'load');
                    }
                    // 不在视口
                    else if(unload && !!(src = elem.getAttribute('data-echo-placeholder'))) {
                        elem.src = src;
                        elem.removeAttribute('data-echo-placeholder');
                        callback(elem, 'unload');
                    }
                }
                if(!length) {
                    exports.detach();
                }
            };
            // 取消事件触发
            exports.detach = function() {
                if(document.removeEventListener) {
                    root.removeEventListener('scroll', debounce);
                } else {
                    root.detachEvent('onscroll', debounce);
                }
                clearTimeout(poll);
            };
            return exports;
        }