10 / 07 / 2015 buling

《暖暖内含光》
讲述故事的方式很特别,珍惜眼前,享受当下的爱情就足够。片尾曲很好听,Everybody’s Gotta Learn Sometimes –2015.11.22
《荒野生存》
很容易让人很冲动的电影,也想抛弃世俗的成见,放弃物质欲望的追逐,寻求生存的意义。真实的故事总是发人深省,让人敬畏别人的能 –2015.11.20
《弱点 The Blind Side》
很励志,每个人都有自己的发光点,简单的爱能融化一切,把喜欢擅长的事情发挥的淋淋尽致就赢了 –时间未知
《极速风流》
每个人在每件事上都有风险控制线,超过了适可而止;成功固然重要,相比你有的幸福,珍惜更好。 –2015.07.19
《编舟记》
以为大大咧咧的是生活,小心翼翼的更美好。把一生献给了一件事情,最后未必荣耀灌体,但对于你和懂你的人,这一生,很有意义。 –2015.07.10
《百元之恋》
丑是因为你懒,和自己赌气,和那个深藏的梦想赌气,最后是你,即便是输了你也成功。– 2015.07.08

06 / 06 / 2015 buling

1、单行超出省略号方法
限定高宽, 设置css:overflow: hidden; text-overflow:ellipsis; white-space:nowrap;
2、多行超出省略号方法
css:overflow: hidden; display: -webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
3、rgba的向下兼容方法
css:background:#ccc; background:rgba(0, 0, 0, 0.8);
=========================JS============================
1、获取窗口大小

function getWindowHeightAndWidth(){
    var obj = window,
        sname = 'inner';
    if(!('innerWidth' in window)){
        sname = 'client';
        obj = document.documentElement || document.body;
    }
    return {
        width : obj[sname+'Width'],
        height : obj[sname+'Height']
    };
}

2、array-like object 在jquery中的使用方法。如果需要让一个object在console.log时看起来像一个数组

//The object has to have length and splice
var x = {length:2, '0':'foo', '1':'bar', splice:function(){}};
jQuery.fn.init.prototype.splice = [].splice;

3、摇一摇时禁止Iphone在页面提示“撤销键入”

$(window).off('devicemotion').on('devicemotion',function(eventData){
    //dosomething(eventData.accelerationIncludingGravity);
    eventData.preventDefault(); //就是这句了
});

4、禁止页面被拖动
//去掉IOS滚动到顶部回弹一下的效果


