标签归档:网页

就是现在,用Promise取代callback吧!

Callback-Hell
什么是callback hell?
答:(如上图)过多的,过深的callbacks导致代码丑陋,难以阅读和维护。

window.Promise兼容不好吧?
答:这篇文章就是教你如何想Promise就Promise想callback就callback,还有去兼容浏览器的Promise的polyfill

ES6里的Promise让JS变得更加优雅。那么现在我们怎么把原有的代码转变成Promise Style呢?

原有代码(Callback Style):

    var waitCon = function(time,callback){
        //这里可以做很多工作的代码,先用延迟来代替
        var result=1+1;
        setTimeout(function(){
            if(callback){
                callback(result);
            }
        },time);
    };

原有代码(Callback Style)-调用方法:

    waitCon(2000,function(res){
        console.log(res); //两秒后得出2这个结果
    });

改写成Promise Style:

    var waitCon = function(time){
        return new Promise(function(resolve,reject){
            var result=1+1;
            setTimeout(function(){
                resolve(result);
                //成功完成,传出结果。如果用reject则是完成失败,传出错误内容
            },time);
        });
    };

Promise Style的调用方法:

    waitCon(2000).then(function(result){
       //原本callback里的内容
       console.log(result);
    });//可读性很高:先执行XXX,然后XXX

还可以Promise链、多重Promise具体查看 http://www.html5rocks.com/zh/tutorials/es6/promises/
这里只谈最简单的异步callback升级换代。

这里送出一个callback+Promise的整合版,想用什么用什么,妈妈再也不用担心其他小朋友不会用婆迷丝了。

    var waitCon=function(time,callback){
        return new Promise(function(resolve,reject){
            var result=1+1;
            setTimeout(function(){
                if(typeof callback === "function"){callback(result);}//执行callback
                resolve(result);//成功完成,传出结果
            },time);
        });
    };

My Angular Mobile App Boilerplate: AngularNavPlusHammer

我建立的这个GitHub项目为一个整合包,意在快速带你进入Angular Mobile App的生产开发中

    功能:

  1. 暂且采用BootStrap3.0 UI(其实这个项目核心和UI无关);
  2. 可追溯的后退按钮;
  3. 支持20种触摸手势,并可以以“ng-click”类似的HTML directive进行使用;
  4. 在route里、在控制器里均可自由控制页面过度动画(Page Transition Effects)

    这个项目由三大件组合而成:

  1. https://github.com/regou/angular-mobile-nav (由ajoslin版Fork出来,修改了几个我无法忍受的bug)
  2. https://github.com/randallb/angular-hammer (各种触摸手势都靠他了)
  3. 我的一些御用Module

Demo:

http://tools.regou.me/angular-nav-plus-hammer/

项目地址:

https://github.com/regou/angular-nav-plus-hammer

AngularJS+ JqueryMobile+ PhoneGap 打造APP

转载必须附带本文地址http://blog.regou.me/?p=790,谢谢

最近在做一个项目,一个B2B的移动APP。
我是这样选择的
前端UI框架:jQueryMobile
前端MVC和页面导航:AngularJS
封包器:PhoneGap Build
AngularJS和jQueryMobile的桥接器:jQueryMobile-Angular-Adapter(以下简称Adapter)
AngularJS JqueryMobile PhoneGap worktogether

两个著名框架融合在一起,还要让他们被封包了后还要运行OK可不容易,期间遇到了各种各样的问题,国内文档较少,于是Github、GoogleGroup、StakOverflow这些网站四处奔波提问+查资料
下面说下我遇到的问题和解决方法 继续阅读

AngularJS兼容IE的处理(官方文档不全面)

AngularJS
最近在学些AngularJS,感觉挺强大的。
但是如果想投入到生产环境中,还需要考虑到IE6,7的兼容问题。

官方文档提到如何兼容IE了,但是即使全部按照文档里说的做,其实还是不能做到在IE6,7下运行。

经过各种实践,在这里给出一个补充:
需要在html标签上添加id=”ng-app”和class=”ng-app:APPNAME”,于是一个标准的ng-app的标签应该是:(app名为myapp为例)

##注意下面的“HTMLTAG”必须是合法的html标签,永远不要使用自定义标签(ng-view改成<div ng-view>),否则依然不兼容IE
<html xmlns:ng="http://angularjs.org">
......
<HTMLTAG ng-app="myapp" class="ng-app:myapp" id="ng-app">
   ....
</HTMLTAG>
.....
</html>

这样就行了,以上是唯一的和官网说明不同的地方.

另附官网文档所说的让IE兼容JSON2和HTML5标签的JS在这,直接引用进head标签里就行了里就行了(这两个JS也是必要的)

