惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园 - 聂微东
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
博客园_首页
博客园 - 叶小钗
腾讯CDC
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
宝玉的分享
宝玉的分享
D
Docker

博客园 - Think

[开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容 jquery代码链实现延时执行代码【补:几点注意】 根据用户选的背景色,自动匹配一个前景色 C++11智能指针处理Array对象 低端用户反文化----这个问题真这么简单? 放暑假了 jQuery 1.7.2 animate功能跨浏览器Bug修补 AsyncEnumerator对EAP的支持 大数据块(BLOBs)与流(Stream)操作性能规范 SQL Antipatterns内容介绍 Chromium Embedded Framework中文文档 (使用C API) Chromium Embedded Framework中文文档 (如何链接不同的运行时) Chromium Embedded Framework中文文档 (SVN属性) Chromium Embedded Framework中文文档 (升级到最新的Chrome) Chromium Embedded Framework中文文档之(基本使用) Chromium Embedded Framework 中文文档(简介) 操盘之王 摘要 市场营销经典《引爆点》简摘 强制iphone界面马上旋转
jquery代码链实现延时执行代码的较优雅办法
Think · 2012-10-08 · via 博客园 - Think

在网上瞄到篇文章关于 jQuery 中的事件延时执行 ,作者讲的这个菜单问题,之前写一个菜单控件时处理过,有印象。这不是要说的重点,重点是,在jquery代码中,要实现延时执行一段代码,可以有更“jquery style”的写法,比直接用window.setTimeout/window.setInterval这种“江南style”要优雅一点点,即可利用jquery的功能避免延时后执行环境变化带来的问题(需做闭包处理),又可保持jquery链。这种方法就是使用animate()函数及它支持的callback功能。

动画有两个元素,1是要变化的效果,2是变化的时间跨度,如果变化效果取空,那animate就变成一个能延时执行callback的定时器了:

$div.animcate({'top':'+=0'},1000,'linear',function(){
    $(this).text('It is time to change!');//this指针仍是jquery对象所指
});

//试过效果参数用空{}不行,用{'':''}在ie7、8下不行 

此外,jquery有一个.delay( duration [, queueName] ) 函数可直接用于动画过程中的延时环节,不过它没有callback参数,不能直接用来做定时器。但是进一步玩味一下,发现可以和queue()/dequeue()联合起来实现更优雅的写法:

$div.delay(1000).queue(function(){
    $(this).text('It is time to change!');
});

以下是我把刚好在做的一段代码重构了的例子(实现的是一个动画刷新一串数字的效果):

View Code 

//原来的代码,使用raw api -- window.setInterval
$('div.numbers').each(function (index, div) {
    var $div = $(div);
    var val = parseInt($div.data('value'));
    if (!val)
        return;
    var steps = getSteps(val);
    $div.text(steps[0]);
    if (steps.length > 1) {
        var interval =20,
            stepIndex = 1;
        var intervalHandler = window.setInterval(function () {
            $div.text(steps[stepIndex]);
                        
            if (stepIndex++ == steps.length) {
                window.clearInterval(intervalHandler);
                delete intervalHandler;
            }
            else {
                $div.animate({ 'fontSize''72px','top':'6px' }, 30)
                    .animate({'fontSize':'64px','top':'10px'},20);
            }
        }, interval);
    }
})
//

View Code 

//重构后的代码
var animateStep = function ($div) {
    var steps = $div.data('steps'),
        stepIndex = $div.data('stepIndex');
    $div.text(steps[stepIndex]);
    if (++stepIndex < steps.length) {
        $div.data('stepIndex', stepIndex)
            .delay(20)
            .animate({ 'fontSize': '72px', 'top': '-=4px', 'left': '-=4px' }, 20)
            .animate({ 'fontSize': '64px', 'top': '+=4px', 'left': '+=4px' }, 10)
            .queue(function () { $div.dequeue();animateStep($div); });
    }
}

$('div.numbers').each(function (index, div) {
    var $div = $(div);
    var val = parseInt($div.data('value'));
    if (!val)
        return;
    $div.data('steps', getSteps(val))
        .data('stepIndex', 0);
    animateStep($div);
})
//