//这里是列表可以滚动
$('#J_userchat-list').on('touchmove', function(event){
    event.stopPropagation();
});
//全局阻止移动,防止页面被拽
$(document).on('touchmove', function(event){
    //$('#J_page-box-1').prepend('
move body
'); event.preventDefault(); });

5、查看表大小排序
SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH as SIZE,TABLE_ROWS,concat(round(data_length/1024/1024),’MB’) as data FROM information_schema.TABLES WHERE TABLE_SCHEMA=’child’ order by SIZE desc limit 10;

无标签信息 0 条
23 / 06 / 2018 buling

PHP很多时候遇到问题很难定位,比如,微信支付回调的时候 ,明明代码报错了,但很难定位到什么问题导致了错误,这个时候可以用如下代码来定位

define(ROOT_PATH, '/tmp');
//注册结束回调
register_shutdown_function( function(){
    $error = error_get_last();
    if($error){
        file_put_contents(ROOT_PATH.'/some-error.txt', 'error:'.json_encode($error));
    }
} );
//监听错误回调
set_error_handler( function($num, $str, $file, $line, $context = null){
    file_put_contents(ROOT_PATH.'/some-error.txt', 'error:'.$num.';'.$str.';'.$file);
} );
//监听异常回调
set_exception_handler( function(Exception $e){
    file_put_contents(ROOT_PATH.'/some-error.txt', 'error:'.$e->getLine().';'.$e->getMessage().';'.$e->getFile());
} );
//显示所有错误信息
error_reporting( E_ALL );
12 / 06 / 2018 buling

就不介绍前提了,直接正题吧
1、找一部android手机,usb连接到电脑,需要root
2、找到一个adb.exe
找到adb.exe的方式有很多,比如装一个PC应用宝,或者微信开发者工具下面也有,用everything搜一下就可以找到
3、cmd下面执行:
adb.exe devices
如果手机连接成功会显示设备
List of devices attached
71MBBL6228EU device
4、进入设备命令行:
adb.exe shell
5、提升权限到root:
su
如果提示没有这个命令,那说明设备还没有root,可以下载一个kingroot APP
6、切换到微信小程序代码包目录:
cd /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg
7、可以把你要破解的小程序删掉,重新搜索打开,再目录中 ll 看最新创建时间的就是目标小程序
8、因为 /data 目录为系统级目录,无法直接将其进行复制,需要重新挂载为可操作模式
mount -o remount,rw /data
9、拷贝小程序到手机SD卡中,可以用文件管理直接找到这个目标包
cd /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg/_-1946107229_14.wxapkg /mnt/sdcard
10、把apkg包传到电脑端
https://gist.github.com/feix/32ab8f0dfe99aa8efa84f81ed68a0f3e 使用这个脚本,直接解压apkg
11、还原各个加密文件:page-frame.html、app-service.js、app-config.json
参考这里:https://github.com/qwerty472123/wxappUnpacker
ok

24 / 02 / 2017 buling

先执行 yum list installed|grep php查看安装的php
然后执行 rpm -e php-common.x86_64 删除掉所有php包
添加 最新的源:rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
再安装php:yum install –enablerepo=remi –enablerepo=remi-php56 php php-cli php-common php-devel php-fpm php-gd php-imap php-ldap php-mbstring php-mcrypt php-pecl-apc php-mysqlnd php-mysql php-odbc php-pdo php-gd php-mcrypt php-pear php-pecl-igbinary php-xml php-xmlrpc
但是重启/etc/init.d/php-fpm start时一直 ……….. failed
查看错误日志也正常,但就是一直卡住,然后检查/etc/init.d/php-fpm中pid配置和/etc/php-fpm.conf中的pid配置不一致导致,最终解决
但是nginx一直502,查看错误,[error] 29130#0: *5 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 103.1.19.9, server: xx.com, request: “GET / HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”
但php-fpm没有错误日志,执行php-fpm -t /etc/php-fpm.conf 也正常,需要配置/etc/php-fpm.d/www.conf 中 catch_workers_output=yes
再看错误日志:
WARNING: [pool www] child 29310 said into stderr: “ERROR: Unable to set php_value ‘soap.wsdl_cache_dir'”
不知道什么错误,解决办法,安装 php-soap
再看错误:WARNING: [pool www] child 29362 said into stderr: “ERROR: Connection disallowed: IP address ‘10.15.205.11’ has been dropped.”
解决办法,在/etc/php-fpm.d/www.conf修改listen.allowed_clients = 127.0.0.1,10.15.205.11解决

31 / 12 / 2015 buling

咚,又是两个月没更新了,2015年的最后一天,来总结一下这一年,再期望一下2016.
很多时候我都觉得时间过得太快,来不及想回想也是多年,10年毕业,一晃5年,再看,一无所有,时间总是在不经意间走过,虽然很少感觉到会有无聊的时间,相比很多时候都是很忙,上半年不知道再玩什么,除了工作还是工作吧。
已经12点了….20分钟写了几个字
下半年,受到一些刺激,突然很想赚钱,疯狂的想赚钱。以前我不太想接外包项目,觉得很累,那本不该成为的我一样。D又找我帮忙,我就答应了,之后同事L介绍了个朋友需要做m站,这是今年下半年的第二笔收入吧。快到年底了,太多运营需求让我倍感苦恼,讨厌花了时间却做给几个人用的产品。我一直忍着,因为到年终了。总有很多事情不是能那么随性。很有可能考核一般,还没有拿到结果,不过已经不再重要。
前几周,P过来和我一起聊了一下图站,很是诱惑,花费了一周多时间撸了一个图片站,已经上线了好几天了,今晚,IP2k,PV3.5w;有帮带量,等待搜索收录。有量的感觉很好,曾经也折腾过,迟迟看不到希望,最后不得不放弃。
昨天,D过来问我2016年,其实我不是很愿意过去,主要是不想加班,直接表明我希望2016年能为了钱做事,他表示很理解,我更愿意选择Z,但和D实在是太熟,没有办法拒绝,他说同价位就不要考虑别家了。
啊,已经是今天了,买了今天一早去长沙的票,和Y,新年第一天就为了一些事情开始忙碌起来了,这一年要多劳累多努力,结果不是很重要,等16年的总结。
过去的就让它过去吧,2016,来,多尝试,多结交,happy new year!
-2016.01.01 00:45

01 / 11 / 2015 buling

周1看了一下公众号后台,然后再仔细体验了一下,实在太难用了,难用到自己都不想用,但公众号后台限制不认证拿不到openid没有办法记录用户操作,极大影响体验。周2想起了万能的淘宝,果然没有让我失望,400块搞定,其中300块是公众号本身认证费用,卖家赚100。
周5下午,老大出去了,工作也在可控范围,然后做了一下午,晚上和朋友吃火锅,回来10点,继续,到早上6点基本完成了重构工作,用的那台联想本,屏幕效果渣到我眼睛都要瞎掉,6点睡觉,10点钟小碗电话要我和他们去南澳,实在不想去,以下午要去卡丁车拒绝了,下午xp约的卡丁车,一行9人,参加公司羽毛球认识了一些人。4点过到,排队到5点,15分钟90块的,确实很爽,总觉得要飞出去其实不会,最后30多人跑了个13名,比第一少了两圈,改天再试,必定好很多。
说跑题了,回到公众号,更新完成后就我自己体验好了很多,方便查询深圳通卡余额,方便查看自己收藏的班车,早上6点上线,到晚上用户量并没与太大增加,然后我去看了cnzz数据统计,发现还有搜索引擎的量,因为上线的时候是微信外不能正常使用,晚上又修改了,本身是打算中午群发升级文章,想了想算了,会骚扰用户,昨天晚上2点发出去了,一会就又8个访问量,看粉丝,直掉,证明了理论。今天早上看了一下,大概掉了几十个,还好,新增了10几个,基本没有影响,今天有200多IP,之前PV量基本过千,现在改为spa(单页应用)不好统计PV了。做点用户量还是很难,没有关键点打动用户就没办法
前几天携程和去哪儿合并了,那晚我在去哪儿涨了14%的时候买入,到了21%没卖,晚上起来两次都是15左右,实在不想买,早上起来直接到了7%,然后第二天晚上开盘就跌成-7%,一下子就亏了21%,我还拿了小郭的一起炒,实在是内疚,后半夜10点过蹭蹭涨起来了,睡觉前卖掉了,还可以,第二天看到twitter盘前大跌10%,我觉得是机会,然后又一起砸进去了,慢慢涨起来了,虽然不是最高点卖,还是可以,又抄了gopro,现在还没回来,之前我本比较多,但后来亏在唯品会和聚美了,小郭后来进来的本金比我多,然后上周5我决定收购小郭多余的股份,花了1w5,终于我们各占50%了,哈哈
原来这么久没写文章了,本来10.1是打算去贵州,王风结婚,因为我兼职的事情10.1要敢最后和大学4友商议直接打钱。然后10.1的时间全部砸在那事上了,事实证明,付出才会有回报。最近确实做了很多手机方面的开发,越来越有收获,微信智能硬件的相关绑定,交互,微信确实设计的很好。后来又做一个手机站,spa,花了很多时间就为了更好的体验,效果也还可以。
以前总觉得生活很重要,突然也想这样也想那样,有了欲望的时候,就什么都想做了。

从app页面选择手机中的图片一般都比较大,动则N个M,然后页面就挂在那里玩了,接下来就是讨论解决方案,之道的img压缩方案就是使用canvas压缩图片,那现在问题变为canvas压缩图片后如何上传的问题了
1、从input file中读出图片的方法

var loadImageFromFile = function(file, callback) {
    var reader = new FileReader();
    reader.onload = function (e) {
        callback(e.target.result);
    };
    reader.readAsDataURL(file);
};

参考链接:https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/
2、使用canvas压缩图片同上链接已给出
3、canvas转为blob格式

var dataURItoBlob = function(dataURI){
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
    else
        byteString = unescape(dataURI.split(',')[1]);
    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    // write the bytes of the string to a typed array
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ia], {type:mimeString});
};

