云顶娱乐棋牌-云顶娱乐每天送6元
做最好的网站

【云顶娱乐棋牌】创制对象的,高雅的数组降维

来探视机智的前端童鞋怎么防盗

2016/07/12 · JavaScript · 4 评论 · HTML5

初稿出处: VaJoy   

成千上万支付的童鞋都是孤独混江湖、夜宿城中村,假诺居住的地点安全保卫欠缺,那么出门在外难免牵记屋里的财产安全。

实在世面上有很多光辉上的防盗设施,但对此灵动的前端童鞋来讲,只要有一台附带录制头的微管理器,就足以简简单单地贯彻四个防盗监察和控制系统~

纯 JS 的“防盗”本领不小程度借助于 H5 canvas 的才具,且拾分有意思。假如您对 canvas 还不熟知,可以先点这里开卷笔者的无尽教程。

step1. 调用录像头

咱俩须要先在浏览器上访谈和调用录制头,用来监督屋企里的一言一行。分化浏览器中调用视频头的 API 都略有出入,在那边大家以 chrome 做示范:

JavaScript

<video width="640" height="480" autoplay></video> <script> var video = document.querySelector('video'); navigator.webkitGetUserMedia({ video: true }, success, error); function success(stream) { video.src = window.webkitURL.createObjectURL(stream); video.play(); } function error(err) { alert('video error: ' + err) } </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<video width="640" height="480" autoplay></video>
 
<script>
    var video = document.querySelector('video');
 
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.webkitURL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert('video error: ' + err)
    }
</script>

运营页面后,浏览器出于安全性思量,会通晓是或不是允许当前页面访谈你的录像头设备,点击“允许”后便能平素在 <video> 上见到拍录头捕获到的镜头了:

云顶娱乐每天送6元 1

step2. 捕获 video 帧画面

只然则开着录像头监视房间可不曾任何意义,浏览器不会帮你对监督检查画面实行剖析。所以那边我们胜利动用脚本捕获 video 上的帧画面,用于在一连开展多少深入分析。

从此间开始大家就要借助 canvas 力量了。在 Canvas入门(五)一文我们介绍过 ctx.drawImage() 方法,通过它能够捕获 video 帧画面并渲染到画布上。

我们必要创建八个画布,然后这么写:

JavaScript

<video width="640" height="480" autoplay></video> <canvas width="640" height="480"></canvas> <script> var video = document.querySelector('video'); var canvas = document.querySelector('canvas'); // video捕获录制头画面 navigator.webkitGetUserMedia({ video: true }, success, error); function success(stream) { video.src = window.webkitU冠道L.createObjectUWranglerL(stream); video.play(); } function error(err) { alert('video error: ' + err) } //canvas var context = canvas.getContext('2d'); setTimeout(function(){ //把当前录制帧内容渲染到画布上 context.drawImage(video, 0, 0, 640, 480); }, 四千); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<video width="640" height="480" autoplay></video>
<canvas width="640" height="480"></canvas>
 
<script>
    var video = document.querySelector('video');
    var canvas = document.querySelector('canvas');
 
    // video捕获摄像头画面
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.webkitURL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert('video error: ' + err)
    }
 
    //canvas
    var context = canvas.getContext('2d');
 
    setTimeout(function(){
        //把当前视频帧内容渲染到画布上
        context.drawImage(video, 0, 0, 640, 480);
    }, 5000);
 
</script>

如上代码所示,5秒后把录制帧内容渲染到画布上(下方右图)

云顶娱乐每天送6元 2

step3. 对捕获的五个帧画面执行差异混合

在上头大家关系过,要使得地分辨有个别场景,需求对录像画面实行数量分析。

那就是说要怎么辨识我们的房舍是或不是有人蓦然闯入了吗?答案很简单 —— 按时地破获 video 画面,然后相比较前后两帧内容是不是留存不小变化。

咱俩先轻巧地写三个定时捕获的秘籍,并将捕获到的帧数据存起来:

JavaScript

