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++){
    $('<img>').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的值,并且其只适用于<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. 测试密码的强度
    在某些网站注册时常常会要求设置密码,网站也会根据输入密码的字符特点给出相应的提示,如密码过短、强度差、强度中等、强度强等。这又是怎么实现的呢?
    <input type="password" name="pass" id="pass" />
    <span id="passstrength"></span>
    //下面的正则表达式建议各位收藏哦,项目上有可能会用得着
    $('#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);

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,724评论 0 33
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,162评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,325评论 0 2
  • body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoot...
    wangyw阅读 574评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,056评论 1 10