参考链接:http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
4、异步上传,新建一个formdata对象,添加blob到formdata中

var formdata = new FormData();
formdata.append('imgfile', blob);
var url = "upload.php";
$.ajax({
    type:'POST',
    url:url,
    data:formdata,
    contentType:false,
    processData:false,
    success : function(jdata){
        console.log(jdata);
    }
});

综上所述给一个Helper

var ScaleImageHelper = {
    //从FILE中加载img
    loadImageFromFile : function(file, callback) {
        var reader = new FileReader();
        reader.onload = function (e) {
            callback(e.target.result);
        };
        reader.readAsDataURL(file);
    },
    dataURItoBlob : function(dataURI){
        var byteString;
        if (dataURI.split(',')[0].indexOf('base64') >= 0)
            byteString = atob(dataURI.split(',')[1]);
        else
            byteString = unescape(dataURI.split(',')[1]);
        // separate out the mime component
        var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
        // write the bytes of the string to a typed array
        var ia = new Uint8Array(byteString.length);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
        return new Blob([ia], {type:mimeString});
    },
    resizeImgToCanvas : function(img, maxHeight, maxWidth){
        maxHeight = maxWidth||640;
        maxWidth = maxWidth||640;
        var width = img.width;
        var height = img.height;
        if(width > height){
            if (width > MAX_WIDTH) {
                height *= MAX_WIDTH / width;
                width = MAX_WIDTH;
            }
        }else{
            if (height > maxHeight) {
                width *= maxHeight / height;
                height = maxHeight;
            }
        }
        var canvas = document.createElement('canvas')
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, width, height);
        return canvas;
    },
    canvasToBlob : function(canvas){
        var dataURL = canvas.toDataURL('image/jpeg', 0.5);
        return this.dataURItoBlob(dataURL);
    },
    post : function(url, formdata, callback){
        $.ajax({
            type:'POST',
            url:url,
            data:formdata,
            contentType:false,
            processData:false,
            success : function(jdata){
                console.log(jdata);
            }
        });
    }
};

