亚洲必赢登录 > 亚洲必赢app > 写二个区块链,前端常见跨域技术方案

原标题:写二个区块链,前端常见跨域技术方案

浏览次数:194 时间:2019-10-08

前面三个常见跨域技术方案(全)

2017/09/14 · 基本功技巧 · 3 评论 · 跨域

原稿出处: 安静de沉淀   

何以小编为css变量如此喜悦

2016/01/01 · CSS · 变量

原来的小讲出处: Philip Walton   译文出处:腾讯ISUX   

多少个礼拜前,CSS Variables ——CSS 变量草案公布在了W3C官方 ,更确切的应当叫CSS 自定义属性,目前在Chrome Canary 版里面已经支撑,开启该意义见附[1]

当Chrome浏览器程序猿Addy Osmani第一时间把这音讯公布在twitter后,遭到了数万人的否定、敌视和怀疑。于本人来讲,更加的多的以为到是贰个惊奇,因为那些职能实在令人太开心了。

迅猛的扫了二遍之后,开采99%人抱怨的无外乎这两点:

  • 语法太丑和非常不足简洁
  • Sass 、Less早已有这几个实物了,不太care

就算如此自己料定本身也对那语法很恨恶,更注重的是清楚语法不只是频频无常的在挑选。CSS专门的学业组研究十分久语法的长度,他们领取了一部分点,思虑到CSS的语法包容不会与前景净增的别样语言争论。

CSS 预管理器是一个要命优异的工具,可是它们的变量是静态的,有语法效能域。Native CSS 变量,从另一面来看,它们是三个完全不一致门类的变量:因为它们是动态的,他们的功能域是DOM,事实上,那也是纠结该不应该称他们为变量,它们其实是CSS 属性,这也给了她们二个空子,来消除那几个功用完全不一样的标题。

在那篇小说中,我将切磋一些CSS 自定义属性那一个成效,并且不要CSS 预处理器来做。当然作者还身体力行一些新的设计方式,自定义功用的启用。小说最终斟酌一下,笔者认为在将来最有望的是预管理变量和自定义变量一同使用,七个东西群策群力,相得益彰。

留神:这篇小说不是介绍CSS 自定义属性,如若您还平昔没听他们说过她们,素不相识他们是哪些做事的,能够看看这里

难以置信的纯 CSS 导航栏下划线跟随效果

2018/04/02 · CSS · 下划线

正文作者: 伯乐在线 - chokcoco 。未经小编许可,禁绝转发!
款待加入伯乐在线 专栏撰稿人。

先上张图,如何运用纯 CSS 制作如下效果?

亚洲必赢app 1

在承接读书下文从前,你能够先缓一缓。尝试思量一下方面包车型客车功能依旧动手尝试一下,不借助于 JS ,能还是不能够奇妙的落成上述效用。

OK,继续。那些效果是本人在业务开支的进程中相遇的三个像样的不奇怪。其实就是让本身借助 Javascript ,小编的率先反响也是,认为很艰难啊。所以小编一向在想,有未有极大可能率只使用 CSS 实现这一个职能啊?

 

别慌,不正是跨域么!

2017/12/27 · 基本功技能 · 跨域

原稿出处: Neal_yang   

前端开辟中,跨域使大家平时遇上的三个难点,也是面试中时常被问到的有的主题材料,所以,这里,大家做个小结。小符合规律,不足顾忌

用 JavaScript 写三个区块链

2018/04/09 · CSS · 区块链

初稿出处: Xavier Decuyper   译文出处:百度外送食物前端/JeLewine   

亚洲必赢app 2

大约种种人都听别人讲过像比特币和以太币这样的加密钱币,可是唯有极少数人领悟隐敝在它们背后的技巧。在那篇博客中,小编将会用JavaScript来创立多个简便的区块链来演示它们的当中终究是咋办事的。作者将会称之为SavjeeCoin!全文分为多个部分:

  1. part1:达成三个主干的区块链
  2. part2:实现POW
  3. part3:交易与挖矿奖励

何以是跨域?

跨域是指三个域下的文书档案或脚本准备去伏乞另贰个域下的能源,这里跨域是广义的。

广义的跨域:

1.) 财富跳转: A链接、重定向、表单提交 2.) 能源嵌入:<link>、<script>、<img>、<frame>等dom标签,还应该有样式中background:url()、@font-face()等文件外链 3.) 脚本央求: js发起的ajax央求、dom和js对象的跨域操作等

1
2
3
1.) 资源跳转: A链接、重定向、表单提交
2.) 资源嵌入:<link>、<script>、<img>、<frame>等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操作等

其实我们习感到常所说的跨域是狭义的,是由浏览器同源战略限制的一类要求场景。

怎样是同源计谋?
同源战术/SOP(Same origin policy)是一种约定,由Netscape公司一九九二年引进浏览器,它是浏览器最大旨也最核泛酸心得安全作用,假使缺乏了同源战略,浏览器很轻易遇到XSS、CSF福睿斯等攻击。所谓同源是指”公约+域名+端口”三者一致,尽管四个分歧的域名指向同一个ip地址,也非同源。

同源战略限制之下三种表现:

1.) Cookie、LocalStorage 和 IndexDB 不可能读取 2.) DOM 和 Js对象不或然取得3.) AJAX 央浼不能够发送

1
2
3
1.) Cookie、LocalStorage 和 IndexDB 无法读取
2.) DOM 和 Js对象无法获得
3.) AJAX 请求不能发送

预管理器变量的范围

在后续写从前,作者想重申的是,作者真正很欣赏CSS 预处理器,笔者的具有品种都在使用它。预管理器做了一件特别巨大的事务,即时你领悟她最后出来的正是固有的CSS,任然能够感受这些神器的一代。

其他工具,都有她的局限性,有一个炫丽的外观会令人欢跃而忽略了里面包车型的士界定,非常是新顾客。

概念供给

作者们定义一下轻易易行的法规,供给如下:

  • 一旦 HTML 结构如下:
&lt;ul&gt; &lt;li&gt;不可思议的CSS&lt;/li&gt;
&lt;li&gt;导航栏&lt;/li&gt; &lt;li&gt;光标小下划线跟随&lt;/li&gt;
&lt;li&gt;PURE CSS&lt;/li&gt; &lt;li&gt;Nav Underline&lt;/li&gt;
&lt;/ul&gt;

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f6b0473490387173502-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6b0473490387173502-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f6b0473490387173502-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6b0473490387173502-4">
4
</div>
<div class="crayon-num" data-line="crayon-5b8f6b0473490387173502-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6b0473490387173502-6">
6
</div>
<div class="crayon-num" data-line="crayon-5b8f6b0473490387173502-7">
7
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f6b0473490387173502-1" class="crayon-line">
&lt;ul&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-2" class="crayon-line crayon-striped-line">
  &lt;li&gt;不可思议的CSS&lt;/li&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-3" class="crayon-line">
  &lt;li&gt;导航栏&lt;/li&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-4" class="crayon-line crayon-striped-line">
  &lt;li&gt;光标小下划线跟随&lt;/li&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-5" class="crayon-line">
  &lt;li&gt;PURE CSS&lt;/li&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-6" class="crayon-line crayon-striped-line">
  &lt;li&gt;Nav Underline&lt;/li&gt;
</div>
<div id="crayon-5b8f6b0473490387173502-7" class="crayon-line">
&lt;/ul&gt;
</div>
</div></td>
</tr>
</tbody>
</table>
  • 导航栏指标 li 的增长幅度是不固定的
  • 当从导航的左侧 li 移向左边 li,下划线从左往右移动。同理,当从导航的侧面 li 移向左边 li,下划线从右往左移动。

 

怎样是跨域

跨域,是指浏览器无法试行其他网址的台本。它是由浏览器的同源战略产生的,是浏览器对JavaScript实施的安全范围。

同源战术限制了弹指间行事:

Cookie、LocalStorage 和 IndexDB 无法读取
DOM 和 JS 对象不可能获得
Ajax央浼发送不出来

Part1:达成二个为主的区块链

广阔跨域场景

U卡宴L 表明 是不是允许通讯 同一域名,分化文件或路线 允许 同一域名,分化端口 分裂意 同一域名,不一致协商 不一样意 域名和域名对应一样ip 不容许 主域同样,子域不同不容许 分歧域名 不允许

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
URL                                      说明                    是否允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js         同一域名,不同文件或路径           允许
http://www.domain.com/lab/c.js
 
http://www.domain.com:8000/a.js
http://www.domain.com/b.js         同一域名,不同端口                不允许
http://www.domain.com/a.js
https://www.domain.com/b.js        同一域名,不同协议                不允许
http://www.domain.com/a.js
http://192.168.4.12/b.js           域名和域名对应相同ip              不允许
http://www.domain.com/a.js
http://x.domain.com/b.js           主域相同,子域不同                不允许
http://domain.com/c.js
http://www.domain1.com/a.js
http://www.domain2.com/b.js        不同域名                         不允许

Preprocessor variables aren’t live

想必受预管理范围,在媒体询问中,最布满的新手也无力戏弄定义变量或应用@extend

<code> $gutter: 1em; @media (min-width: 30em) { $gutter: 2em; } .Container { padding: $gutter; } </code>

1
2
3
4
5
6
7
8
9
10
11
<code>
$gutter: 1em;
 
@media (min-width: 30em) {
  $gutter: 2em;
}
 
.Container {
  padding: $gutter;
}
</code>

设若您编写翻译下面的代码,你取得是:

CSS

.Container { padding: 1em; }

1
2
3
.Container {
  padding: 1em;
}

如您所见,媒体询问被扬弃,变量赋值被忽视。

从理论上讲,尽管sass 担负证明条件变量,但那样做也是二个挑衅,枚举全部Permutations—exponentially 会扩充CSS的最后大小。

完毕要求

率先眼看见这一个成效,感觉那个跟随动画,仅靠 CSS 是不也许达成的。

要是想只用 CSS 达成,只可以另辟蹊径,使用部分别得到益的方法。

好,上边就依附一些奇技淫巧,使用 CSS 一步一步成功那些职能。深入分析一下难关:

常见的跨域场景

所谓的同源是指,域名、协议、端口均为同样。

JavaScript

调用 非跨域 调用 跨域,主域区别 调用 跨域,子域名差异 调用 跨域,端口分裂 调用 跨域,合同分歧 localhost 调用 127.0.0.1 跨域

1
2
3
4
5
6
7
8
9
10
11
http://www.nealyang.cn/index.html 调用   http://www.nealyang.cn/server.php  非跨域
 
http://www.nealyang.cn/index.html 调用   http://www.neal.cn/server.php  跨域,主域不同
 
http://abc.nealyang.cn/index.html 调用   http://def.neal.cn/server.php  跨域,子域名不同
 
http://www.nealyang.cn:8080/index.html 调用   http://www.nealyang.cn/server.php  跨域,端口不同
 
https://www.nealyang.cn/index.html 调用   http://www.nealyang.cn/server.php  跨域,协议不同
 
localhost   调用 127.0.0.1 跨域

跨域的化解办法
jsonp跨域

jsonp跨域其实也是JavaScript设计方式中的一种代理情势。在html页面中经过相应的标签从分裂域名下加载静态能源文件是被浏览器允许的,所以大家得以经过那些“犯罪漏洞”来进展跨域。日常,大家得以动态的创设script标签,再去央浼一个带参网站来落到实处跨域通讯

JavaScript

//原生的落实情势 let script = document.createElement('script'); script.src = ''; document.body.appendChild(script); function callback(res) { console.log(res); }

1
2
3
4
5
6
7
8
9
10
//原生的实现方式
let script = document.createElement('script');
 
script.src = 'http://www.nealyang.cn/login?username=Nealyang&callback=callback';
 
document.body.appendChild(script);
 
function callback(res) {
  console.log(res);
}

本来,jquery也支撑jsonp的落实形式

JavaScript