//canvas var context = canvas.getContext('2d'); var preFrame, //前一帧 curFrame; //当前帧 //捕获并保存帧内容 function captureAndSaveFrame(){ console.log(context); preFrame = curFrame; context.drawImage(video, 0, 0, 640, 480); curFrame = canvas.toDataUCR-VL; //转为base64并保存 } //按时捕获 function timer(delta){ setTimeout(function(){ captureAndSaveFrame(); timer(delta) }, delta || 500); } timer();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    //canvas
    var context = canvas.getContext('2d');
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){ console.log(context);
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL;  //转为base64并保存
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            timer(delta)
        }, delta || 500);
    }
 
    timer();

如上代码所示,画布会每隔500纳秒捕获并渲染一回 video 的帧内容(夭寿哇,做完那一个动作一点都不小心把饼干洒了一地。。。(“▔□▔)/)

云顶娱乐每天送6元 3

专一这里咱们利用了 canvas.toDataURL 方法来保存帧画面。

接着便是数据分析处理了,我们能够通过比较前后捕获的帧画面来判断摄像头是还是不是监察和控制到变化,那么怎么办吧?

熟识设计的同窗确定平时使用叁个图层功效 —— 混合情势:

云顶娱乐每天送6元 4

当有五个图层时,对顶层图层设置“差值/Difference”的犬牙交错情势,能够洞察地看看七个图层的不同:

云顶娱乐每天送6元 5

“图A”是自己二零一八年在店堂楼下拍的照片,然后自个儿把它有一些调亮了一丢丢,并在上头画了叁个X 和 O 拿到“图B”。接着笔者把它们以“差值”格局混合在同步,获得了最右的那张图。

JavaScript

“差值”情势原理:要掺杂图层双方的CR-VGB值中各种值分别张开相比较,用高值减去低值作为合成后的颜色,平时用月光蓝图层合成一图像时,能够获得负片效果的反相图像。用金红的话不产生任何变化(粉末蓝亮度最低,下层颜色减去最小颜色值0,结果和原先同样),而用栗色会获得反相效果(下层颜色被减去,拿到补值),别的颜色则基于它们的亮度水平

1
“差值”模式原理:要混合图层双方的RGB值中每个值分别进行比较,用高值减去低值作为合成后的颜色,通常用白色图层合成一图像时,可以得到负片效果的反相图像。用黑色的话不发生任何变化(黑色亮度最低,下层颜色减去最小颜色值0,结果和原来一样),而用白色会得到反相效果(下层颜色被减去,得到补值),其它颜色则基于它们的亮度水平

在CSS3中,已经有 blend-mode 天性来支持那些妙不可言的搅动方式,不过我们开掘,在主流浏览器上,canvas 的 globalCompositeOperation 接口也早就能够援助了图像混合格局:

于是大家再建多一个画布来展现前后两帧差别:

JavaScript

<video width="640" height="480" autoplay></video> <canvas width="640" height="480"></canvas> <canvas width="640" height="480"></canvas> <script> var video = document.querySelector('video'); var canvas = document.querySelectorAll('canvas')[0]; var canvasForDiff = document.querySelectorAll('canvas')[【云顶娱乐棋牌】创制对象的,高雅的数组降维。1]; // video捕获摄像头画面 navigator.webkitGetUserMedia({ video: true }, success, error); function success(stream) { video.src = window.UOdysseyL.createObjectUWranglerL(stream); video.play(); } function error(err) { alert('video error: ' + err) } //canvas var context = canvas.getContext('2d'), diffCtx = canvasForDiff.getContext('2d'); //将第2个画布混合方式设为“差距” diffCtx.globalCompositeOperation = 'difference'; var preFrame, //前一帧 curFrame; //当前帧 //捕获并保存帧内容 function captureAndSaveFrame(){ preFrame = curFrame; context.drawImage(video, 0, 0, 640, 480); curFrame = canvas.toDataUPAJEROL(); //转为base64并保存 } //绘制base64图像到画布上 function drawImg(src, ctx){ ctx = ctx || diffCtx; var img = new Image(); img.src = src; ctx.drawImage(img, 0, 0, 640, 480); } //渲染前后两帧差别function renderDiff(){ if(!preFrame || !curFrame) return; diffCtx.clearRect(0, 0, 640, 480); drawImg(preFrame); drawImg(curFrame); } //定时捕获 function timer(delta){ setTimeout(function(){ captureAndSaveFrame(); renderDiff(); timer(delta) }, delta || 500); } timer(); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<video width="640" height="480" autoplay></video>
<canvas width="640" height="480"></canvas>
<canvas width="640" height="480"></canvas>
 