测试案例如下:


//监听文件变化
$('#J-file').on('change', function(){
    if(this.files.length<1){
        return ;
    }
    var file = this.files[0];
    //从文件中加载图片
    ScaleImageHelper.loadImageFromFile(file, function(src){
        var img = document.createElement('img');
        //插入图片到body中
        //$(document.body).append(img);
        //图片加载完成
        img.onload = function(){
            //通过canvas缩放图片
            var canvas = ScaleImageHelper.resizeImgToCanvas(this, 10, 10);
            //把canvas转成blob格式
            var blob = ScaleImageHelper.canvasToBlob(canvas);
            //插入到form中异步上传
            var formdata = new FormData();
            formdata.append('imgfile', blob);
            ScaleImageHelper.post('./scale-canvas.php', formdata);
        };
        img.src = src;
    });
});

最近一个小应用需要做播放器,当然首选jplayer,由于是手机应用,还是用zepto代替了jquery,昨晚折腾了很晚,也没找到为何出错了,比较晚耐心也不好,最终放到了今天。
官方文档,硬是把使用zepto代替jquery的说明拆成了几段,一不小心就跳过了重点

//如果使用了AMD module需要修改下面的代码
//替换define(['jquery'], factory); 为
define(['zepto'], factory);

那么zepto源码中是没有amd加载支持,这个时候我们需要补充一下

define("zepto", [], function(){return Zepto;});

但发现其实还是使用不了,设置如下可以使jplayer打印出错误日志

my_jPlayer.jPlayer({
    errorAlerts: true //显示错误信息
})

发现错误日志如下:

jPlayer 2.9.2 : id=’jquery_jplayer’ : Error!
Attempt to issue media playback commands, while no media url is set.
Use setMedia() to set the media URL.
Context: play

那么就是setMedia没有调用到,跟一下源码,在第57行代码var instance = $(this).data(name);得到的结果是”[object Object]”,一看zepto不支持data为object,然后我再看官方文档,重点来了

Zepto
Compatibility verified with:
Zepto 1.0 compiled with Data module

整个人都很难受,为何不仔细看文档,为何不仔细看文档

13 / 09 / 2015 buling

