jQuery编程实践总结(二)

本文主要汇总自己收集与总结的一些jquery代码片段与心得体会,与大家分享,如果有错误,请轻拍砖~

  1. 返回顶部按钮
    // Back to top
    $('.top').click(function(e){
    e.preventDefault();
    $('html,body').animate({scrollTop:0});
    });
    Note:再加这段代码的时候,可以先判断滚轮划过屏幕多少才显示处返回Top的按钮,比如知乎上面的文章就是如此,还可以通过设置scrollTop来达到你想要滚动到的地方,让animate自己计算动画时间。
  2. 使用jQuery插件Preload Images
    用途:当你的页面需要加载很多图片的时候,比如外观360车图,一般至少需要36张图片,还有瀑布流需要大量的图片加载,这个时间通过插件可以将这些图片预加载或者点击的时候在预加载,提高网站访问速度,适用场景自己用后体验。
    $.preloadImages = function(){
    for(var i = 0; i < arguments,length; i++){
    $('').attr('src', arguments[i]);
    }
    };
    $.preloadImages('images/1.jpg','images/2.jpg',...);
    //这块可以将arguments转换成数组传进去:
    var srcList = [
    'images1.jpg',
    ''...
    ]
  3. 判断图片是否加载成功
    $('img').load(function(){
    console.log('image load successful!');
    })
    Note:注意 console在ie8下不识别,会报错哦.
  4. 给图片加上error事件,当图片破碎替换成其他的图片,不至于太难看
    $('img').on('error', function(){
    if(!$(this).hasClass('broken-image') ){
    $(this).prop('src', 'omg/broken.png').addClass('broken-image');
    }
    });
  5. 使用Toggle,在hover的时候增加class,鼠标移出后删除class
    应用场景一般是给当前的对象加css动画的class
    $('.btn').hover(function(){
    $(this).addClass('active');
    }, function(){
    $(this).removeClass('active');
    })
    //简写:
    $('.btn').hover(function(){
    $(this).toggleClass('active');
    })
    Note:当然css也是可以解决的,不过这样做在很多时候还是有优势的.
  6. 禁用文本框
    $('input[type="submit"]').prop('disabled', true);
  7. 使用:selected选择器来获取option的值,并且其只适用于
    $('select option:selected').val();
    Note:这里提到主要是为了避免和其他几个表单取值混淆了.
  8. 阻止a标签跳转
    $('a.no-link').click(function(e){
    e.preventDefault();
    })
  9. 类似于5一样,使用fadeToggle和slideToggle
    // Fade
    $('.btn').click(function () {
    $('.element').fadeToggle('slow');
    });
    // Toggle
    $('.btn').click(function () {
    $('.element').slideToggle('slow');
    });
  10. 手风琴效果
    //close all panels
    $('#accordion').find('.content'.hide();
    //Accordion
    $('#accordion').find('.accordion-header').click(function(){
    var $next = $(this).next();
    $next.slideToggle('fast');
    $('.content').not($next).slideUp('fast');
    return false;
    });
  11. 使两个div的高度相等
    var $columns = $('.column');
    var height = 0;
    $columns.each(function(){
    if($(this).height() > height){
    height = $(this).height();
    }
    });
    $columns.height(height);
    //当然,我们也可以使用css来解决,更方便,比如我们要使右侧的列始终与左侧相等,可以这样搞;
    .box { overflow: hidden;} //这个是父级
    .box .aside { padding-bottom: 2000px; margin-bottom:-2000px;}//侧栏
    //这样侧栏aside会始终与左侧等高,其中说明的这些属性是必须属性。
  12. 查找文本元素
    利用contains()选择器,你可以找到一个元素的文本内容,如果元素的文本是不存在,则将不存在文本的元素隐藏
    var search = $('.search').val();
    $('div:not(:contains("'+search+'"))').hide();
    Note:应用场景暂时还没有想到
  13. 可见标签的触发事件
    当用户切换浏览器选项卡的时候会触发javascript
    $(document).on('visibilitychange', function(e){
    if(e.target.visibilityState=== 'visible'){
    console.log("是当前标签");
    }else if( e.target.visibilityState === 'hidden' ){
    console.log('当前页面被隐藏');
    }
    });

Note:这里解释一下,visibilitychange是html5新增的属性,主要用来判断是否在当前tab下,document.hidden属性,它显示页面是否为用户当前观看的页面,值为ture或false;visibilityState的值要么是visible(表明页面为浏览器当前激活tab,而且窗口不是最小化状态),要么是hidden(页面不是当前激活tab页面,或者窗口最小化了。),或者prerender(页面在重新生成,对用户不可见。)

应用场景:

什么时候需要使用visibilitychange事件呢?比如,如果你的页面上有嵌入视频正在播放,当用户切换到其它标签页时,你的标签页上的视频应自动暂停播放,当用户切换回来时继续接着播放。再比如,如果你的页面有自动刷新动作,当用户切换到其它标签页时,你就应该停止刷新,而当用户切换回来时继续之前的动作。

  1. 定义全局的Ajax请求错误处理函数,捕捉ajax请求错误
    $(document).ajaxError(function(e,xhr,setting,error){
    console.log('error')
    });
  2. 反序访问jQuery对象的元素
    在某些场景下,我们可能需要反序访问通过JQuery选择器获取到的页面元素对象,这个怎么实现呢?
    var arr = $(.nav'').find('li').get().reverse();
    arr. each(function(elem,index){
    //code
    });
  3. 访问iFrame里面的元素
    var $iframe = $('iframe#id').contents();
  4. 管理搜索框的值
    $('#search')
    .focus(function(){
    $(this).val(' ');
    }).blur(function(){
    $(this).val() == ''?$(this).val('请输入值') : null;
    });
    Note:当然这种方式比较low了,我们现在都可以通过html5新增的placeholder属性来设置,这种设置特别方便,不过如果你是需要兼容到低版本的话,比如ie那就得用js咯~
  5. 部分页面加载更新
    setInterval(function(){
    $('.content').load(url);
    });
  6. 采用data来缓存数据
    var cache = {};
    $.data(cache, 'key', 'value');
    Note:当然如果比如说你做轮播图,用到插件一般需要新建对象,比如说在videojs里面,你将视频做成tab选项卡这种的时候,点击这个视频另一个需要暂停,就需要将其对象存储起来,我们一般用data存储,很方便
  7. 使jquery与其他库兼容的方法
    //第一种
    var $j = jQuery.noConflict();
    $j('#id')...
    //第二种,推荐使用的方式
    (function($){
    $(function(){
    //code..
    })
    })(jQuery);
  8. 根据屏幕尺寸自适应的遮罩层
    $('.overlay').css({
    width: $(window).width(),
    height: $(window).height()
    });
    $(window).on('resize', function(){
    var $w = $(window).width();
    var $h = $(window).height();
    $('.overlay').css({
    width: $w,
    height: $h
    });
    });
  9. 测试密码的强度
    在某些网站注册时常常会要求设置密码,网站也会根据输入密码的字符特点给出相应的提示,如密码过短、强度差、强度中等、强度强等。这又是怎么实现的呢?


    //下面的正则表达式建议各位收藏哦,项目上有可能会用得着
    $('#pass').keyup(function(e) {
    //密码为八位及以上并且字母数字特殊字符三项都包括
    var strongRegex = new RegExp("^(?=.{8,})(?=.[A-Z])(?=.[a-z])(?=.[0-9])(?=.\W).$", "g");
    //密码为七位及以上并且字母、数字、特殊字符三项中有两项,强度是中等
    var mediumRegex = new RegExp("^(?=.{7,})(((?=.
    [A-Z])(?=.[a-z]))|((?=.[A-Z])(?=.[0-9]))|((?=.[a-z])(?=.[0-9]))).$", "g");
    var enoughRegex = new RegExp("(?=.{6,}).*", "g");
    if (false == enoughRegex.test($(this).val())) {
    $('#passstrength').html('More Characters');
    } else if (strongRegex.test($(this).val())) {
    $('#passstrength').className = 'ok'; $('#passstrength').html('Strong!');
    } else if (mediumRegex.test($(this).val())) {
    $('#passstrength').className = 'alert';
    $('#passstrength').html('Medium!');
    } else {
    $('#passstrength').className = 'error';
    $('#passstrength').html('Weak!'); }
    return true;
    });
  10. 定时触发resize,scroll等事件
    类似resize,scroll这种事件当滚轮滑动或者页面尺寸在变化,每一个像素都会触发一下,所以导致很多时候会出现问题,所以一般我们会加定时器来解决
    var status;
    $(window).on('resize', function(){
    if(status){
    clearTimeout(status);
    }
    status = setTimeout(function(){
    //code...
    }, 500);
    });
    Note:其实思路很简单:可以分为两次,第一次调用是不存在status的,所以会执行下面的;第二次的时候会先干掉第一次执行的,这样,每次调用的时候会先等待500ms然后执行里面的代码,然后如果用户过快的刷新,会清除上次的定时器;还有另一种方式是通过开关来控制的,先在外面定义一个开关flag=false;然后在里面判断满足条件后,再判断flag==false,如果是现将flag=true,然后执行代码,完毕后将flag=false;
  11. 鼠标滑动加载到一定位置后自动加载更多的判断
    //第一种方式
    $(window).scrollTop()+$(window).height())+250)>=$(document).height();
    //第二种方式,$addMore是加载更多按钮
    $addMore.offset().top - $(window).scrollTop() < $(window).height();
  12. 使用jQuery重绘图片
    $(window).bind("load", function() {
    // IMAGE RESIZE
    $('#product_cat_list img').each(function() {
    var maxWidth = 120;
    var maxHeight = 120;
    var ratio = 0;
    var width = $(this).width();
    var height = $(this).height();
    if(width > maxWidth){
    ratio = maxWidth / width;
    $(this).css("width", maxWidth);
    $(this).css("height", height * ratio);
    height = height * ratio;
    }
    var width = $(this).width();
    var height = $(this).height();
    if(height > maxHeight){
    ratio = maxHeight / height;
    $(this).css("height", maxHeight);
    $(this).css("width", width * ratio);
    width = width * ratio;
    }
    });
    //$("#contentpage img").show();
    // IMAGE RESIZE
    });
  13. 音频播放,多用在手机端html5页面背景音乐
    $('.music-box').on('click', function(){
    var is = $(this).hasClass('pause');
    var audio =document.getElementById('myaudio');
    if(is){
    audio.play();
    $(this).removeClass('pause');
    }else{
    audio.pause();
    $(this).addClass('pause');
    }
    })
    var firstPlayedAudio = false; // 解决safari播放问题
    var audioLoaded = false;
    var audio = document.getElementById('myaudio');
    $(audio).on('loadeddata', function(){
    audioLoaded = true;
    audio.play();
    });
    $('body').on('touchstart', function(){
    if(!firstPlayedAudio){
    firstPlayedAudio = true;
    audio.play();
    }
    });
    document.addEventListener("WeixinJSBridgeReady", function() {
    audio.play();
    });
  14. 箭头向下滑动
    -webkit-animation: 'wakedown' 1.4s linear infinite alternate;
    animation: 'wakedown' 1.4s linear infinite alternate;
    /* wakedown */
    @-webkit-keyframes wakedown {
    0% { opacity: 0.2; -webkit-transform: translateY(0); }
    100% { opacity: 1; -webkit-transform: translateY(-8px); }
    }
    @keyframes wakedown {
    0% { opacity: 0.2; transform: translateY(0); }
    100% { opacity: 1; transform: translateY(-8px); }
    }
  15. fullpage基本配置,主要用来快速完成任务
    最好参看API文档
    $('#container').fullpage({
    menu: '#pager',
    anchors: ['page1', 'page2', 'page3'],
    verticalCentered: true,
    sectionSelector: '.section',
    resize: true,
    css3: false,
    easing: 'easeInExpo',
    scrollingSpeed: 700
    });
  16. chrome经典bug
    chrome经典bug,需要强制GPU渲染
    -webkit-transform: translateZ(0); transform: translateZ(0);
    当页面进入的时候所有图片堆到一起的问题
    .section {
    display: table;
    table-layout: fixed;
    width: 100%;
    }
  17. 取data
    // 糟糕
    $('#id').data(key,value);
    // 建议 (高效)
    $.data('#id',key,value);

累死了,终于整理了一部分了,以后积累下来的将会继续整理和更新,希望能够帮到需要的人,另外,不要忘记支持小编哦,需要转载或者引用请私信。

你可能感兴趣的:(jQuery编程实践总结(二))