<script>
    var video = document.querySelector('video');
    var canvas = document.querySelectorAll('canvas')[0];
    var canvasForDiff = document.querySelectorAll('canvas')[1];
 
    // video捕获摄像头画面
    navigator.webkitGetUserMedia({
                video: true
            }, success, error);
 
    function success(stream) {
        video.src = window.URL.createObjectURL(stream);
        video.play();
    }
 
    function error(err) {
        alert('video error: ' + err)
    }
 
    //canvas
    var context = canvas.getContext('2d'),
        diffCtx = canvasForDiff.getContext('2d');
    //将第二个画布混合模式设为“差异”
    diffCtx.globalCompositeOperation = 'difference';
 
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL();  //转为base64并保存
    }
 
    //绘制base64图像到画布上
    function drawImg(src, ctx){
        ctx = ctx || diffCtx;
        var img = new Image();
        img.src = src;
        ctx.drawImage(img, 0, 0, 640, 480);
    }
 
    //渲染前后两帧差异
    function renderDiff(){
        if(!preFrame || !curFrame) return;
        diffCtx.clearRect(0, 0, 640, 480);
        drawImg(preFrame);
        drawImg(curFrame);
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            timer(delta)
        }, delta || 500);
    }
 
    timer();
 
</script>

作用如下(夭寿啊,做完那些动作笔者又把百事可乐洒在键盘上了。。。(#--)/ )

云顶娱乐每天送6元 6

可以观察,当前后两帧差距不大时,第八个画布大约是模糊的一片,唯有当拍录头捕获到动作了,首个画布才有真相大白的高亮内容出现。

故此,我们只须求对第八个画布渲染后的图像举办像素分析——剖断其高亮阈值是不是到达某些钦点预期:

JavaScript

var context = canvas.getContext('2d'), diffCtx = canvasForDiff.getContext('2d'); //将第一个画布混合方式设为“差别” diffCtx.globalCompositeOperation = 'difference'; var preFrame, //前一帧 curFrame; //当前帧 var diffFrame; //存放差距帧的imageData //捕获并保存帧内容 function captureAndSaveFrame(){ preFrame = curFrame; context.drawImage(video, 0, 0, 640, 480); curFrame = canvas.toDataU奇骏L(); //转为base64并保存 } //绘制base64图像到画布上 function drawImg(src, ctx){ ctx = ctx || diffCtx; var img = new Image(); img.src = src; ctx.drawImage(img, 0, 0, 640, 480); } //渲染前后两帧差距 function renderDiff(){ if(!preFrame || !curFrame) return; diffCtx.clearRect(0, 0, 640, 480); drawImg(preFrame); drawImg(curFrame); diffFrame = diffCtx.getImageData( 0, 0, 640, 480 ); //捕获差距帧的imageData对象 } //总计差距 function calcDiff(){ if(!diffFrame) return 0; var cache = arguments.callee, count = 0; cache.total = cache.total || 0; //整个画布皆以深紫时拥有像素的值的总量 for (var i = 0, l = diffFrame.width * diffFrame.height * 4; i < l; i += 4) { count += diffFrame.data[i] + diffFrame.data[i + 1] + diffFrame.data[i + 2]; if(!cache.isLoopEver){ //只需在率先次循环里试行 cache.total += 255 * 3; //单个反革命像素值 } } cache.isLoop伊夫r = true; count *= 3; //亮度放大 //重回“差距画布高亮部分像素总值”占“画布全亮情状像素总值”的百分比 return Number(count/cache.total).toFixed(2); } //定期捕获 function timer(delta){ setTimeout(function(){ captureAndSaveFrame(); renderDiff(); setTimeout(function(){ console.log(calcDiff()); }, 10); timer(delta) }, delta || 500); } timer();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    var context = canvas.getContext('2d'),
        diffCtx = canvasForDiff.getContext('2d');
    //将第二个画布混合模式设为“差异”
    diffCtx.globalCompositeOperation = 'difference';
 
    var preFrame,   //前一帧
        curFrame;   //当前帧
 
    var diffFrame;  //存放差异帧的imageData
 
    //捕获并保存帧内容
    function captureAndSaveFrame(){
        preFrame = curFrame;
        context.drawImage(video, 0, 0, 640, 480);
        curFrame = canvas.toDataURL();  //转为base64并保存
    }
 
    //绘制base64图像到画布上
    function drawImg(src, ctx){
        ctx = ctx || diffCtx;
        var img = new Image();
        img.src = src;
        ctx.drawImage(img, 0, 0, 640, 480);
    }
 
    //渲染前后两帧差异
    function renderDiff(){
        if(!preFrame || !curFrame) return;
        diffCtx.clearRect(0, 0, 640, 480);
        drawImg(preFrame);
        drawImg(curFrame);
        diffFrame = diffCtx.getImageData( 0, 0, 640, 480 );  //捕获差异帧的imageData对象
    }
 
    //计算差异
    function calcDiff(){
        if(!diffFrame) return 0;
        var cache = arguments.callee,
            count = 0;
        cache.total = cache.total || 0; //整个画布都是白色时所有像素的值的总和
        for (var i = 0, l = diffFrame.width * diffFrame.height * 4; i < l; i += 4) {
            count += diffFrame.data[i] + diffFrame.data[i + 1] + diffFrame.data[i + 2];
            if(!cache.isLoopEver){  //只需在第一次循环里执行
                cache.total += 255 * 3;   //单个白色像素值
            }
        }
        cache.isLoopEver = true;
        count *= 3;  //亮度放大
        //返回“差异画布高亮部分像素总值”占“画布全亮情况像素总值”的比例
        return Number(count/cache.total).toFixed(2);
    }
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            setTimeout(function(){
                console.log(calcDiff());
            }, 10);
 
            timer(delta)
        }, delta || 500);
    }
 
    timer();