<script src="http://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.2pre/html5shiv.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/json2/20121008/json2.js"></script>

随便做了一个demo,兼容IE67:
http://tools.regou.me/angularJS.html

2013.6.22更新
目前我在正式的生产环境中,用AngularJS+jQueryMobile+PhoneGap在做一个B2B商城APP
分享了点AngularJS用户手机APP开发的心得:
blog.regou.me/?p=790

2013.12.16更新
我看了下,官方文档已经做好了补充,现在可以完全以官网文档为准了。
AngularJS 1.3.0开始,将不再支持IE8和IE8以下的浏览器,所以,别再挣扎了

JS/PHP添加Do Not Track(DNT),保护访客隐私

大多数的网络浏览器的设置中有一个“Do Not Track”(DNT 即“不追踪”)设定,让用户能够控制自己的隐私信息被追踪的情况。
但是网站到底是否真的不追踪,还要看网站本身是否响应它
那么,做一个善良的网站,如果用户设置了Do Not Track,那么就保护一下他的隐私吧!

下面这个为JavaScript的代码,如果 navigator.doNotTrack 等于1,那么用户就开启了DNT,不要去运行那些搜集用户信息的脚本了!

if(!navigator.doNotTrack){
  //这里面写搜集信息的脚本,如果开启DNT则不执行
}

这个为PHP的,通过判断HTTP Header “HTTP_DNT”的值是否为”1″来判定是否开启了DNT:

function get_dnt() {
  // returns TRUE if DNT is on and is equal to 1
  return (isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] == 1);
  $DoNotTrackHeader = "DNT";
  $DoNotTrackValue = "1";

  $phpHeader = "HTTP_" . strtoupper(str_replace("-", "_", $DoNotTrackHeader));
  return (array_key_exists($phpHeader, $_SERVER)) and ($_SERVER[$phpHeader] == $DoNotTrackValue)
}

同理,nodejs的:

var dnt=function(){
  return (headers['HTTP_DNT']==1)
}

HTML5视频的多平台兼容方案 JW Player

JW Player通过配置可以在不支持HTML5浏览器的情况下,自动的将HTML5视频转化为Flash视频
同时也支持m3m8、flv等流媒体播放。具体参见 http://www.longtailvideo.com/players/

DEMO预览点这里

配置起来很简单,先在引JS

<script src='jwplayer.js'></script>

再在想放视频的地方放下如下代码就行了,上面面那个demo是我希望优先用html5播放,再其次用Flash播放

<video id='mediaplayer' ></video>
<script type="text/javascript">
    jwplayer('mediaplayer').setup({
        'id': 'playerID',
        'width':1280,
        'height':720,
        levels: [
            {file: 'Using2-stepverification.mp4',type: 'video/mp4' },//mp4文件提供给Flash
            {file: 'Using2-stepverification.webm', type: 'video/webm' },//webm文件提供给HTML5
        ],
        'modes': [
            {type: 'html5'},//优先级1,以下类推
            {type: 'flash', src: 'player.swf'},
            {type: 'download'}
        ]
    });
</script>

善用HTML5″data”自定义属性

制作一些和后台交互非常多的网站的时候,经常需要后台语言输出一些数据到html里,最方便的莫过于在html标签里放进某个属性,来保存这个标签所需要的部分信息,以便调用。比如

<li indexNum="01" lang="cn">围城</li>
<li indexNum="02" lang="en">冰与火之歌</li>

例子中,这两本书为了保存书的序号和语言,使用了两个非法的Attribute:“indexNum”和“lang”。
如果在validator.w3.org中进行合法性检测会显示“Attribute indexNum not allowed on element li at this point.”

推荐用HTML5的新属性data,以上的语句就可以变为

<li data-indexNum="01" data-lang="cn">围城</li>
<li data-indexNum="02" data-lang="en">冰与火之歌</li>

想访问的话,可以用传统的访问属性的方法,也可以用Jquery的.data()方法:

$("li:first").data("indexNum")=="01" //true
$("li:first").data()  //这里将获得一个JSON格式的对象,可以进行对象内的属性修改

具体还是参考官方文档吧:http://api.jquery.com/data/

教你下载任意网页上的视频

有不少朋友想下载网络上的Flash视频,而又苦于没办法,虽然各种浏览器有插件支持,但是视频网站数量之多,不如来个万能的方案?

我们需要浏览器的Debug功能了,推荐Chrome,FireFox,Opera。

首先,打开我们想下载的视频的观看页面,比如我们这次用的是Chrome,看的是最佳视频奖的《和ODEN的最后一分钟》
和ODEN的最后一分钟

继续阅读