很久没有记事了,也找不到一个点想去记录,某人竟然说好久没更新了,真是不喜欢别人看我的底,正如不想告诉别人我会什么,有什么,缺什么。
今天下午约了个朋友陪我去买了一下衣服,回来直接点了必胜客的披萨,我第一次买披萨当主食,完了看了会极限挑战,送她回去,uber太远,最后选了滴滴,习惯性专车,真NN贵。路上又(之前有次和师傅聊天忘了开始计费,最后师傅拒绝我补钱)和师傅聊天。他说无聊就出来跑一下,然后说他今天就在家洗了一天发动机,然后顺势给我介绍如何清理发动机。后来讲到他做外贸行业,进口转内销,具体是工业相机,他们的客户群是华为,富士康之流。起初我以为就是个普通销售,后来说刚开始做这行他们只有三个人。现在去年又和他姐夫开了一家汽车租赁公司,主要是给企业提供商务车。这些都没什么,无非是成功人在讲他们的成绩而已,成功的例子多了,牛逼的事情也太常见。但成功的路上不是所有人都能知道。
他刚来深圳找不到工作,在大新一个小区做保安,后来混不下去了,去了酒店做服务员,用了几个月的时间升职为主管,开始认识了一群很牛逼的人,09年酒店出事了,他就离职开始做现在的行业,去年和姐夫开了租赁公司,去哪儿来和他们谈南山片区的接送服务,最后没有谈成。他说做人就是心态的问题,做事也如此,对人好,别人才会对你好,别人对他一分好,他会还以四分。(这句话我理解的很透彻,一直以来我也尽量这么做,就是伤钱,不伤钱不赚钱不是)。做事前需要先想明白,他都会用笔记录下来之后要做的每一点,做到一点打个完成标志。说的很是,回想我们规划的很多事情都是在后来不了了之。做事最重要的是能放下面子,不要计较得失,为了面子丢掉了更重要的东西,往上爬可以,用能力,不要踩着他人上去,行人做事态度第一。他玩御龙在天,在上面花了10几w,认识了一堆朋友。这是另一个境界了,不是我暂时能参悟的了的。
很受益无穷的一堂成功学,因为朋友住的有点远,回来的时候他结单送回来,其实他要去福田,留了张名片,谢谢。
我记得前不久刚和谁聊说真正成功人的心态。因为这次考核又得了个3星,很是失落,然后和朋友聊,他说眼界放远点,可以在做点别的事情,然后,然后我一口气做了三份副业,一份任务,一份友谊帮忙,一份兼职。接的那事是一个手机web站,本来是答应今天完成的,结果哎,又违背了承诺,还好那哥也是人生专家级别了。因为期间纪念日放假去了黄山,最后就耽误了。
那什么纪念日,stone筹划了很久的男人日终于定下来了,mvp/小碗/荣/stone/群主(竟然带老婆,哎),去的路上一路升级,好爽,让我想起了很多往事,高中的时候,我、阿毛、彭子,还有谁忘了,每晚自习完就从2升到A睡觉,有时候一晚打两圈。大学的时候我们吃喝组(猛/风子/肾宝)隔三差五去喝酒,都白酒,然后升级。时隔这么多年再次有这种什么事情都不想一心升级。到酒店升级,没事就升级。第一天到黄山脚下,第二天一早起床上山,上山做车大巴排队,做缆车排队,等真正上山也接近1点了,去了XXX/XXX等等景点,都没记住,主要人多,不过风景确实很美,然后3点过,滴滴答答的下个不停,还好山下的时候买了雨衣,mvp给我买了鞋套,然后那两天最是喜爱的物品。然后径直上光明顶,休息片刻直接白云宾馆(山上)。因为下雨,价格可,还好是提前网上订的床位(和宿舍类似,一个房价,4张床,上下铺,有卫生间,热水,没有空调),晚上准备出去完,打算换长裤(外面细密的风雨),发现没带,欲哭无泪,带的厚衣服也没有办法配这短裤。第二天早起还是飘着雨,先是去了什么来着,我和mvp计划继续前行去步仙桥,因为雾很大,他们是想放弃,最后不得已又一起,因为雨雾,一路基本没有人,那感觉很好,这才是我想要的旅游,到了步仙桥合照一张,继续下车去坐缆车,哎,我把所有的路径都忘记了。总之第二天虽然天气不好,但整天是我很喜欢的。
每次都很喜欢用倒叙的方式来写,想了半天终于想起一些事情了,8月24号的那一周简直是悲催至极,周1科目二考试挂掉了,考试时候前面有个妹子,后面一妹子一哥们,聊各种驾校的坑爹,去考场练车交钱,我说没有,前面那妹子更是,她是6月练的,后来教练走了,换了个新教练,教了三天就考试,各种蒙圈,我怕她误导我,我尽量不和她聊天,结果因为方向盘非常紧,倒车入库挂了,两次都挂在那里了,奶奶的,这完全不在意料范围,晚上和教练的饭都约好了,结果,我刚出考场等教练过来,接二连三那三个人都出来了,一脸的没过,然后继续开始喷什么破车,什么破考场,什么破dang。周4T3评审,这次准备的很仓储,PPT都没有勇气让老大过,面前richard看了一眼说完全不知所云的ppt,然后果然,评委一致认为不能在烂得ppt了,有个评委全程提得建议很中肯,很有大家风范。年底再来吧,那一周各种被揭伤疤。
最近开始迷上了羽毛球,会长技术很牛逼,我一直很虚心的从基础开始学习练习,现在也是大有进步,羽毛球真是一件很锻炼的运动,简直大爱,现在已经完全不能自拔。前不久因为他们非得让我请吃饭,最后选定香蜜轩,也是个环境很好的地方,最后大家也没有拼,7个人,人均100多点就搞定了,不知道找什么借口就说庆祝我生日,我生日哪是这个季节
唐在8月底去了九寨沟,之前计划的是他们去的时候我顺便回去,后来他们这个时间完全不在我控制范围内,他们在四川待了好多天,可惜我不在,否则应该会玩的更好吧,昨天他们过来了买家具,还有四姑娘山要去,等着我结婚,哈哈,好,就这么定。
昨天加班一天,今天加班半天,去茂业买了3件T,买了一件lee T恤6折230,后来看到安踏,两件才170,哈哈,就随便穿穿吧,现在买安踏袋子都不想提,会觉得有点丢人了,不知道什么心态。想刚高中毕业,我哥买361二送1的时候,我就是穿那个送1。晚上那为成功师傅穿的是361。
终于写回来了,还有很多事情,希望能把时间规划好,做完该做的事情,有所得,有所为。
网络断了,用手机热点发,用我的new macbook写日志的感觉,还是很好用。
–2015.09.14 00:43