介意这里大家运用了 count *= 3 来松开差别高亮像素的亮度值,不然得出的数值实在太小了。大家运维下页面(图片比较大加载会有一点点慢)

云顶娱乐每天送6元 7

通过试(xia)验(bai),个人认为假如 calcDiff() 再次回到的比值假如超过0.20,那么就能够定性为“一间空房屋,忽然有人闯进来”的意况了。

step4. 上报十分图片

当上述的乘除发掘有场景时,必要有某种路子公告我们。有钱有精力的话能够安插个邮件服务器,直接发邮件以至短信公告到协调,but 本文走的吃吐少年路径,就不搞的那么高档了。

那正是说要哪些轻便地实现丰富图片的反馈呢?作者临时想到的是 —— 直接把标题图片发送到有个别站点中去。

这里大家选择今日头条的“日记”功效,它能够Infiniti制上传相关内容。

JavaScript

p.s.,其实这里原本是想平昔把图纸传遍搜狐相册上的,缺憾POST乞请的图形实体须要走 file 格式,即不可能透过脚本改动文件的 input[type=file],转 Blob 再上传也没用,只可以作罢。

1
p.s.,其实这里原本是想直接把图片传到博客园相册上的,可惜POST请求的图片实体要求走 file 格式,即无法通过脚本更改文件的 input[type=file],转 Blob 再上传也没用,只好作罢。

咱俩在治本后台成立日记时,通过 Fiddler 抓包能够看看其央求参数极度轻易:

云顶娱乐每天送6元 8

据此得以一贯组织一个伸手:

JavaScript

//非常图片上传管理 function submit(){ //ajax 提交form $.ajax({ url : '', type : "POST", data : { '__VIEWSTATE': '', '__VIEWSTATEGENERATOR': '4773056F', 'Editor$Edit$txbTitle': '告警' + Date.now(), 'Editor$Edit$EditorBody': '<img src="' + curFrame + '" />', 'Editor$Edit$lkbPost': '保存' }, success: function(){ console.log('submit done') } }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    //异常图片上传处理
    function submit(){
 
        //ajax 提交form
        $.ajax({
            url : 'http://i.cnblogs.com/EditDiary.aspx?opt=1',
            type : "POST",
            data : {
                '__VIEWSTATE': '',
                '__VIEWSTATEGENERATOR': '4773056F',
                'Editor$Edit$txbTitle': '告警' + Date.now(),
                'Editor$Edit$EditorBody': '<img src="' + curFrame + '" />',
                'Editor$Edit$lkbPost': '保存'
            },
            success: function(){
                console.log('submit done')
            }
        });
    }

本来假使央浼页面跟博客园域名分化,是无可奈何发送 cookie 导致诉求跨域而失效,但是那么些很好消除,直接退换 host 就可以(怎么修改就不介绍了,自行百度吗)

自个儿那边改完 host,通过  的地址访谈页面,发掘录制头竟然失效了~

通过Google的文档能够查出,那是为了安全性思考,非 HTTPS 的服务端央浼都不能够对接录制头。但是消除办法也是局地,以 window 系统为例,张开 cmd 命令行面板并固定到 chrome 安装文件夹下,然后施行:

ZSH

chrome --unsafely-treat-insecure-origin-as-secure="" --user-data-dir=C:testprofile

1
chrome --unsafely-treat-insecure-origin-as-secure="http://i.cnblogs.com/h5monitor/final.html"  --user-data-dir=C:testprofile

行动将以沙箱形式张开一个独自的 chrome 进度,并对点名的站点去掉安全范围。注意大家在新开的 chrome 中得重新登陆微博。

此刻便能平日访谈摄像头了,大家对代码做下管理,当差距检验发掘卓殊时,创立一份日记,最小间隔时间为5秒(可是后来察觉没要求,因为乐乎已经有做了光阴范围,大概10秒后本事公布新的日志)

JavaScript

//定时捕获 function timer(delta){ setTimeout(function(){ captureAndSaveFrame(); renderDiff(); if(calcDiff() > 0.2){ //监察和控制到这么些,发日志 submit() } timer(delta) }, delta || 500); } setTimeout(timer, 五千0 * 10); //设定张开页面十分钟后才起来监察和控制//万分图片上传处理 function submit(){ var cache = arguments.callee, now = Date.now(); if(cache.reqTime && (now - cache.reqTime < 5000)) return; //日记创造最小间隔为5秒 cache.reqTime = now; //ajax 提交form $.ajax({ url : '', type : "POST", timeout : 5000, data : { '__VIEWSTATE': '', '__VIEWSTATEGENERATOR': '4773056F', 'Editor$Edit$txbTitle': '告警' + Date.now(), 'Editor$Edit$EditorBody': '<img src="' + curFrame + '" />', 'Editor$Edit$lkbPost': '保存' }, success: function(){ console.log('submit done') }, error: function(err){ cache.reqTime = 0; console.log('error: ' + err) } }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            renderDiff();
            if(calcDiff() > 0.2){  //监控到异常,发日志
                submit()
            }
 
            timer(delta)
        }, delta || 500);
    }
 
    setTimeout(timer, 60000 * 10);  //设定打开页面十分钟后才开始监控
 
 
    //异常图片上传处理
    function submit(){
        var cache = arguments.callee,
            now = Date.now();
        if(cache.reqTime && (now - cache.reqTime < 5000)) return;  //日记创建最小间隔为5秒
 
        cache.reqTime = now;
 
        //ajax 提交form
        $.ajax({
            url : 'http://i.cnblogs.com/EditDiary.aspx?opt=1',
            type : "POST",
            timeout : 5000,
            data : {
                '__VIEWSTATE': '',
                '__VIEWSTATEGENERATOR': '4773056F',
                'Editor$Edit$txbTitle': '告警' + Date.now(),
                'Editor$Edit$EditorBody': '<img src="' + curFrame + '" />',
                'Editor$Edit$lkbPost': '保存'
            },
            success: function(){
                console.log('submit done')
            },
            error: function(err){
                cache.reqTime = 0;
                console.log('error: ' + err)
            }
        });
    }