$.ajax({ url:'', type:'GET', dataType:'jsonp',//央求格局为jsonp jsonpCallback:'callback', data:{ "username":"Nealyang" } })

1
2
3
4
5
6
7
8
9
$.ajax({
    url:'http://www.nealyang.cn/login',
    type:'GET',
    dataType:'jsonp',//请求方式为jsonp
    jsonpCallback:'callback',
    data:{
        "username":"Nealyang"
    }
})

即便如此这种艺术要命好用,但是贰个最大的毛病是,只好够完结get央浼
document.domain + iframe 跨域

这种跨域的秘诀最重要的是要求主域名同样。什么是主域名一样呢? www.nealyang.cn aaa.nealyang.cn ba.ad.nealyang.cn 这两个主域名都以nealyang.cn,而主域名差异的就不可能用此方式。

固然近年来a.nealyang.cn 和 b.nealyang.cn 分别对应指向分化ip的服务器。

a.nealyang.cn 下有三个test.html文件

JavaScript

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>html</title> <script type="text/javascript" src = "jquery-1.12.1.js"></script> </head> <body> <div>A页面</div> <iframe style = "display : none" name = "iframe1" id = "iframe" src="" frameborder="0"></iframe> <script type="text/javascript"> $(function(){ try{ document.domain = "nealyang.cn" }catch(e){} $("#iframe").load(function(){ var jq = document.getElementById('iframe').contentWindow.$ jq.get(" console.log(data); }); }) }) </script> </body> </html>

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
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>html</title>
    <script type="text/javascript" src = "jquery-1.12.1.js"></script>
</head>
<body>
    <div>A页面</div>
    <iframe
    style = "display : none"
    name = "iframe1"
    id = "iframe"
    src="http://b.nealyang.cn/1.html" frameborder="0"></iframe>
    <script type="text/javascript">
        $(function(){
            try{
                document.domain = "nealyang.cn"
            }catch(e){}
            $("#iframe").load(function(){
                var jq = document.getElementById('iframe').contentWindow.$
                jq.get("http://nealyang.cn/test.json",function(data){
                    console.log(data);
                });
            })
        })
    </script>
</body>
</html>

运用 iframe 加载 别的域下的文书(nealyang.cn/1.html), 同有的时候间document.domain 设置成 nealyang.cn ,当 iframe 加载完成后就可以拿走 nealyang.cn 域下的大局对象, 此时尝试着去央浼 nealyang.cn 域名下的 test.json (此时能够诉求接口),就能够意识数目要求失利了~~ 惊不欣喜,意不奇怪!!!!!!!

数量诉求退步,目标绝非达标,自然是还少一步:

JavaScript

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>html</title> <script type="text/javascript" src = "jquery-1.12.1.js"></script> <script type="text/javascript"> $(function(){ try{ document.domain = "nealyang.com" }catch(e){} }) </script> </head> <body> <div id = "div1">B页面</div> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>html</title>
    <script type="text/javascript" src = "jquery-1.12.1.js"></script>
    <script type="text/javascript">
        $(function(){
            try{
                document.domain = "nealyang.com"
            }catch(e){}
        })
    </script>
</head>
<body>
    <div id = "div1">B页面</div>
</body>
</html>

此刻在进行刷新浏览器,就能够开掘数目这一次实在是成功了~
window.name + iframe 跨域

window.name属性可安装大概重返存放窗口名称的一个字符串。他的神器之处在于name值在分歧页面大概差异域下加载后还是存在,未有改换就不会产生变化,并且能够积存相当长的name(2MB)

举例index页面央浼远端服务器上的多寡,大家在该页面下创立iframe标签,该iframe的src指向服务器文件的地址(iframe标签src可以跨域),服务器文件里安装好window.name的值,然后再在index.html里面读取改iframe中的window.name的值。完美~

JavaScript

<body> <script type="text/javascript"> iframe = document.createElement('iframe'), iframe.src = ''; document.body.appendChild(iframe); iframe.onload = function() { console.log(iframe.contentWindow.name) }; </script> </body>

1
2
3
4
5
6
7
8
9
10
<body>
  <script type="text/javascript">
    iframe = document.createElement('iframe'),
    iframe.src = 'http://localhost:8080/data.php';
    document.body.appendChild(iframe);
    iframe.onload = function() {
      console.log(iframe.contentWindow.name)
    };
  </script>
</body>

当然,那样依然相当不足的。

因为规定一经index.html页面和和该页面里的iframe框架的src要是区别源,则也无力回天操作框架里的别的东西,所以就取不到iframe框架的name值了,告诉你大家不是一家的,你也不要获得作者那边的数目。 既然要同源,那就换个src去指,前边说了无论怎么着加载window.name值都不会变动,于是大家在index.html一样目录下,新建了个proxy.html的空页面,修改代码如下:

 

JavaScript

<body> <script type="text/javascript"> iframe = document.createElement('iframe'), iframe.src = ''; document.body.appendChild(iframe); iframe.onload = function() { iframe.src = ''; console.log(iframe.contentWindow.name) }; </script> </body>

1
2
3
4
5
6
7
8
9
10
11
<body>
  <script type="text/javascript">
    iframe = document.createElement('iframe'),
    iframe.src = 'http://localhost:8080/data.php';
    document.body.appendChild(iframe);
    iframe.onload = function() {
      iframe.src = 'http://localhost:81/cross-domain/proxy.html';
      console.log(iframe.contentWindow.name)
    };
  </script>
</body>

地利人和就像是绝对美丽好,在iframe载入过程中,连忙重新载入参数iframe.src的针对,使之与index.html同源,那么index页面就会去赢得它的name值了!不过具体是狂暴的,iframe在具体中的表现是一贯不停地刷新, 也很好领悟,每一次触发onload时间后,重新初始化src,约等于重新载入页面,又触发onload事件,于是就不停地刷新了(但是须求的数量还是可以够出口的)。修改后代码如下:

JavaScript

<body> <script type="text/javascript"> iframe = document.createElement('iframe'); iframe.style.display = 'none'; var state = 0; iframe.onload = function() { if(state === 1) { var data = JSON.parse(iframe.contentWindow.name); console.log(data); iframe.contentWindow.document.write(''); iframe.contentWindow.close(); document.body.removeChild(iframe); } else if(state === 0) { state = 1; iframe.contentWindow.location = ''; } }; iframe.src = ''; document.body.appendChild(iframe); </script> </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<body>
  <script type="text/javascript">
    iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    var state = 0;
    
    iframe.onload = function() {
      if(state === 1) {
          var data = JSON.parse(iframe.contentWindow.name);
          console.log(data);
          iframe.contentWindow.document.write('');
          iframe.contentWindow.close();
        document.body.removeChild(iframe);
      } else if(state === 0) {
          state = 1;
          iframe.contentWindow.location = 'http://localhost:81/cross-domain/proxy.html';
      }
    };
 
    iframe.src = 'http://localhost:8080/data.php';
    document.body.appendChild(iframe);
  </script>
</body>

因此如上,大家就获得了服务器重回的数据,但是有几个规格是少不了的:

iframe标签的跨域技巧
window.names属性值在文书档案刷新后依旧存在的力量

location.hash + iframe 跨域

此跨域方法和上边介绍的可比像样,同样是动态插入二个iframe然后安装其src为服务端地址,而服务端同样输出一端js代码,也还要经过与子窗口之间的通讯来形成多少的传导。

有关锚点相信大家都早已驾驭了,其实就是安装锚点,让文书档案钦命的应和的地方。锚点的安装用a标签,然后href指向要跳转到的id,当然,前提是你得有个滚动条,不然也糟糕滚动嘛是啊。

而location.hash其实就是url的锚点。例如

基础知识补充达成,上面大家来讲下什么样贯彻跨域

假设index页面要获取远端服务器的数据,动态的插入七个iframe,将iframe的src实施服务器的地址,那时候的top window 和打包那几个iframe的子窗口是不能通信的,因为同源策略,所以改造子窗口的路子就足以了,将数据作为改造后的门道的hash值加载路线上,然后就足以通讯了。将数据加在index页面地址的hash上, index页面监听hash的变通,h5的hashchange方法

JavaScript

<body> <script type="text/javascript"> function getData(url, fn) { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; iframe.onload = function() { fn(iframe.contentWindow.location.hash.substring(1)); window.location.hash = ''; document.body.removeChild(iframe); }; document.body.appendChild(iframe); } // get data from server var url = ''; getData(url, function(data) { var jsondata = JSON.parse(data); console.log(jsondata.name + ' ' + jsondata.age); }); </script> </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<body>
  <script type="text/javascript">
    function getData(url, fn) {
      var iframe = document.createElement('iframe');
      iframe.style.display = 'none';
      iframe.src = url;
 
      iframe.onload = function() {
        fn(iframe.contentWindow.location.hash.substring(1));
        window.location.hash = '';
        document.body.removeChild(iframe);
      };
 
      document.body.appendChild(iframe);
    }
 
    // get data from server
    var url = 'http://localhost:8080/data.php';
    getData(url, function(data) {
      var jsondata = JSON.parse(data);
      console.log(jsondata.name + ' ' + jsondata.age);
    });
  </script>
</body>

补偿表达:其实location.hash和window.name都是大半的,都以运用全局对象属性的章程,然后那三种办法和jsonp也是同一的,便是只可以够实现get诉求

postMessage跨域

那是由H5提议来的三个绚烂的API,IE8+,chrome,ff都已经援救落到实处了那个意义。那几个意义也是可怜的简练,当中包涵接受音讯的Message时间,和发送音信的postMessage方法。

发送新闻的postMessage方法是向外围窗口发送音讯

JavaScript

otherWindow.postMessage(message,targetOrigin);

1
otherWindow.postMessage(message,targetOrigin);

otherWindow指的是目的窗口,相当于要给哪二个window发送新闻,是window.frames属性的分子要么是window.open方法创制的窗口。 Message是要发送的新闻,类型为String,Object(IE8、9不协助Obj),targetOrigin是限制新闻接受范围,不限定就用星号 *

经受音信的message事件

JavaScript

var onmessage = function(event) { var data = event.data; var origin = event.origin; } if(typeof window.addEventListener != 'undefined'){ window.addEventListener('message',onmessage,false); }else if(typeof window.attachEvent != 'undefined'){ window.attachEvent('onmessage', onmessage); }

1
2
3
4
5
6
7
8
9
10
var onmessage = function(event) {
  var data = event.data;
  var origin = event.origin;
}
 
if(typeof window.addEventListener != 'undefined'){
    window.addEventListener('message',onmessage,false);
}else if(typeof window.attachEvent != 'undefined'){
    window.attachEvent('onmessage', onmessage);
}

举个栗子

a.html()

JavaScript

<iframe id="iframe" src="" style="display:none;"></iframe> <script> var iframe = document.getElementById('iframe'); iframe.onload = function() { var data = { name: 'aym' }; // 向neal传送跨域数据 iframe.contentWindow.postMessage(JSON.stringify(data), ''); }; // 接受domain2重回数据 window.add伊夫ntListener('message', function(e) { alert('data from neal ---> ' + e.data); }, false); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<iframe id="iframe" src="http://www.neal.cn/b.html" style="display:none;"></iframe>
<script>      
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {
        var data = {
            name: 'aym'
        };
        // 向neal传送跨域数据
        iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.neal.cn');
    };
 
    // 接受domain2返回数据
    window.addEventListener('message', function(e) {
        alert('data from neal ---> ' + e.data);
    }, false);
</script>

b.html()

JavaScript

<script> // 接收domain1的数量 window.addEventListener('message', function(e) { alert('data from nealyang ---> ' + e.data); var data = JSON.parse(e.data); if (data) { data.number = 16; // 管理后再发回nealyang window.parent.postMessage(JSON.stringify(data), ''); } }, false); </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
    // 接收domain1的数据
    window.addEventListener('message', function(e) {
        alert('data from nealyang ---> ' + e.data);
 
        var data = JSON.parse(e.data);
        if (data) {
            data.number = 16;
 
            // 处理后再发回nealyang
            window.parent.postMessage(JSON.stringify(data), 'http://www.nealyang.cn');
        }
    }, false);
</script>

区块链

区块链是由五个个任什么人都得以访谈的区块构成的共用数据库。那类似没什么特其他,可是它们有贰个风趣的品质:它们是不可变的。一旦叁个区块被增加到区块链中,除非让多余的别的区块失效,不然它是不会再被转移的。

那便是干什么加密货币是依附区块链的原因。你一定不指望大家在贸易造成后再改造交易!

跨域实施方案

1、 通过jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域能源分享(COEscortS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket议和跨域

预管理器变量不能够级联(层叠)

每当你选择变量,作用域的范围不可防止,这么些变量应该全局吗?应该是file/module?照旧块作用域?

CSS 最后是为HTML的体制,事实注明还应该有其余一种有效的法子是变量的界定:DOM 成分,不过preprocessors无法运作在浏览器且从未见到标识

参照二个网址,试图给` 的元素添加一个 classuser-setting-large-text他们更倾向于更大的文本大小 。 一旦这个class设置,更大$font-size`变量赋值就能够使用:

CSS

$font-size: 1em; .user-setting-large-text { $font-size: 1.5em; } body { font-size: $font-size; }

1
2
3
4
5
6
7
8
9
  $font-size: 1em;
 
.user-setting-large-text {
  $font-size: 1.5em;
}
 
body {
  font-size: $font-size;
}

唯独,就疑似上边媒体询问例子,Sass 直接忽略变量赋值, 意味着这种事是不容许的。他输出的:

CSS

body { font-size: 1em; }

1
2
3
  body {
  font-size: 1em;
}

宽窄不稳定

第两个难点, li 的宽窄是不定点的。所以,大家大概供给从 li 自己的大幅度上做小说。

既是每一种 li 的大幅度不自然,那么它对应的下划线的长短,料定是是要和他自己相适应的。放任自流,大家就能够想到利用它的 border-bottom

li { border-bottom: 2px solid #000; }

1
2
3
li {
    border-bottom: 2px solid #000;
}

那正是说,大概以后是那样子的(li 之间是接踵而至 蜂拥而至在联合的,li 间的空闲使用 padding 产生):

亚洲必赢app 3

跨域能源分享 COENVISIONS

因为是现阶段主流的跨域施工方案。所以这里多介绍点。
简介

CO安德拉S是一个W3C标准,全称是”跨域财富分享”(Cross-origin resource sharing)。 它同意浏览器向跨源服务器,发出XMLHttpRequest央浼,进而打败了AJAX只可以同源使用的范围。

CO中华VS必要浏览器和服务器同一时候援救。近期,全数浏览器都协理该成效,IE浏览器不能够低于IE10。IE8+:IE8/9急需运用XDomainRequest对象来支撑COTucsonS。

全套COOdysseyS通讯进度,都以浏览器自动完结,无需客户加入。对于开垦者来讲,CO奥迪Q3S通讯与同源的AJAX通讯未有距离,代码完全平等。浏览器一旦开采AJAX央求跨源,就能够活动抬高级中学一年级些叠合的头音讯,偶然还有大概会多出叁次附加的乞求,但顾客不会有以为。 因此,完结COCR-VS通讯的重要性是服务器。只要服务器落成了COPAJEROS接口,就足以跨源通讯。
三种伏乞

聊起来很好笑,分为三种央浼,一种是粗略诉求,另一种是非简单伏乞。只要满足下边条件就是差相当少央求

呼吁方式为HEAD、POST 或许 GET
http头消息不超过一下字段:Accept、Accept-Language 、 Content-Language、 Last-Event-ID、 Content-Type(限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain)

何以要分成简单央浼和非简单诉求,因为浏览器对那三种伏乞情势的管理方式是例外的。
大致诉求
基本流程

对于简易需要,浏览器直接爆发COLacrosseS诉求。具体来讲,正是在头音信之中,扩大三个Origin字段。 上面是叁个例证,浏览器开采这一次跨源AJAX须要是轻松央求,就自行在头音信之中,增多三个Origin字段。

JavaScript

GET /cors HTTP/1.1 Origin: Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0 ...

1
2
3
4
5
6
7
GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0
...

Origin字段用来申明,此番乞请来自哪个源(契约 + 域名 + 端口)。服务器依据这几个值,决定是或不是允许此番诉求。

假设Origin内定的源,不在许可限制内,服务器会重回贰个好端端的HTTP回应。 浏览器开掘,那些答复的头音讯未有包罗Access-Control-Allow-Origin字段(详见下文),就通晓出错了,进而抛出一个不当,被XMLHttpRequest的onerror回调函数捕获。

只顾,这种错误不也许通过情状码识别,因为HTTP回应的状态码有异常的大希望是200。

如果Origin钦定的域名在许可范围内,服务器重回的响应,会多出多少个头音信字段。

JavaScript

Access-Control-Allow-Origin: Access-Control-Allow-Credentials: true Access-Control-Expose-Headers: FooBar Content-Type: text/html; charset=utf-8

1
2
3
4
   Access-Control-Allow-Origin: http://api.bob.com
   Access-Control-Allow-Credentials: true
   Access-Control-Expose-Headers: FooBar
   Content-Type: text/html; charset=utf-8

下面的头消息之中,有多少个与COTiguanS乞求相关的字段,都以Access-Control-最早

  • Access-Control-Allow-Origin :该字段是必需的。它的值要么是伸手时Origin字段的值,要么是多少个*,表示接受任性域名的乞请
  • Access-Control-Allow-Credentials: 该字段可选。它的值是三个布尔值,表示是或不是允许发送Cookie。暗中认可情况下,Cookie不包括在COLX570S诉求之中。设为true,即表示服务器显著批准,Cookie能够分包在呼吁中,一齐发给服务器。那一个值也不得不设为true,如若服务器不要浏览器发送Cookie,删除该字段就可以。
  • Access-Control-Expose-Headers:该字段可选。CO途观S乞请时,XMLHttpRequest对象的getResponseHeader()方法只好获得6个着力字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。若是想获得任何字段,就必需在Access-Control-Expose-Headers里面钦命。

withCredentials 属性

上边提起,COHighlanderS乞请暗许不发送库克ie和HTTP认证音信。倘诺要把Cookie发到服务器,一方面要服务器同意,钦命Access-Control-Allow-Credentials字段。

一边,开拓者必需在AJAX供给中开荒withCredentials属性。

JavaScript

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest宽容 // 前端安装是不是带cookie xhr.withCredentials = true; xhr.open('post', '', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('user=admin'); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } }; // jquery $.ajax({ ... xhrFields: { withCredentials: true // 前端安装是或不是带cookie }, crossDomain: true, // 会让伏乞头中包罗跨域的附加音信,但不会含cookie ... });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容
 
// 前端设置是否带cookie
xhr.withCredentials = true;
 
xhr.open('post', 'http://www.domain2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');
 
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};
 
// jquery
$.ajax({
    ...
   xhrFields: {
       withCredentials: true    // 前端设置是否带cookie
   },
   crossDomain: true,   // 会让请求头中包含跨域的额外信息,但不会含cookie
    ...
});

不然,固然服务器同意发送Cookie,浏览器也不会发送。或许,服务器须要安装Cookie,浏览器也不会管理。 可是,假如省略withCredentials设置,有的浏览器还是会联手发送Cookie。那时,能够显式关闭withCredentials。

须要注意的是,假若要发送Cookie,Access-Control-Allow-Origin就无法设为星号,必得钦命鲜明的、与乞请网页一致的域名。同期,Cookie照旧根据同源政策,唯有用服务器域名设置的Cookie才会上传,其余域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也不可能读取服务器域名下的Cookie。
非轻易哀告

非轻便央求是那种对服务器有特殊供给的呼吁,举例须要方法是PUT或DELETE,或许Content-Type字段的品种是application/json。

非轻松乞求的CO奥迪Q5S央求,会在正式通讯以前,扩展三次HTTP查询哀告,称为”预检”央求(preflight)。

浏览器先通晓服务器,当前网页所在的域名是还是不是在服务器的批准名单之中,以及能够动用什么HTTP动词和头音信字段。独有猎取一定回应,浏览器才会发出正式的XMLHttpRequest伏乞,不然就报错。

JavaScript

var url = ''; var xhr = new XMLHttpRequest(); xhr.open('PUT', url, true); xhr.setRequestHeader('X-Custom-Header', 'value'); xhr.send();

1
2
3
4
5
var url = 'http://api.alice.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();

浏览器开采,那是三个非轻巧央浼,就机关发出一个”预检”央浼,供给服务器确认能够如此央求。上面是这么些”预检”央求的HTTP头消息。

JavaScript

OPTIONS /cors HTTP/1.1 Origin: Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...

1
2
3
4
5
6
7
8
    OPTIONS /cors HTTP/1.1
   Origin: http://api.bob.com
   Access-Control-Request-Method: PUT
   Access-Control-Request-Headers: X-Custom-Header
   Host: api.alice.com
   Accept-Language: en-US
   Connection: keep-alive
   User-Agent: Mozilla/5.0...

“预检”央浼用的要求方法是OPTIONS,表示那个要求是用来打探的。头消息里面,关键字段是Origin,表示需要来自哪个源。

除了Origin字段,”预检”乞求的头音信包含七个独特字段。

Access-Control-Request-Method:该字段是必需的,用来列出浏览器的CO帕杰罗S乞请会用到哪边HTTP方法,上例是PUT。
Access-Control-Request-Headers:该字段是贰个逗号分隔的字符串,钦命浏览器COCRUISERS央浼会附加发送的头音讯字段,上例是X-Custom-Header

预检央求的作答

服务器收到”预检”央浼现在,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段现在,确认允许跨源央求,就能够做出答复

JavaScript

HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 01:15:39 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain

1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

地方的HTTP回应中,关键的是Access-Control-Allow-Origin字段,表示

借使浏览器否定了”预检”诉求,会回到贰个正常化的HTTP回应,不过并未有其他CO奥迪Q5S相关的头音信字段。那时,浏览器就能够肯定,服务器差异意预检央求,因而触发三个错误,被XMLHttpRequest对象的onerror回调函数捕获。调节台会打字与印刷出如下的报错音讯。

服务器回应的其余CO哈弗S相关字段如下:

JavaScript

亚洲必赢app,Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Access-Control-Allow-Credentials: true Access-Control-Max-Age: 1728000

1
2
3
4
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
  • Access-Control-Allow-Methods:该字段必须,它的值是逗号分隔的二个字符串,表明服务器帮衬的享有跨域须求的议程。注意,重临的是怀有扶助的措施,而不单是浏览器央求的百般格局。那是为着制止频仍”预检”诉求。
  • Access-Control-Allow-Headers:假若浏览器央求包罗Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是须要的。它也是一个逗号分隔的字符串,申明服务器援助的保有头新闻字段,不限于浏览器在”预检”中呼吁的字段。
  • Access-Control-Allow-Credentials: 该字段与轻巧诉求时的意义同样。
  • Access-Control-马克斯-Age: 该字段可选,用来内定本次预检伏乞的有效期,单位为秒。上边结果中,保质期是20天(172七千秒),即允许缓存该条回应172捌仟秒(即20天),在此期间,不用发出另一条预检诉求。

浏览器平常伏乞应对

即使服务器通过了”预检”央浼,现在每一趟浏览器平常的COWranglerS伏乞,就都跟轻松供给同样,会有一个Origin头信息字段。服务器的应对,也都会有一个Access-Control-Allow-Origin头消息字段。

JavaScript

PUT /cors HTTP/1.1 Origin: Host: api.alice.com X-Custom-Header: value Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...

1
2
3
4
5
6
7
PUT /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
X-Custom-Header: value
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

浏览器的常规CO瑞虎S央求。上边头音讯的Origin字段是浏览器自动抬高的。上边是服务器常规的回复。

JavaScript

Access-Control-Allow-Origin: Content-Type: text/html; charset=utf-8

1
2
Access-Control-Allow-Origin: http://api.bob.com
Content-Type: text/html; charset=utf-8

Access-Control-Allow-Origin字段是历次回应都一定包括的
结束语

CO逍客S与JSONP的选拔目的一样,不过比JSONP更有力。JSONP只援救GET必要,COSportageS扶助具备品种的HTTP伏乞。JSONP的优势在于帮忙老式浏览器,以及能够向不协助CO奥迪Q5S的网址呼吁数据。
WebSocket钻探跨域

WebSocket protocol是HTML5一种新的交涉。它完结了浏览器与服务器全双工通信,同期允许跨域通信,是server push手艺的一种很好的落到实处。

原生WebSocket API使用起来不太方便,大家运用Socket.io,它很好地卷入了webSocket接口,提供了更简便易行、灵活的接口,也对不扶助webSocket的浏览器提供了向下包容。

前面一个代码:

JavaScript

<div>user input:<input type="text"></div> <script src="./socket.io.js"></script> <script> var socket = io(''); // 连接成功拍卖 socket.on('connect', function() { // 监听服务端音信 socket.on('message', function(msg) { console.log('data from server: ---> ' + msg); }); // 监听服务端关闭 socket.on('disconnect', function() { console.log('Server socket has closed.'); }); }); document.getElementsByTagName('input')[0].onblur = function() { socket.send(this.value); }; </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div>user input:<input type="text"></div>
<script src="./socket.io.js"></script>
<script>
var socket = io('http://www.domain2.com:8080');
 
// 连接成功处理
socket.on('connect', function() {
    // 监听服务端消息
    socket.on('message', function(msg) {
        console.log('data from server: ---> ' + msg);
    });
 
    // 监听服务端关闭
    socket.on('disconnect', function() {
        console.log('Server socket has closed.');
    });
});
 
document.getElementsByTagName('input')[0].onblur = function() {
    socket.send(this.value);
};
</script>

node Server

JavaScript

var http = require('http'); var socket = require('socket.io'); // 启http服务 var server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-type': 'text/html' }); res.end(); }); server.listen('8080'); console.log('Server is running at port 8080...'); // 监听socket连接 socket.listen(server).on('connection', function(client) { // 接收新闻 client.on('message', function(msg) { client.send('hello:' + msg); console.log('data from client: ---> ' + msg); }); // 断开处理 client.on('disconnect', function() { console.log('Client socket has closed.'); }); });

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
var http = require('http');
var socket = require('socket.io');
 
// 启http服务
var server = http.createServer(function(req, res) {
    res.writeHead(200, {
        'Content-type': 'text/html'
    });
    res.end();
});
 
server.listen('8080');
console.log('Server is running at port 8080...');
 
// 监听socket连接
socket.listen(server).on('connection', function(client) {
    // 接收信息
    client.on('message', function(msg) {
        client.send('hello:' + msg);
        console.log('data from client: ---> ' + msg);
    });
 
    // 断开处理
    client.on('disconnect', function() {
        console.log('Client socket has closed.');
    });
});

node代理跨域

node中间件达成跨域代理,是经过启二个代理服务器,达成数据的转载,也能够透过安装cookieDomainRewrite参数修改响应头中cookie中域名,完毕当前域的cookie写入,方便接口登陆认证。

动用node + express + http-proxy-middleware搭建一个proxy服务器

前端代码

JavaScript

var xhr = new XMLHttpRequest(); // 前端按钮:浏览器是不是读写cookie xhr.withCredentials = true; // 采访http-proxy-middleware代理服务器 xhr.open('get', '', true); xhr.send();

1
2
3
4
5
6
7
8
var xhr = new XMLHttpRequest();
 
// 前端开关:浏览器是否读写cookie
xhr.withCredentials = true;
 
// 访问http-proxy-middleware代理服务器
xhr.open('get', 'http://www.domain1.com:3000/login?user=admin', true);
xhr.send();

后端代码

JavaScript

var express = require('express'); var proxy = require('http-proxy-middleware'); var app = express(); app.use('/', proxy({ // 代理跨域目的接口 target: '', changeOrigin: true, // 修改响应头音讯,完成跨域并允许带cookie onProxyRes: function(proxyRes, req, res) { res.header('Access-Control-Allow-Origin', ''); res.header('Access-Control-Allow-Credentials', 'true'); }, // 修改响应消息中的cookie域名 cookieDomainRewrite: 'www.domain1.com' // 可认为false,表示不修改 })); app.listen(两千); console.log('Proxy server is listen at port 贰仟...');

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var express = require('express');
var proxy = require('http-proxy-middleware');
var app = express();
 
app.use('/', proxy({
    // 代理跨域目标接口
    target: 'http://www.domain2.com:8080',
    changeOrigin: true,
 
    // 修改响应头信息,实现跨域并允许带cookie
    onProxyRes: function(proxyRes, req, res) {
        res.header('Access-Control-Allow-Origin', 'http://www.domain1.com');
        res.header('Access-Control-Allow-Credentials', 'true');
    },
 
    // 修改响应信息中的cookie域名
    cookieDomainRewrite: 'www.domain1.com'  // 可以为false,表示不修改
}));
 
app.listen(3000);
console.log('Proxy server is listen at port 3000...');

nginx代理跨域

NGINX其实个人尚未怎么玩过,所以权且也就无法误人子弟了,原谅小编才疏尚浅~ 有时机学习钻探再重回补充~~
交流

迎接参与react手艺栈、前端本事散文QQ群

后面一个本领杂文:604953717
react技术栈:398240621

参照文书档案

1 赞 6 收藏 评论

亚洲必赢app 4

开创八个区块

区块链是由许好多多的区块链接在一道的(那听起来类似没毛病..)。链上的区块通过某种情势允许我们检查评定到是否有人操纵了前头的别的区块。

那么我们如何确认保证数量的完整性呢?每种区块都包含三个基于其内容计算出来的hash。同时也包罗了前二个区块的hash。

写二个区块链,前端常见跨域技术方案。下边是叁个区块类用JavaScript写出来大约的标准:

const SHA256 = require("crypto-js/sha256"); class Block { constructor(index, timestamp, data, previousHash = '') { this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); } calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString(); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const SHA256 = require("crypto-js/sha256");
class Block {
  constructor(index, timestamp, data, previousHash = '') {
    this.index = index;
    this.previousHash = previousHash;
    this.timestamp = timestamp;
    this.data = data;
    this.hash = this.calculateHash();
  }
 
  calculateHash() {
    return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString();
  }
}

因为JavaScript中并不支持sha256所以笔者引进了crypto-js库。然后自个儿定义了二个构造函数来早先化作者区块的习性。每一个区块上都被给予了index属性来报告我们这几个区块在漫天链上的职位。大家还要也生成了贰个年华戳,以及供给在区块里积攒的一对多少。最后是前二个区块的hash。

一、 通过jsonp跨域

平时为了缓和web服务器的负荷,大家把js、css,img等静态财富分离到另一台独立域名的服务器上,在html页面中再经过相应的价签从不一致域名下加载静态能源,而被浏览器允许,基于此原理,大家得以经过动态创立script,再央浼贰个带参网站落成跨域通讯。

1.)原生完结:

<script> var script = document.createElement('script'); script.type = 'text/javascript'; // 传参并钦定回调实施函数为onBack script.src = ''; document.head.appendChild(script); // 回调施行函数 function onBack(res) { alert(JSON.stringify(res)); } </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
    var script = document.createElement('script');
    script.type = 'text/javascript';
 
    // 传参并指定回调执行函数为onBack
    script.src = 'http://www.domain2.com:8080/login?user=admin&callback=onBack';
    document.head.appendChild(script);
 
    // 回调执行函数
    function onBack(res) {
        alert(JSON.stringify(res));
    }
</script>

服务端重临如下(重返时即实行全局函数):

onBack({"status": true, "user": "admin"})

1
onBack({"status": true, "user": "admin"})

2.)jquery ajax:

$.ajax({ url: '', type: 'get', dataType: 'jsonp', // 诉求形式为jsonp jsonpCallback: "onBack", // 自定义回调函数名 data: {} });

1
2
3
4
5
6
7
$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "onBack",    // 自定义回调函数名
    data: {}
});

3.)vue.js:

this.$http.jsonp('', { params: {}, jsonp: 'onBack' }).then((res) => { console.log(res); })

1
2
3
4
5
6
this.$http.jsonp('http://www.domain2.com:8080/login', {
    params: {},
    jsonp: 'onBack'
}).then((res) => {
    console.log(res);
})

后端node.js代码示例:

var querystring = require('querystring'); var http = require('http'); var server = http.createServer(); server.on('request', function(req, res) { var params = qs.parse(req.url.split('?')[1]); var fn = params.callback; // jsonp重回设置 res.writeHead(200, { 'Content-Type': 'text/javascript' }); res.write(fn + '(' + JSON.stringify(params) + ')'); res.end(); }); server.listen('8080'); console.log('Server is running at port 8080...');

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var querystring = require('querystring');
var http = require('http');
var server = http.createServer();
 
server.on('request', function(req, res) {
    var params = qs.parse(req.url.split('?')[1]);
    var fn = params.callback;
 
    // jsonp返回设置
    res.writeHead(200, { 'Content-Type': 'text/javascript' });
    res.write(fn + '(' + JSON.stringify(params) + ')');
 
    res.end();
});
 
server.listen('8080');
console.log('Server is running at port 8080...');

jsonp短处:只可以兑现get一种央浼。

预管理器变量不继续

就算如此持续是级联的一有的,可是作者或许要提一下,因为许多次作者想利用那些效应都不许用成。

有一种状态,你有Dom成分在颜色风格基础上有啥的变迁时候,你能够用在她们的父成分上。

CSS

.alert { background-color: lightyellow; } .alert.info { background-color: lightblue; } .alert.error { background-color: orangered; } .alert button { border-color: darken(background-color, 25%); }

1
2
3
4
5
6
7
.alert { background-color: lightyellow; }
.alert.info { background-color: lightblue; }
.alert.error { background-color: orangered; }
 
.alert button {
  border-color: darken(background-color, 25%);
}

地点的Sass代码是不行的,但你应当能通晓那代码试图要做到什么。

它聊起底策动动用sass的darken函数用在background-color质量,但button成分承继它的父class成分.alert。如果class info或者error业已增添到alert(也许经过JavaScript设置背景颜色或客商样式),按键元素希望能够收获那四个颜色。

当今这一个纵然不会在sass 运维,因为预管理器不掌握DOM结构,但要么愿意搞领悟那类型的事物大概有怎么着用处。

说八个一定的用例:那也是在三番一遍DOM属性的可访问性运维color 函数的原因。举个栗子,为了保险文本总是可读,且尽量与背景颜色产生鲜明相比较。通过自定义属性和新的CSS Color函数,那将飞快形成恐怕!

暗中认可掩饰,动画效果

当然,这里一最初都以尚未下划线的,所以大家大概供给把他们给隐讳起来。

li { border-bottom: 0px solid #000; }

1
2
3
li {
    border-bottom: 0px solid #000;
}

创办七个链

今昔我们得以在Blockchain类准将区块链接起来了!下边是用JavaScript完成的代码:

class Blockchain{ constructor() { this.chain = [this.createGenesisBlock()]; } createGenesisBlock() { return new Block(0, "01/01/2017", "Genesis block", "0"); } getLatestBlock() { return this.chain[this.chain.length - 1]; } addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); this.chain.push(newBlock); } isChainValid() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i - 1]; if (currentBlock.hash !== currentBlock.calculateHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; } }

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
class Blockchain{
  constructor() {
    this.chain = [this.createGenesisBlock()];
  }
 
  createGenesisBlock() {
    return new Block(0, "01/01/2017", "Genesis block", "0");
  }
 
  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }
 
  addBlock(newBlock) {
    newBlock.previousHash = this.getLatestBlock().hash;
    newBlock.hash = newBlock.calculateHash();
    this.chain.push(newBlock);
  }
 
  isChainValid() {
    for (let i = 1; i < this.chain.length; i++){
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];
 
      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }
 
      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }
    return true;
  }
}

在构造函数里,笔者透过创立三个分包创世块的数组来伊始化整个链。第一个区块是极度的,因为它无法指向前贰个区块。作者还加多了上面四个情势:

  • getLatestBlock()回到大家区块链上最新的区块。
  • addBlock()担负将新的区块加多到我们的链上。为此,大家将前二个区块的hash增多到大家新的区块中。那样大家就足以保持总体链的完整性。因为一旦大家改造了新星区块的原委,我们就需求再行总计它的hash。当总括实现后,笔者将把这么些区块推动链里(一个数组)。

最后,作者创造三个isChainValid()来担保未有人篡改过区块链。它会遍历全部的区块来检查各类区块的hash是或不是科学。它会经过相比previousHash来检查种种区块是不是针对正确的上三个区块。纵然全部都尚未难点它会回去true不然会再次回到false

本文由亚洲必赢登录发布于亚洲必赢app,转载请注明出处:写二个区块链,前端常见跨域技术方案

关键词:

上一篇:选用视口单位贯彻适配布局,的潜在面纱亚洲必

下一篇:没有了