zoukankan      html  css  js  c++  java
  • frontend-Tips

      随时更新日常遇见的js小tip。

    Tip1:jquery 判断当前元素是否在动画中

      $(selector).is(":animated");

    Tip2:手机适配的方案

    (function(win,doc){
        var docEl = doc.documentElement;
        var appVersion = win.navigator.appVersion;
        var isAndroid = appVersion.match(/android/gi);
        var isIPhone = appVersion.match(/iphone/gi);
        var devicePixelRatio = win.devicePixelRatio;
        var dpr = 1,scale = 1;
    if (isIPhone) {
            if (devicePixelRatio >= 3) {
                dpr = 3;
            } else if (devicePixelRatio >= 2){
                dpr = 2;
            } else {
                dpr = 1;
            }
        } else {
            dpr = 1;
        }
        scale = 1 / dpr;
    var metaEl = doc.querySelector('meta[name="viewport"]');
        if(!metaEl){
            metaEl = doc.createElement('meta');
            metaEl.setAttribute('name', 'viewport');
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaEl);
            } else {
                var wrap = doc.createElement('div');
                wrap.appendChild(metaEl);
                doc.write(wrap.innerHTML);
            }
        }
        if(dpr != 1){
            metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
        }
        window.DPR = dpr;
    })(window,document);
    
     /*rem adaptation*/
    (function (doc, win) {
        var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth >= window.DPR * 540 ? window.DPR * 540 : docEl.clientWidth;
                    if (!clientWidth) return;
                    docEl.style.fontSize = 10*(clientWidth / 320) + 'px';
                    docEl.style.maxWidth = clientWidth + 'px';
                };
        recalc();
        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
    })(document, window);

    上面一个函数是根据不同设备的不同的dpr显示不同倍数的viewport。

    第二个函数是将屏幕width均分为32份,然后计算出每份的宽度作为rem的根宽度。整个页面的width为32rem,采用rem布局。

    3.溢出显示为省略号

    text-overflow: ellipsis;
        white-space: nowrap;/*禁止自动换行*/
        overflow: hidden;

    //多行文本溢出省略
    1. overflow : hidden;
    2. text-overflow: ellipsis;
    3. display: -webkit-box;
    4. -webkit-line-clamp: 2;
    5. -webkit-box-orient: vertical;
     

     4.返回顶部效果

    $(window).scroll(function(){
    
      if($('html,body').scrollTop>1000){
       $("#top").fadeIn();//滚动条高度超过1000,显示返回top按钮 
    } 
    })
    //点击返回顶部 $(
    '#top).click(function(){ $('html,body').animate({scrollTop:0},500) })

     5.多行文本溢出显示省略号

      参考文章:  http://c7sky.com/text-overflow-ellipsis-on-multiline-text.html

    6.js刷新当前页面

      window.location.reload();或 window.location = "";

    7.团抢购多个商品倒计时

    var countDownLength = $('.test').length;

    var countVal = 0;
    var tempTime = new Date($('#curTime').val().replace(/-/ig,'/')).getTime();
    var sec;
    $('.test').each(function(i){
    var $this = $(this);
    count_down($this.html(),i)
    });
    function count_down(o,j){
    var www_qsyz_net=/^[d]{4}-[d]{1,2}-[d]{1,2}( [d]{1,2}:[d]{1,2}(:[d]{1,2})?)?$/ig,str='',conn,s;
    if(!o.match(www_qsyz_net)){
    return false;
    }
    if(countVal%countDownLength == 0&&countVal > 0){
    tempTime+=1000;
    }
    countVal++;
    sec=(new Date(o.replace(/-/ig,'/')).getTime() - tempTime)/1000;
    console.log(sec);
    if(sec > 0){
    conn='还有';
    }else{
    conn='已过去';
    sec*=-1;
    }
    s={'天':sec/24/3600,'小时':sec/3600%24,'分':sec/60%60,'秒':sec%60};
    for(i in s){
    if(Math.floor(s[i])>0 ) str += Math.floor(s[i]) + i;
    }
    if(Math.floor(sec)==0){ str='0秒'; }
    $('.time').eq(j).html(o + conn + str) ;
    setTimeout(function(){count_down(o,j)},1000);
    }

    8.jquery 获取url中的数据

    //获取url中的参数
    function getUrlParam(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
    var r = window.location.search.substr(1).match(reg); //匹配目标参数
    if (r != null) return unescape(r[2]); return null; //返回参数值
    }

     9.遮罩层一般用position:fixed制作 js获取window 高度

    10.浏览器 返回 

     javascript:location.href=document.referrer   window.history.go(-1) window.history.back()
     

    11.css动画执行完成后回调函数

    $("#mydiv").on('webkitAnimationEnd',myStartFunction)

    12. $("#id").is(":checked") 判断复选框是否选中

    使用 jquery .attr('checked','checked') 或者 .attr('checked','true') 点击选中后再取消选中后 不能再选中的方法 

    $("#yesOrNo").each(function(){
        this.checked=true;
    });

    13.input type tel ajax请求时报错 说不能识别 selection ,chrome版本问题 解决方法 用对象重新组织数据

    var jsonObj1 = {};
    jsonObj1.aid = $("#aid").val();
    jsonObj1.mobile = $("#inputMobile").val();

    $(“input[name='radio_name']:checked”).val()

    14. iframe元素获取

    在iframe子页面获取父页面元素
    代码如下:
    $.('#objld', parent.document); 
    在父页面获取iframe子页面的元素
    代码如下:
    $("#objid", document.iframes('iframe').document) 

    代码如下:
    $(document.getElementById('iframeId').contentWindow.document.body).html() $(document.getElementById('iframeId').contentWindow.document.body).html()

    15. radio值获取

    $("input[name='radio_name']:checked").val();  //选择被选中Radio的Value值

    $("input[name='radio_name'][checked]").val();  //选择被选中Radio的Value值

    16. js数组复制

    二、 使用slice()

    可使用slice()进行复制,因为slice()返回也是数组。

    var array1 = new Array("1","2","3"); 
    var array2; 
    array2 = array1.slice(0); 
    array1.length = 0; 
    alert(array2); //返回1、2、3 

    三、 使用concat()

    注意concat()返回的并不是调用函数的Array,而是一个新的Array,所以可以利用这一点进行复制。

    var array1 = new Array("1","2","3"); 
    var array2; 
    array2 = array1.concat(); 
    array1.length = 0; 
    alert(array2); //返回1、2、3 

    17. iphone document.title设置无效hack

    var $body = $('body');
    document.title = res.data.actiTitle;
    // hack在微信等webview中无法修改document.title的情况
    var $iframe = $('<iframe src="/favicon.ico"></iframe>');
    $iframe.on('load',function() {
    setTimeout(function() {
    $iframe.off('load').remove();
    }, 0);
    }).appendTo($body);

    18.多行文本溢出隐藏
    overflow : hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    19.图片尺寸
    var img = new Image();
    img.src = constains.basePath + data.url;
    img.onload = function() {
    if( (img.width/img.height)>0.666){ //宽高比 大于2/3
    var imgTop = (img.height/img.width*80-120)/2;
    $(root).find("img").css({'width':80+'px','height':'auto','top':-imgTop+'px','left':0});
    }else{ //过高
    var imgLeft = (img.width/img.height*120-80)/2;
    $(root).find("img").css({'height':120+'px','width':'auto','top':0,'left':-imgLeft+'px'});
    }
    };
    20.子元素非最后一个的after
    .fx-traf-detail .swiper-slide:not(:last-child):after

    21.touch事件
    var isTouch = 'ontouchstart' in window,
    events = {
    start: isTouch ? 'touchstart' : 'mousedown',
    move: isTouch ? 'touchmove' : 'mousemove',
    end: isTouch ? 'touchend' : 'mouseup'
    };
    event-bind
    _this.canvas.addEventListener(events.start, function (e) {
    _this.start(e);
    }, false);

    22.swiper 移动端 使用ontap  

      移动端调用相机

    <input type="file" accept="image/*;" capture="camera" >
    移动端调用电话
    href="tel:13888888"

    23.iphone移动端点击元素出现黑灰色背景

    -webkit-tap-highlight-color:rgba(0,0,0,0);

    24.body设置背景 在全屏模式下底部有白条

    html,body{height:100%;}
    
    

    25.opacity导致内部元素也有透明度

      使用rgba格式设置透明

     

    26.多列等高布局 table table-cell

    27.Img 加载完成判断以及回调

    function getImage(url,callback){
        var img = new Image();
        img.src = url;
        
        // 如果图片被缓存,则直接返回缓存数据
        if(img.complete){
            callback(img.width, img.height);
        }else{
                    // 完全加载完毕的事件
                img.onload = function(){
                callback(img.width, img.height);
                }
            }
    }

    28.动态加载

     
    //动态加载函数
    function loadJS(url, success) {
        var domScript = document.createElement('script');
        domScript.src = url;
        success = success || function(){};
        domScript.onload = domScript.onreadystatechange = function() {
            if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
                success();
                this.onload = this.onreadystatechange = null;
                this.parentNode.removeChild(this);
            }
        };
        document.getElementsByTagName('head')[0].appendChild(domScript);
    }
    用法:
    var loadMapResource = false;
    function loadMapScript(){
        if(!loadMapResource){
            loadJS('/page/activity/js/baidu-map.js',function (){
                loadJS('/page/activity/js/activityMarker.js',function (){
                    addMarkers();
                    loadMapResource = true;
                });
            });
        }else{
            addMarkers();
        }
    
    }

    28、更快的字符串相加方式

    很多人误以为数组 push 方法拼接字符串会比 += 快,要知道这仅仅是 IE6-8 的浏览器下。实测表明现代浏览器使用 += 会比数组 push 方法快,而在 v8 引擎中,使用 += 方式比数组拼接快 4.7 倍。所以 artTemplate 根据 javascript 引擎特性采用了两种不同的字符串拼接方式。

    29。 table 多栏 自适应布局

      table 设置 table-layout:fixed  对固定宽度列设置 width = 200 ;自适应宽度列设置 width = "50%",数字可变

     30.js获取scale rotate等,以及通过cssText设置样式

    var el = document.getElementById("divTransform");
    var st = window.getComputedStyle(el, null);
    var tr = st.getPropertyValue("-webkit-transform") ||
        st.getPropertyValue("-moz-transform") ||
        st.getPropertyValue("-ms-transform") ||
        st.getPropertyValue("-o-transform") ||
        st.getPropertyValue("transform") ||
        "FAIL";
    
    // With rotate(30deg)...
    // matrix(0.866025, 0.5, -0.5, 0.866025, 0px, 0px)
    console.log('Matrix: ' + tr);
    
    // rotation matrix - http://en.wikipedia.org/wiki/Rotation_matrix
    
    var values = tr.split('(')[1].split(')')[0].split(',');
    var a = values[0];
    var b = values[1];
    var c = values[2];
    var d = values[3];
    
    var scale = Math.sqrt(a * a + b * b);
    
    console.log('Scale: ' + scale);
    
    // arc sin, convert from radians to degrees, round
    var sin = b / scale;
    // next line works for 30deg but not 130deg (returns 50);
    // var angle = Math.round(Math.asin(sin) * (180/Math.PI));
    var angle = Math.round(Math.atan2(b, a) * (180 / Math.PI));
    
    console.log('Rotate: ' + angle + 'deg');

     31.修改或者添加url参数

    /* 
    * url 目标url 
    * arg 需要替换的参数名称 
    * arg_val 替换后的参数的值 
    * return url 参数替换后的url 
    */ 
    function changeURLArg(url,arg,arg_val){ 
        var pattern=arg+'=([^&]*)'; 
        var replaceText=arg+'='+arg_val; 
        if(url.match(pattern)){ 
            var tmp='/('+ arg+'=)([^&]*)/gi'; 
            tmp=url.replace(eval(tmp),replaceText); 
            return tmp; 
        }else{ 
            if(url.match('[?]')){ 
                return url+'&'+replaceText; 
            }else{ 
                return url+'?'+replaceText; 
            } 
        } 
        return url+'
    '+arg+'
    '+arg_val; 
    } 

    changeURLArg('http://www.daimajiayuan.com/test.php?class_id=3&id=2','class_id',4);

     结果为http://www.daimajiayuan.com/test.php?class_id=4&id=2

    changeURLArg('http://www.daimajiayuan.com/test.php','class_id',4);

    结果为http://www.daimajiayuan.com/test.php?class_id=4

     32.获取服务器时间

    function getServeTime(pageData) {
        var xhr = new window.XMLHttpRequest();
        xhr.open("get", "/?time="+Math.random());
        xhr.send(null);
        xhr.onreadystatechange = function() {
            var time = null,
                curDate = null;
            if (xhr.readyState === 2) {
                // 获取响应头里的时间戳 
                time = xhr.getResponseHeader("Date");
                curDate = new Date(time);
                getTimeDistance(pageData, curDate)
            }
        }
    
    }

    33. 中文正则表达式

    /^([u4e00-u9fa5]|[u3002|uff1f|uff01|uff0c|u3001|uff1b|uff1a|u201c|u201d|u2018|u2019|uff08|uff09|u300a|u300b|u3008|u3009|u3010|u3011|u300e|u300f|u300c|u300d|ufe43|ufe44|u3014|u3015|u2026|u2014|uff5e|ufe4f|uffe5|u0020]){0,}$/.test('')

    34. 英文正则表达式

    /^([A-Za-z]|[x21-x2fx3a-x40x5b-x60x7B-x7F]){0,}$/
    
    
  • 相关阅读:
    @import的最优写法
    IE7 下hack的方法
    在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
    MySQL 依赖另外一个统计出来数据更新表数据的范例
    PHP的bool值
    Ubuntu 下如何配置Jira
    ubuntu 访问Windows的共享
    备份 mysql数据
    ubuntu从中文切换成英文的方法
    css锚点定位偏移原理兼容浏览器
  • 原文地址:https://www.cnblogs.com/patrickxy/p/4958525.html
Copyright © 2011-2022 走看看