实行效劳:

云顶娱乐每天送6元 9

日志也是妥妥的出来了:

云顶娱乐每天送6元 10

点开就能够观察这一个的那张图纸了:

云顶娱乐每天送6元 11

要留神的是,今日头条对日记发表数据是有做天天额度限制来防刷的,达到限额的话会导致当天的小说和小说也力不从心公布,所以得严厉运用:

云顶娱乐每天送6元 12

然而这种样式仅能反映异常图片,目前十分的小概让大家马上收悉告警,有意思味的童鞋能够试着再写个 chrome 插件,定时去拉取日记列表做决断,假如有新扩展日记则触发页面 alert。

除此以外我们本来愿意能一贯对闯入者举银行警卫告,那块比较好办 —— 搞个警示的音频,在丰富的时候接触播放就可以:

JavaScript

//播放音频 function fireAlarm(){ audio.play() } //定时捕获 function timer(delta){ setTimeout(function(){ captureAndSaveFrame(); if(preFrame && curFrame){ renderDiff(); if(calcDiff() > 0.2){ //监察和控制到不行 //发日记 submit(); //播放音频告警 fireAlarm(); } } timer(delta) }, delta || 500); } set提姆eout(timer, 四千0 * 10); //设定张开页面十分钟后才开头监察和控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    //播放音频
    function fireAlarm(){
        audio.play()
    }
 
 
    //定时捕获
    function timer(delta){
        setTimeout(function(){
            captureAndSaveFrame();
            if(preFrame && curFrame){
                renderDiff();
                if(calcDiff() > 0.2){  //监控到异常
                    //发日记
                    submit();
                    //播放音频告警
                    fireAlarm();
                }
            }
            timer(delta)
        }, delta || 500);
    }
 
    setTimeout(timer, 60000 * 10);  //设定打开页面十分钟后才开始监控

最终说一下,本文代码均挂在我的github上,有意思味的童鞋能够自助下载。共勉~

1 赞 4 收藏 4 评论

云顶娱乐每天送6元 13

浅谈 JS 创立对象的 8 种形式

2015/10/16 · JavaScript · 对象

初稿出处: Tomson   

  • Objct 模式
  • 工厂情势
  • 构造器情势
  • 因而 Function 对象完毕
  • prototype 模式
  • 构造器与原型格局的掺和形式
  • 动态原型情势
  • 掺杂工厂格局

有意思的CSS标题(6): 全包容的多列均匀布局难点

2016/09/29 · CSS · CSS

正文小编: 伯乐在线 - chokcoco 。未经我许可,禁止转发!
应接加入伯乐在线 专栏撰稿人。

开本种类,研究一些有趣的 CSS 标题,抛开实用性来说,一些难题为了拓展一下化解难题的思路,其它,涉及一些便于忽略的 CSS 细节。

解题不考虑宽容性,标题天马行空,想到如何说哪些,假若解题中有你以为到到生僻的 CSS 属性,赶紧去补习一下啊。

不断更新,不断更新,不断更新,主要的专门的学问说三次。

讨论一些有趣的CSS标题(1): 左边竖条的落到实处方式

座谈一些有趣的CSS标题(2): 从条纹边框的贯彻谈盒子模型

评论一些有意思的CSS标题(3): 层叠顺序与酒店上下文知多少