22 / 07 / 2015 buling

这几天一直在做XX活动,明天发,主要负责手Q平台,微信平台被人抢了,所以。有如下些点分享
1、页面字体大小,

html {font-size:62.5%}
/*未经调整的浏览器都符合: 1em=16px,所以10px=0.625em,设置html为62.5%,那1rem就是10px*/
/*之后页面布局均使用rem来布局,方便统一调整*/

2、音乐播放操作



(function(){
    //audio dom
    var videoMusic = $('#audio')[0];
    //监听回调
    var videoLoaded = function(){
        //控制按钮
        var $controll = $('#J_music-controller');
        //设置音量
        videoMusic.volume = 0.5;
        //开始播放
        videoMusic.play();
        $controll.show().on('tap', function(){
            var $this = $(this);
            if($this.hasClass('music-close')){
                $this.removeClass('music-close');
                videoMusic.play();
            }else{
                $this.addClass('music-close');
                videoMusic.pause();
            }
        });
    };
    //监听是否加载完成可以播放
    videoMusic.addEventListener('canplay', videoLoaded);
    if(videoMusic.readyState==4){
        videoLoaded();
    }
}());

3、陀螺仪模拟摇一摇

var AcceHelper = (function(){
    var lastAcceTime = 0,
        lastAcceInfo = false,
        firstAcceInfo = false,
        lastDistance = 5000,
        isStart = false,
        stopTimer = 0,
        config = {
            timeLimit : 100, //两次感应间隔时间为200
            speedLimit : 80, //速度限制为80
            stopLimit : 400
        };
    var getDistance = function(a, l){
        var powDis = Math.pow(a.x-l.x, 2) + Math.pow(a.y-l.y, 2);
        return Math.sqrt(powDis);
    };
    var doAccelerationIncludingGravity = function(acceleration, oncallback, stopcallback){
        var curTime = (new Date()).getTime(),
            a = acceleration,
            l = lastAcceInfo,
            time = curTime-lastAcceTime;
        if(time>config.timeLimit && lastAcceInfo){
            //debugFunc('on acceleration call['+(a.x+'_'+a.y+'_'+a.z)+']');
            lastAcceTime = curTime;
            var distance = getDistance(a, l),
                speed = distance/time*1000;
            if(speed>config.speedLimit){
                isStart = true;
                if(stopTimer){ //清除结束
                    clearTimeout(stopTimer);
                }
                if(!firstAcceInfo){ //设置第一次
                    firstAcceInfo = {
                        x : a.x,
                        y : a.y,
                        z : a.z
                    };
                }
                var aDistance = getDistance(a, firstAcceInfo);
                debugFunc('on acceleration call['+(aDistance+'_'+lastDistance+'_'+distance)+']');
                if(aDistance[[[[['+num+'
'); endcall && endcall.call(null, num, info, acceleration); num = 0; }); }; var removeAccelerometer = function(){ $(window).off('devicemotion'); }; return { on : endAccelerometer, remove : removeAccelerometer, init : function(options){ $.extend(config, options); } }; }()); //使用方法 AcceHelper.on(function(num, info, acceleration){ //晃动第几次 debugFunc('on acceleration num:' + num); }, function(num){ //结束 //结束时回调总共摇动了几次 debugFunc('on acceleration end num:' + num); });

3、分享一些动画

无标签信息 0 条