研究一些有意思的CSS标题(4): 从倒影提及,谈谈 CSS 承继inherit

座谈一些妙不可言的CSS标题(5): 单行居中,两行居左,超越两行省略

负反常汇总在自个儿的 Github 。

 

雅淡的数组降维——Javascript中apply方法的妙用

2016/02/18 · JavaScript · apply, 数组

原来的书文出处: ralph_云顶娱乐每天送6元,zhu   

将多维数组(特别是二维数组)转化为一维数组是事情费用中的常用逻辑,除了选取节约财富的轮回转变以外,大家还足以动用Javascript的语言特征达成更精简温婉的转移。本文将从节俭的循环调换开首,逐条介绍二种常用的调换方法,并借此轻巧回看Array.prototype.concat方法和Function.prototype.apply方法。
以下代码将以把二维数组降维到一维数组为例。

  1. 勤俭的更动

JavaScript

function reduceDimension(arr) { var reduced = []; for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr[i].length; j++) { reduced.push(arr[i][j]); } } return reduced; }

1
2
3
4
5
6
7
8
9
function reduceDimension(arr) {
    var reduced = [];
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr[i].length; j++) {
            reduced.push(arr[i][j]);
        }
    }
    return reduced;
}

此措施思路轻便,利用再度循环遍历二维数组中的种种成分并内置新数组中。

 

  1. 利用concat转换
    先来回想一下MDN上对此该方式的牵线:
    “concat creates a new array consisting of the elements in the object on which it is called, followed in order by, for each argument, the elements of that argument (if the argument is an array) or the argument itself (if the argument is not an array).”

即只要concat方法的参数是一个要素,该因素会被直接插入到新数组中;倘若参数是四个数组,该数组的一一要素将被插入到新数组中;将该性情应用到代码中:

JavaScript

function reduceDimension(arr) { var reduced = []; for (var i = 0; i < arr.length; i++){ reduced = reduced.concat(arr[i]); } return reduced; }

1
2
3
4
5
6
7
function reduceDimension(arr) {
    var reduced = [];
    for (var i = 0; i < arr.length; i++){
        reduced = reduced.concat(arr[i]);
    }
    return reduced;
}

arr的每八个因素都是一个数组,作为concat方法的参数,数组中的每贰个子成分又都会被单独插入进新数组。
采纳concat方法,大家将重新循环简化为了单重循环。

 

  1. 利用apply和concat转换
    根据规矩,先来回看一下MDN上对于apply方法的介绍:
    “The apply() method calls a function with a given this value and arguments provided as an array.”

即apply方法会调用八个函数,apply方法的第三个参数会作为被调用函数的this值,apply方法的第一个参数(三个数组,或类数组的靶子)会作为被调用对象的arguments值,也便是说该数组的一一要素将会挨个成为被调用函数的各种参数;将该天性应用到代码中:

function reduceDimension(arr) { return Array.prototype.concat.apply([], arr); }

1
2
3
function reduceDimension(arr) {
    return Array.prototype.concat.apply([], arr);
}

arr作为apply方法的第3个参数,本人是三个数组,数组中的每七个成分(仍然数组,即二维数组的第二维)会被用作参数依次传入到concat中,效果同样[].concat([1,2], [3,4], [5,6])。
利用apply方法,大家将单重循环优化为了一行代码,很轻易有型有木有啊~

读者也可仿照效法本文思路,本身行使递归达成N维数组降维的逻辑。

3 赞 8 收藏 评论

云顶娱乐每天送6元 14

JS 的 new 到底是干什么的?

2017/04/10 · JavaScript · 4 评论 · new

原版的书文出处: 方应杭   

大多数讲 new 的稿子会从面向对象的思路讲起,不过自身始终以为,在分解贰个东西的时候,不该引进另八个更复杂的事物。

前几天作者从「省代码」的角度来说 new。

—————————

云顶娱乐棋牌,想像我们在创建二个战略类战斗游戏,游戏发烧友能够操作一群士兵攻击对手。

大家根本来探讨一下以此游乐之中的「创建士兵」环节。

八个COO的在Computer里就是一批属性,如下图:

云顶娱乐每天送6元 15

大家只要求如此就能够创建一个士兵:

JavaScript

var 士兵 = { ID: 1, // 用于区分每一种士兵 兵种:"U.S.立小学将", 攻击力:5, 生命值:42, 行走:function(){ /*走俩步的代码*/}, 奔跑:function(){ /*狂奔的代码*/ }, 死亡:function(){ /*Go die*/ }, 攻击:function(){ /*糊他熊脸*/ }, 防御:function(){ /*护脸*/ } } 兵营.制造(士兵)

1
2
3
4
5
6
7
8
9
10
11
12
13
var 士兵 = {
  ID: 1, // 用于区分每个士兵
  兵种:"美国大兵",
  攻击力:5,
  生命值:42,
  行走:function(){ /*走俩步的代码*/},
  奔跑:function(){ /*狂奔的代码*/  },
  死亡:function(){ /*Go die*/    },
  攻击:function(){ /*糊他熊脸*/   },
  防御:function(){ /*护脸*/       }
}
 
兵营.制造(士兵)

1.Object 模式

JavaScript

var o1 = {};//字面量的展现格局 var o2 = new Object; var o3 = new Object(); var o4 = new Object(null); var o5 = new Object(undefined); var o6 = Object.create(Object.prototype);//等价于 var o = {};//即以 Object.prototype 对象为二个原型模板,新建三个以那几个原型模板为原型的对象 //差距 var o7 = Object.create(null);//创造二个原型为 null 的靶子

1
2
3
4
5
6
7
8
var o1 = {};//字面量的表现形式
var o2 = new Object;
var o3 = new Object();
var o4 = new Object(null);
var o5 = new Object(undefined);
var o6 = Object.create(Object.prototype);//等价于 var o = {};//即以 Object.prototype 对象为一个原型模板,新建一个以这个原型模板为原型的对象
//区别
var o7 = Object.create(null);//创建一个原型为 null 的对象

在 chrome 里查看各种新建对象的区分:
云顶娱乐每天送6元 16

能够见见前6种情势开创下来的目的都以一律的,第八种分裂点在于其即使也为 Object 对象但其无其余性质(包蕴未有其余能够一而再的天性,因为创造的时候未有一些名其原型)

6、全兼容的多列均匀布局难点

哪些促成下列这种多列均匀布局(图中央直属机关线为了突显容器宽度,不算在内):

云顶娱乐每天送6元 17

 

创制九十几个兵士

如果必要创设 100 个兵士如何是好吧?

循环 100 次吧:

JavaScript

var 士兵们 = [] var 士兵 for(var i=0; i<100; i++){ 士兵 = { ID: i, // ID 不能够重复 兵种:"United States战士", 攻击力:5, 生命值:42, 行走:function(){ /*走俩步的代码*/}, 奔跑:function(){ /*狂奔的代码*/ }, 死亡:function(){ /*Go die*/ }, 攻击:function(){ /*糊他熊脸*/ }, 防御:function(){ /*护脸*/ } } 士兵们.push(士兵) } 兵营.批量制造(士兵们)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var 士兵们 = []
var 士兵
for(var i=0; i<100; i++){
  士兵 = {
    ID: i, // ID 不能重复
    兵种:"美国大兵",
    攻击力:5,
    生命值:42,
    行走:function(){ /*走俩步的代码*/},
    奔跑:function(){ /*狂奔的代码*/  },
    死亡:function(){ /*Go die*/    },
    攻击:function(){ /*糊他熊脸*/   },
    防御:function(){ /*护脸*/       }
  }
  士兵们.push(士兵)
}
 
兵营.批量制造(士兵们)

咦哎好轻巧。

本文由云顶娱乐棋牌发布于云顶娱乐棋牌,转载请注明出处:【云顶娱乐棋牌】创制对象的,高雅的数组降维

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。