云顶集团400800044

当前位置:云顶集团400800044 > 云顶集团400800044 > 的多种绑定情势【云顶集团400800044】,换个思路

的多种绑定情势【云顶集团400800044】,换个思路

来源:http://www.ofertasanjuan.com 作者:云顶集团400800044 时间:2019-10-07 11:35

浅谈跨域以WebService对跨域的援助

2015/04/03 · HTML5, JavaScript云顶集团400800044, · WebService, 跨域

原稿出处: 寒江独钓   

跨域难点根源JavaScript的同源计谋,即独有 协议+主机名+端口号 (如存在)同样,则允许互相拜会。相当于说JavaScript只好访谈和操作自身域下的财富,无法访谈和操作别的域下的能源。

在从前,前端和后端混杂在一同, 举个例子JavaScript直接调用同系统里头的贰个Httphandler,就不设有跨域的难题,可是随着今世的这种二种顾客端的盛行,举个例子多少个施用日常会有Web端,App端,以及WebApp端,种种顾客端平日会动用同一套的后台处理逻辑,即API, 前后端分离的开拓政策流行起来,前端只关切表现,平常选拔JavaScript,后端管理逻辑和数目日常接纳WebService来提供json数据。常常的前端页面和后端的WebServiceAPI平常布置在分化的服务器也许域名上。那样,通过ajax央求WebService的时候,就能够油可是生同源攻略的主题素材。

亟需证实的是,同源计谋是JavaScript里面包车型大巴限定,其余的编制程序语言,举个例子在C#,Java只怕iOS等别的语言中是能够调用外界的WebService,也正是说,假若开拓Native应用,是不设有那个主题素材的,可是即使开辟Web也许Html5如WebApp,经常接纳JavaScript ajax对WebService发起呼吁然后剖析重临的值,那样就只怕存在跨域的主题材料。

诚如的,很轻巧想到,将表面包车型客车财富搬到同贰个域上就能够一挥而就同源战术的限量的。即在Web网址上同期支付四个Http服务端页面,全体JavaScript的呼吁都发到那几个页面上来,这么些页面在中间使用其余语言去调用外界的Web瑟维斯。即加多一个代理层。这种方法能够消除难题,可是非常不足间接和便捷。

当前,相比常见的跨域施工方案包含JSONP (JSON with padding)和CORS (Cross-origin resource sharing )。一些解决方案需求客商端和服务端合营如JSOP,一些则只需求服务端合营管理比方CO奥德赛S。上边分别介绍那二种跨域方案,以及劳动端WebService怎么着支持那二种跨域方案。

用Web Components塑造单页面应用

2015/01/19 · JavaScript · Web Components

本文由 伯乐在线 - 周进林 翻译,Mxt 校稿。未经许可,幸免转发!
塞尔维亚共和国(Republic of Serbia)语出处:www.polymer-project.org。欢迎加入翻译组。

您是哪些行使Polymer创设贰个单页应用的?这些问题大家在Polymer团队里早就问过好些个遍了。大家的答案(长久以来地)是“使用组件(component)!”。不过,使用新本领去化解现成的难题屡次不会应声获得明显的法力。怎么样把一批模块化组件组合到叁个特大型的实用的使用中去?

在本教程,笔者将会给你显得什么去构建一个职能一体化的单页应用:

云顶集团400800044 1

  • 统统采取Polymer的骨干成分构建
  • 选择响应式设计
  • 运用数据绑定本性过渡视图
  • 采纳UENCOREL路由和深层链接特性
  • 可访谈键盘
  • 按需动态载入内容(可选)

 张开演示

H5 Crash 研究

2016/05/31 · HTML5 · Crash

初稿出处: 小胡子哥(@Barret托塔天王)   

我们领悟,支撑页面在 webview 上精美运行的前提是兼具一个快捷何况牢固的 webview 容器,而容器的火速牢固不止由容器提供方来保证,也急需容器使用者服从一些基本准绳,否则就有一点都不小也许出现页面 Crash 的情景,这个准则是何许?什么样的上层代码会引起容器至极退出?这是本文须要演说的原委。

换个思路清楚Javascript中的this

2017/07/27 · JavaScript · this

最早的作品出处: Leechikit   

的多种绑定情势【云顶集团400800044】,换个思路清楚Javascript中的this。在网络海人民广播电视台湾大学篇章都对 Javascript 中的 this 做了详尽的牵线,但大致是介绍各种绑定方式或调用情势下 this 的指向,于是作者想有贰个集结的思路来越来越好理解 this 指向,使我们更加好决断,以下有局地剧情不是常理,而是一种解题思路。

javascript 函数中的 this 的二种绑定格局

2017/08/16 · JavaScript · this

原稿出处: 曾外祖母的彭湖湾   

 javascript中的this和函数唇亡齿寒,所现在天,作者就给我们详细地陈述一番:javascript函数中的this

一聊起this,比非常多令人晕晕乎乎的抽象概念就跑出来了,此处本身就只说最基本的有些——函数中的this总指向调用它的对象,接下去的遗闻都将围绕那或多或少拓宽

 

(提示前排的管仲们希图好茶水和水瓜,笔者要起来说趣事啊!!)

【故事】有二个年青人叫“迪斯”(this),有一天,迪斯比比较大心穿越到三个叫 “伽瓦斯克利”(javascript)的 异世界,此时此刻迪斯身无分文, 他第一要做的事体就是——找到她的留宿的地点——调用函数的对象云顶集团400800044 2

JSONP以及WebService的支持

同源战术下,有个别服务器是力不胜任得到到服务器以外的数据,不过html里面包车型客车img,iframe和script等标签是个差异,那个标签能够通过src属性央浼到别的服务器上的数目。而JSONP正是经过script节点src调用跨域的哀求。

当大家向服务器交由一个JSONP的乞请时,大家给劳务传了一个异样的参数,告诉服务端要对结果特别管理一下。那样服务端重返的数额就能开展一些封装,顾客端就可以拍卖。

比如,服务端和顾客端约定要传一个名称叫callback的参数来选拔JSONP功用。比如乞求的参数如下:

JavaScript

1
http://www.example.net/sample.aspx?callback=mycallback

要是未有前边的callback参数,即不使用JSONP的情势,该服务的回来结果只怕是二个独自的json字符串,比如:

JavaScript

{ foo : 'bar' }

1
{ foo : 'bar' }

万一和劳务端约定jsonp格式,那么服务端就能处理callback的参数,将赶回结果开展一下甩卖,举个例子拍卖成:

JavaScript

mycallback({ foo : 'bar' })

1
mycallback({ foo : 'bar' })

能够见到,那实际上是三个函数调用,比方能够兑以后页面定义多个名称叫mycallback的回调函数:

JavaScript

mycallback = function(data) { alert(data.foo); };

1
2
3
4
mycallback = function(data)
         {
            alert(data.foo);
         };

以往,须求的再次来到值回去触发回调函数,那样就完了了跨域央浼。

假如应用瑟维斯Stack创立WebService的话,支持Jsonp方式的调用很粗大略,只供给在AppHost的Configure函数里面注册一下对响应结果进行过滤管理就能够。

JavaScript

/// <summary> /// Application specific configuration /// This method should initialize any IoC resources utilized by your web service classes. /// </summary> /// <param name="container"></param> public override void Configure(Container container) { ResponseFilters.Add((req, res, dto) => { var func = req.QueryString.Get("callback"); if (!func.isNullOrEmpty()) { res.AddHeader("Content-Type", ContentType.Html); res.Write("<script type='text/javascript'>{0}({1});</script>" .FormatWith(func, dto.ToJson())); res.Close(); } }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// &lt;summary&gt;
        /// Application specific configuration
        /// This method should initialize any IoC resources utilized by your web service classes.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;container&quot;&gt;&lt;/param&gt;
        public override void Configure(Container container)
        {
            ResponseFilters.Add((req, res, dto) =&gt;
            {
                var func = req.QueryString.Get(&quot;callback&quot;);
                if (!func.isNullOrEmpty())
                {
                    res.AddHeader(&quot;Content-Type&quot;, ContentType.Html);
                    res.Write(&quot;&lt;script type=&#039;text/javascript&#039;&gt;{0}({1});&lt;/script&gt;&quot;
                        .FormatWith(func, dto.ToJson()));
                    res.Close();
                }
            });
        }

JSONP跨域情势相比较便利,也帮助各类较老的浏览器,然而瑕疵很显著,他只帮助GET的措施提交,不扶助别的Post的交由,Get形式对乞求的参数长度有限量,在稍微境况下或许不满足供给。所以上面就介绍一下COENVISIONS的跨域应用方案。

使用架构

统一计划布局是初阶一个类型的主要职分之一。作为着力成分集结的一有的,Polymer通过多少个布局成分 来支撑应用程序的构架(<core-header-panel>, <core-drawer-panel>, <core-toolbar>)。那个零件自个儿就很好用,不过为了越来越快地开端项目,大家准备珍视于<core-scaffold>。有了它你能够经过建构几在那之中央的因素就能够做出贰个响应式的移位端布局。

<core-scaffold>的子成分能够是钦赐特定的要素或利用一定的竹签(或二者一齐使用)。举例,使用<nav>成分创立应用抽屉菜单。你可以在从心所欲的成分里选择navigation属性(e.g <core-header-panel navigation>)。工具栏通过工具属性标志。它的具有其余子成分都定义在主要内容区域里。

H5 Crash 难点差非常的少

下图是 H5 Crash 的大概流程图:

云顶集团400800044 3

鉴于前端无法捕捉到页面 Crash 的情景和储藏室,但是 H5 页面上发生的不当会传送到 Java 和更底层的 Native 直到容器十分退出,在剥离的那一刻,容器会将货仓写入到日志中,当下一次张开容器时(也可能是定期报告)就能够申报那一个仓库消息。

从call方法开端

call 方法允许切换函数实行的上下文情况(context),即 this 绑定的指标。

超过58%介绍 this 的篇章中都会把 call 方法放到最终介绍,但此文大家要把 call 方法放在第2个人介绍,并从 call 方法切入来探究 this ,因为 call 函数是显式绑定 this 的针对性,大家来探视它什么模拟实现(不考虑传入 nullundefined 和原始值):

Function.prototype.call = function(thisArg) { var context = thisArg; var arr = []; var result; context.fn = this; for (let i = 1, len = arguments.length; i < len; i++) { arr.push('arguments[' + i + ']'); } result = eval("context.fn(" + arr + ")"); delete context.fn; return result; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function.prototype.call = function(thisArg) {
    var context = thisArg;
    var arr = [];
    var result;
 
    context.fn = this;
 
    for (let i = 1, len = arguments.length; i < len; i++) {
        arr.push('arguments[' + i + ']');
    }
 
    result = eval("context.fn(" + arr + ")");
 
    delete context.fn;
 
    return result;
}

从上述代码大家得以见见,把调用 call 方法的函数作为第多个参数对象的秘籍,此时一定于把第贰个参数对象作为函数实施的上下文境况,而 this 是指向函数奉行的上下文意况的,因而 this 就本着了第二个参数对象,完成了 call 方法切换函数实施上下文环境的效能。

this的暗许绑定

 

【故事——线路1】假如迪斯(this)直到天黑前都并没有找到能收留自个儿的安身之地,他即时快要过上亚洲难民的活着, 那时候,一个人视死若归的魔术师村长——window救世主平常地面世了:先住在笔者家吧!云顶集团400800044 4

【正文】

当三个函数未有明了的调用对象的时候,也正是只有作为单身函数调用的时候,将对函数的this使用暗许绑定:绑定到全局的window对象

JavaScript

function fire () { console.log(this === window) } fire(); // 输出true

1
2
3
4
function fire () {
     console.log(this === window)
}
fire(); // 输出true

地方的例证小编相信对大非常多人都很轻易,但一些时候我们把例子变一下就能够具有吸引性:

JavaScript

function fire () { // 我是被定义在函数内部的函数哦! function innerFire() { console.log(this === window) } innerFire(); // 独立函数调用 } fire(); // 输出true

1
2
3
4
5
6
7
8
function fire () {
  // 我是被定义在函数内部的函数哦!
     function innerFire() {
  console.log(this === window)
      }
     innerFire(); // 独立函数调用
}
fire(); // 输出true

函数 innerFire在壹个外界函数fire里面评释且调用,那么它的this是指向什么人吧? 依然是window

成都百货上千人唯恐会顾忌于fire函数的成效域对innerFire的震慑,但我们纵然抓住大家的争鸣军械——未有显然的调用对象的时候,将对函数的this使用暗中同意绑定:绑定到全局的window对象,便可得精确的答案了

下边这一个抓实版的事例也是平等的出口true

JavaScript

var obj = { fire: function () { function innerFire() { console.log(this === window) } innerFire(); // 独立函数调用 } } obj.fire(); //输出 true

1
2
3
4
5
6
7
8
9
var obj = {
   fire: function () {
       function innerFire() {
          console.log(this === window)
        }
        innerFire();   // 独立函数调用
     }
}
obj.fire(); //输出 true

留神】在这些事例中, obj.fire()的调用实际上采用到了this的隐式绑定,那正是上边小编要讲的内容,这些例子作者接下去还有或者会持续上课

【总括】 所有事函数作为单身函数调用,无论它的职位在哪里,它的行为表现,都和向来在大局遭遇中调用无差异

CORS跨域及WebService的支持

先来看二个例证,我们新建一个主干的html页面,在其间编写三个简短的是还是不是扶助跨域的小本子,如下:

XHTML

<html xmlns="; <head> <title>AJAX跨域央浼测量试验</title> </head> <body> <input type='button' value='开首测量试验' onclick='crossDomainRequest()' /> <div id="content"></div> <script type="text/javascript"> //<![CDATA[ var xhr = new XMLHttpRequest(); var url = ''; function crossDomainRequest() { document.getElementById("content").innerHTML = "起首……"; if (xhr) { xhr.open('POST', url, true); xhr.onreadystatechange = handler; xhr.send(); } else { document.getElementById("content").innerHTML = "不可能创制 XMLHttpRequest"; } } function handler(evtXH大切诺基) { if (xhr.readyState == 4) { if (xhr.status == 200) { var response = xhr.responseText; document.getElementById("content").innerHTML = "结果:" + response; } else { document.getElementById("content").innerHTML = "不允许跨域供给。"; } } else { document.getElementById("content").innerHTML += "<br/>执市价况 readyState:" + xhr.readyState; } } //]]> </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
30
31
32
33
34
35
36
37
38
39
40
41
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>AJAX跨域请求测试</title>
</head>
<body>
  <input type='button' value='开始测试' onclick='crossDomainRequest()' />
  <div id="content"></div>
 
  <script type="text/javascript">
    //<![CDATA[
    var xhr = new XMLHttpRequest();
    var url = 'http://localhost:8078/json/ShopUserLogin';
    function crossDomainRequest() {
      document.getElementById("content").innerHTML = "开始……";
      if (xhr) {
        xhr.open('POST', url, true);
        xhr.onreadystatechange = handler;
        xhr.send();
      } else {
        document.getElementById("content").innerHTML = "不能创建 XMLHttpRequest";
      }
    }
 
    function handler(evtXHR) {
      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
          var response = xhr.responseText;
          document.getElementById("content").innerHTML = "结果:" + response;
        } else {
          document.getElementById("content").innerHTML = "不允许跨域请求。";
        }
      }
      else {
        document.getElementById("content").innerHTML += "<br/>执行状态 readyState:" + xhr.readyState;
      }
    }
    //]]>
  </script>
 
</body>
</html>

接下来保留为地点html文件,可以看看,这些剧本中,对本地的劳务 发起了一个必要, 如若使用chrome 直接张开,会看出输出的结果,不容许跨域央浼。 在javascript调控台程序中平等能够见见错误提醒:

云顶集团400800044 5

那么一旦在回来响应头header中注入Access-Control-Allow-Origin,这样浏览器检查评定到header中的Access-Control-Allow-Origin,则就能够跨域操作了。

同样,假设采用ServcieStack,在不菲地点能够帮衬COSportageS的跨域格局。最简便的如故在AppHost的Configure函数里面一向写入:

JavaScript

/// <summary> /// Application specific configuration /// This method should initialize any IoC resources utilized by your web service classes. /// </summary> /// <param name="container"></param> public override void Configure(Container container) { this.AddPlugin(new CorsFeature()); }

1
2
3
4
5
6
7
8
9
/// &lt;summary&gt;
/// Application specific configuration
/// This method should initialize any IoC resources utilized by your web service classes.
/// &lt;/summary&gt;
/// &lt;param name=&quot;container&quot;&gt;&lt;/param&gt;
public override void Configure(Container container)
{
    this.AddPlugin(new CorsFeature());
}

那样就能够了,约等于选取暗许的COSportageS配置:

JavaScript

CorsFeature(allowedOrigins:"*", allowedMethods:"GET, POST, PUT, DELETE, OPTIONS", allowedHeaders:"Content-Type", allowCredentials:false);

1
2
3
4
CorsFeature(allowedOrigins:&quot;*&quot;,
allowedMethods:&quot;GET, POST, PUT, DELETE, OPTIONS&quot;,
allowedHeaders:&quot;Content-Type&quot;,
allowCredentials:false);

假设只是允许GET和POST的央浼援救COGL450S,则只须求改为:

JavaScript

Plugins.Add(new CorsFeature(allowedMethods: "GET, POST"));

1
Plugins.Add(new CorsFeature(allowedMethods: &quot;GET, POST&quot;));

理所当然也得以在AppHost的Config里面安装全局的CO奥迪Q5S,如下:

JavaScript

/// <summary> /// Application specific configuration /// This method should initialize any IoC resources utilized by your web service classes. /// </summary> /// <param name="container"></param> public override void Configure(Container container) { base.SetConfig(new EndpointHostConfig { GlobalResponseHeaders = { { "Access-Control-Allow-Origin", "*" }, { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" }, { "Access-Control-Allow-Headers", "Content-Type" }, }, }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// &lt;summary&gt;
/// Application specific configuration
/// This method should initialize any IoC resources utilized by your web service classes.
/// &lt;/summary&gt;
/// &lt;param name=&quot;container&quot;&gt;&lt;/param&gt;
public override void Configure(Container container)
{
 
    base.SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders = {
            { &quot;Access-Control-Allow-Origin&quot;, &quot;*&quot; },
            { &quot;Access-Control-Allow-Methods&quot;, &quot;GET, POST, PUT, DELETE, OPTIONS&quot; },
            { &quot;Access-Control-Allow-Headers&quot;, &quot;Content-Type&quot; },
                },
    });
}

明天运行WebService,使用postman只怕Chrome调用这一个诉求,能够见见再次回到的值头文件中,已经增加了响应头,何况能够平常展现重返结果了:

云顶集团400800044 6

CO瑞鹰S使用起来大约,无需客户端的附加管理,何况协助Post的艺术提交央浼,但是COCR-VS的有一无二二个宿疾是对顾客端的浏览器版本有要求,援助CO奥迪Q3S的浏览器机器版本如下:

云顶集团400800044 7

 

例子

XHTML

<body unresolved fullbleed> <core-scaffold id="scaffold"> <nav>Left drawer</nav> <core-toolbar tool>Application</core-toolbar> <div>Main content</div> </core-scaffold> </body>

1
2
3
4
5
6
7
<body unresolved fullbleed>
  <core-scaffold id="scaffold">
    <nav>Left drawer</nav>
    <core-toolbar tool>Application</core-toolbar>
    <div>Main content</div>
  </core-scaffold>
</body>

让我们一起来深刻这么些内容的每一有的

H5 Crash 原因初探

测量检验代码 库房地址:

git clone ; cd demo;

1
2
git clone https://github.com/barretlee/h5crash.git;
cd demo;

注意: 代码须要在 Webview 容器中测量试验,PC 浏览器下不会出现极度。

H5 Crash 的原原本本的经过不太驾驭,但是从经验上判别和找出,大约归类为以下二种:

1. 内部存款和储蓄器难题

  • 测量试验方法:使用闭包,不断追加内部存款和储蓄器量,看看扩充到哪个区间大小, webview 容器会出现卓殊
  • 测量检验地方:(微信、和讯可能其他顾客端打开该页面包车型客车客户,能够点进去测量检验下,选取100M 内部存储器,不出意外,你的客商端会闪退。)

XHTML

<script> var Closure = function() { var _cache = []; var cache = 0; var add = function(size) { cache += size; size = size * 1024 * 1024; _cache.push(new Array(size).join('x')); refresh(); }; var refresh = function() { r.innerHTML = '内部存款和储蓄器消耗: ' + cache + 'M'; }; return { cache: cache + 'M', add: add, refresh: refresh } }; var closure = Closure(); </script> <button onclick="closure.add(1)">扩展1M 内部存款和储蓄器消耗</button> <button onclick="closure.add(10)">扩充10M 内部存储器消耗</button> <button onclick="closure.add(20)">扩大20M 内部存款和储蓄器消耗</button> <button onclick="closure.add(50)">扩展50M 内部存款和储蓄器消耗</button> <button onclick="closure.add(100)">扩大 100M 内部存款和储蓄器消耗</button> <div id="r">内部存储器消耗:0 M</div>

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
<script>
var Closure = function() {
  var _cache = [];
  var cache = 0;
  var add = function(size) {
    cache += size;
    size = size * 1024 * 1024;
    _cache.push(new Array(size).join('x'));
    refresh();
  };
  var refresh = function() {
    r.innerHTML = '内存消耗: ' + cache + 'M';
  };
  return {
    cache: cache + 'M',
    add: add,
    refresh: refresh
  }
};
var closure = Closure();
</script>
 
<button onclick="closure.add(1)">增加 1M 内存消耗</button>
<button onclick="closure.add(10)">增加 10M 内存消耗</button>
<button onclick="closure.add(20)">增加 20M 内存消耗</button>
<button onclick="closure.add(50)">增加 50M 内存消耗</button>
<button onclick="closure.add(100)">增加 100M 内存消耗</button>
 
<div id="r">内存消耗:0 M</div>

存在的打扰:这种测验存在比比较多的苦恼,比如设备等级次序、系统项目(iOS/Android)、和装置内部存款和储蓄器运市场价格况等。

2. Layers 数问题

Layers 数的获得相比麻烦,Chrome Driver 未有提供该数额的接口,最近也绝非相比较好的艺术得到那一个数额。

  • 测量试验方法:通过区别的方法创造层,观察页面包车型地铁 Crash 情形
  • 测验地点:

XHTML

<style>.transform { transform: translateZ(0); } .animation { width:100px; height:100px; background:red; position:relative; animation:move 5s infinite; } @keyframes move { from {left:0px;} to {left:200px;} } </style> <script> var Layer = function() { function getType() { return document.querySelector('input:checked').value; }; return { createOne: function(index) { var div = document.createElement('div'); div.appendChild(document.createTextNode(index)); switch(getType()) { case 'opacity': div.style.cssText = "opacity:" + (index / 1000); break; case 'transform': div.className = 'transform'; break; case 'animation': div.className = 'animation'; break; case 'zindex': div.style.cssText = "position:relative; z-index:" + index; break; } document.body.appendChild(div); }, create: function(num) { [].slice.call(document.querySelectorAll('div')).forEach(function(item) { item.parentNode && item.parentNode.removeChild(item); }); while(num--) { this.createOne(num); } } } }; var layer = Layer(); </script> <strong>层类型: </strong> <ul> <li><label><input type="radio" checked name="type" value="opacity"> <span>通过 opacity 创立层</span></label></li> <li><label><input type="radio" name="type" value="transform"> <span>通过 transforms 创制层</span></label></li> <li><label><input type="radio" name="type" value="animation"> <span>通过 animation 创设层</span></label></li> <li><label><input type="radio" name="type" value="zindex"> <span>通过相对定位分层</span></label></li> </ul> <button onclick="layer.create(1)">创立 1 个层</button> <button onclick="layer.create(10)">创造 十三个层</button> <button onclick="layer.create(20)">创制 十八个层</button> <button onclick="layer.create(50)">创造 50个层</button> <button onclick="layer.create(100)">创制 100 个层</button> <button onclick="layer.create(200)">创建 200 个层</button> <button onclick="layer.create(500)">创制 500 个层</button> <button onclick="layer.create(一千)">创设 一千个层</button> <button onclick="layer.create(贰仟)">创制 2000个层</button> <button onclick="layer.create(陆仟)">创造 四千个层</button> <button onclick="layer.create(一千0)">创立一千0 个层</button>

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
68
69
70
71
72
73
<style>.transform {
  transform: translateZ(0);
}
.animation {
  width:100px;
  height:100px;
  background:red;
  position:relative;
  animation:move 5s infinite;
}
 
@keyframes move {
  from {left:0px;}
  to {left:200px;}
}
</style>
<script>
var Layer = function() {
  function getType() {
    return document.querySelector('input:checked').value;
  };
  return {
    createOne: function(index) {
      var div = document.createElement('div');
      div.appendChild(document.createTextNode(index));
      switch(getType()) {
        case 'opacity':
          div.style.cssText = "opacity:" + (index / 1000);
          break;
        case  'transform':
          div.className = 'transform';
          break;
        case  'animation':
          div.className = 'animation';
          break;
        case  'zindex':
          div.style.cssText = "position:relative; z-index:" + index;
          break;
      }
      document.body.appendChild(div);
    },
    create: function(num) {
      [].slice.call(document.querySelectorAll('div')).forEach(function(item) {
        item.parentNode && item.parentNode.removeChild(item);
      });
      while(num--) {
        this.createOne(num);
      }
    }
  }
};
var layer = Layer();
</script>
 
<strong>层类型: </strong>
<ul>
  <li><label><input type="radio" checked name="type" value="opacity"> <span>通过 opacity 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="transform"> <span>通过 transforms 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="animation"> <span>通过 animation 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="zindex"> <span>通过绝对定位分层</span></label></li>
</ul>
 
<button onclick="layer.create(1)">创建 1 个层</button>
<button onclick="layer.create(10)">创建 10 个层</button>
<button onclick="layer.create(20)">创建 20 个层</button>
<button onclick="layer.create(50)">创建 50 个层</button>
<button onclick="layer.create(100)">创建 100 个层</button>
<button onclick="layer.create(200)">创建 200 个层</button>
<button onclick="layer.create(500)">创建 500 个层</button>
<button onclick="layer.create(1000)">创建 1000 个层</button>
<button onclick="layer.create(2000)">创建 2000 个层</button>
<button onclick="layer.create(5000)">创建 5000 个层</button>
<button onclick="layer.create(10000)">创建 10000 个层</button>
  • 实则,创制多少个层,也是对内部存储器的光辉消耗,页面 Crash 恐怕依然因为内部存储器消耗过大

3. 并发过多难点

  • 测验方法:尝试并发发出各类分化的伸手(Fetch诉求、XH安德拉需要、Script/CSS 能源伏乞),观望页面 Crash 意况
  • 测验地方:

XHTML

<script> var Request = function() { function getType() { return document.querySelector('input:checked').value; }; function getResource() { var type = getType(); var resource = { fetch: '/', xhr: '/', script: '//g.alicdn.com/sd/data_sufei/1.5.1/aplus/index.js', css: '//g.alicdn.com/kg/global-util/1.0.3/index-min.css' }; return resource[type]; }; return { emitOne: function() { var url = getResource() + "?_t=" + (new Date * 1 + Math.random()); switch(getType()) { case 'fetch': return fetch('/'); case 'xhr': with(new XMLHttpRequest) { open('GET', url); send(); } return; case 'script': var s = document.createElement('script'); s.src = url; document.body.appendChild(s); return; case 'css': var s = document.createElement('link'); s.href = url; document.body.appendChild(s); } }, emit: function(num) { [].slice.call(document.querySelectorAll('script,link')).forEach(function(item) { item.parentNode && item.parentNode.removeChild(item); }); while(num--) { this.emitOne(); } } } }; var request = Request(); </script> <strong>央浼类型: </strong> <ul> <li><label><input type="radio" checked name="type" value="fetch"> <span>使用 Fetch 发送乞求</span></label></li> <li><label><input type="radio" name="type" value="xhr"> <span>使用 XH中华V发送诉求</span></label></li> <li><label><input type="radio" name="type" value="script"> <span>并发乞求脚本财富</span></label></li> <li><label><input type="radio" name="type" value="css"> <span>并发央求样式财富</span></label></li> </ul> <button onclick="request.emit(1)">并发 1 个央求</button> <button onclick="request.emit(10)">并发 十个央浼</button> <button onclick="request.emit(20)">并发 22个需要</button> <button onclick="request.emit(50)">并发 肆十多个诉求</button> <button onclick="request.emit(100)">并发 100 个央求</button> <button onclick="request.emit(500)">并发 500 个伏乞</button> <button onclick="request.emit(一千)">并发 一千 个需要</button>

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
<script>
var Request = function() {
  function getType() {
    return document.querySelector('input:checked').value;
  };
  function getResource() {
    var type = getType();
    var resource = {
      fetch: '/',
      xhr: '/',
      script: '//g.alicdn.com/sd/data_sufei/1.5.1/aplus/index.js',
      css: '//g.alicdn.com/kg/global-util/1.0.3/index-min.css'
    };
    return resource[type];
  };
  return {
    emitOne: function() {
      var url = getResource() + "?_t=" + (new Date * 1 + Math.random());
      switch(getType()) {
        case 'fetch':
          return fetch('/');
        case 'xhr':
          with(new XMLHttpRequest) {
            open('GET', url);
            send();
          }
          return;
        case 'script':
          var s = document.createElement('script');
          s.src = url;
          document.body.appendChild(s);
          return;
        case 'css':
          var s = document.createElement('link');
          s.href = url;
          document.body.appendChild(s);
      }
    },
    emit: function(num) {
      [].slice.call(document.querySelectorAll('script,link')).forEach(function(item) {
        item.parentNode && item.parentNode.removeChild(item);
      });
      while(num--) {
        this.emitOne();
      }
    }
  }
};
var request = Request();
</script>
 
<strong>请求类型: </strong>
<ul>
  <li><label><input type="radio" checked name="type" value="fetch"> <span>使用 Fetch 发送请求</span></label></li>
  <li><label><input type="radio" name="type" value="xhr"> <span>使用 XHR 发送请求</span></label></li>
  <li><label><input type="radio" name="type" value="script"> <span>并发请求脚本资源</span></label></li>
  <li><label><input type="radio" name="type" value="css"> <span>并发请求样式资源</span></label></li>
</ul>
 
<button onclick="request.emit(1)">并发 1 个请求</button>
<button onclick="request.emit(10)">并发 10 个请求</button>
<button onclick="request.emit(20)">并发 20 个请求</button>
<button onclick="request.emit(50)">并发 50 个请求</button>
<button onclick="request.emit(100)">并发 100 个请求</button>
<button onclick="request.emit(500)">并发 500 个请求</button>
<button onclick="request.emit(1000)">并发 1000 个请求</button>
  • 留存的苦闷:设备的品类、设备的 CPU 使用状态和网络景况等。

指标方法中的this

在模拟 call 方法的时候,大家利用了对象方法来改换 this 的指向。调用对象中的方法时,会把对象作为艺术的上下文意况来调用。

既然 this 是指向执行函数的上下文情状的,那我们先来钻探一下调用函数时的实践上下文情状。

上面作者门来走访调用对象方法时推行上下文是何等的:

var foo = { x : 1, getX: function(){ console.log(this.x); } } foo.getX();

1
2
3
4
5
6
7
var foo = {
    x : 1,
    getX: function(){
        console.log(this.x);
    }
}
foo.getX();

云顶集团400800044 8

从上海教室中,大家能够看来getX主意的调用者的上下文是foo,因此getX艺术中的 this 指向调用者上下文foo,转换成 call 方法为foo.getX.call(foo)

下边大家把其余函数的调用形式都按调用对象方法的思路来转变。

this的隐式绑定

【趣事——线路2】 迪斯(this)穿越来异世界“伽瓦斯克利”(javascript)的时候,刚好身上带了部分钱,于是她找到贰个饭店住宿了下来

云顶集团400800044 9

当函数被贰个指标“包蕴”的时候,大家称函数的this被隐式绑定到那个指标里面了,那时候,通过this能够一向访问所绑定的靶子里面包车型客车别的质量,比如下边包车型客车a属性

JavaScript

var obj = { a: 1, fire: function () { console.log(this.a) } } obj.fire(); // 输出1

1
2
3
4
5
6
7
var obj = {
     a: 1,
      fire: function () {
           console.log(this.a)
        }
}
obj.fire(); // 输出1

未来我们须要对寻平日常的的代码操作做一些越来越深的思想,首先,上边包车型客车这两段代码达到的意义是一模一样的:

JavaScript

// 笔者是第一段代码 function fire () { console.log(this.a) } var obj = { a: 1, fire: fire } obj.fire(); // 输出1 // 作者是第二段代码 var obj = { a: 1, fire: function () { console.log(this.a) } } obj.fire(); // 输出1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 我是第一段代码
function fire () {
      console.log(this.a)
}
  
var obj = {
      a: 1,
      fire: fire
  }
obj.fire(); // 输出1
// 我是第二段代码
var obj = {
        a: 1,
        fire: function () {
             console.log(this.a)
         }
}
obj.fire(); // 输出1

fire函数并不会因为它被定义在obj对象的里边和外界而有任何差别,也正是说在上述隐式绑定的三种格局下,fire通过this依然得以访谈到obj内的a属性,那告诉我们:

1.  this是动态绑定的,也许说是在代码运营期绑定并不是在书写期

2.  函数于对象的独立性, this的传递错失难点

(下边包车型客车汇报可能含有个人的情义补助而显得不太严苛,但那是因为本身梦想阅读者尽恐怕地掌握自身想发挥的意思)

总结

本文介绍了JavaScript中的跨域基本概念和爆发的原委,以及如何减轻跨域的三种艺术,一种是JSONP 一种是 CO奥迪Q5S,在客户端Javascript调用服务端接口的时候,若是须求协理跨域的话,供给服务端协助。JSONP的措施正是服务端对回到的值实行回调函数包装,他的独到之处是辅助广大的浏览器, 劣点是仅扶助Get的不二等秘书籍对服务端央浼。另一种主流的跨域方案是COCR-VS,他仅要求服务端在回来数据的时候在对应头中到场标志新闻。这种办法丰盛简便。唯一的劣势是亟需浏览器的支撑,一些较老的浏览器恐怕不接济CO奥迪Q3S脾气。

跨域帮助是成立WebService时应当思考的贰个功效点,希望本文对你在那边面有所支持,文中是选择ServiceStack来演示跨域辅助的,若是你用的WCF的话,知道跨域原理的前提下,达成跨域应该轻巧。

 

抽屉菜单

您身处导航成分里的符号都定义在滑走的利用抽屉菜单里。为了大家的目标,笔者坚定不移使用标题(<core-toolbar>)和导航链接 (<core-menu>):

XHTML

<nav> <core-toolbar><span>Single Page Polymer</span></core-toolbar> <core-menu selected="0"> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#one">Single</a> </paper-item> <paper-item noink> <core-icon icon="label-outline"></core-icon> <a href="#two">page</a> </paper-item> ... </core-menu> </nav>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<nav>
  <core-toolbar><span>Single Page Polymer</span></core-toolbar>
  <core-menu selected="0">
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#one">Single</a>
    </paper-item>
    <paper-item noink>
      <core-icon icon="label-outline"></core-icon>
      <a href="#two">page</a>
    </paper-item>
    ...
  </core-menu>
</nav>

注意,今后<core-menu selected=”0″>被硬编码为选用第一个条文。大家今后会把它改为动态的。

H5 Crash 测量试验结果

测量检验结果:

  • 经过 opacity、animation、positon 等办法创制层,即便是 1w 个,页面也远非分明扭转;不过选用 transform 成立 2k~5k 个层,页面会卡顿几秒后即时闪退;
  • 内部存款和储蓄器是条红线,测量检验开采,一遍性消耗 20M 的内部存款和储蓄器,会促成顾客端即时闪退;
  • 现身央浼也是存在响应难题的,Fetch API 和 CSS Resource 并发 1k 央求未有出现难点,但是 XHRubicon 和 Script Resource 央浼,难题特地鲜明,固然并未有导致页面闪退,然则页面已经进去了假死状态。

上述临界值仍是能够一而再标准。

构造函数中的this

function Foo(){ this.x = 1; this.getX = function(){ console.log(this.x); } } var foo = new Foo(); foo.getX();

1
2
3
4
5
6
7
8
function Foo(){
    this.x = 1;
    this.getX = function(){
        console.log(this.x);
    }
}
var foo = new Foo();
foo.getX();

执行 new 即便不思考原型链,只思考上下文的切换,就也便是先创制多个空的目的,然后把那些空的靶子作为构造函数的上下文,再去施行构造函数,最终回到这一个指标。

var newMethod = function(func){ var context = {}; func.call(context); return context; } function Foo(){ this.x = 1; this.getX = function(){ console.log(this.x); } } var foo = newMethod(Foo); foo.getX();

1
2
3
4
5
6
7
8
9
10
11
12
13
var newMethod = function(func){
    var context = {};
    func.call(context);
    return context;
}
function Foo(){
    this.x = 1;
    this.getX = function(){
        console.log(this.x);
    }
}
var foo = newMethod(Foo);
foo.getX();

隐式绑定下,作为对象属性的函数,对于目标的话是单身的

据说this动态绑定的表征,写在指标内部,作为对象属性的函数,对于那一个指标的话是单独的。(函数并不被那几个外界对象所“完全具有”)

作者想发挥的情趣是:在上文中,函数即使被定义在对象的当中中,但它和“在目的外界申明函数,然后在目的内部通过品质名称的艺术取得函数的引用”,那二种情势在性能上是等价的而不仅仅是意义上

概念在目的内部的函数只是“恰好能够被那几个目的调用”而已,实际不是“生来就是为这一个指标所调用的”

 

借用上边包车型大巴隐式绑定中的this传递错过难点来证实:

JavaScript

var obj = { a: 1, // a是概念在指标obj中的属性 1 fire: function () { console.log(this.a) } } var a = 2; // a是概念在大局意况中的变量 2 var fireInGrobal = obj.fire; fireInGrobal(); // 输出 2

1
2
3
4
5
6
7
8
9
10
var obj = {
      a: 1,    // a是定义在对象obj中的属性   1
      fire: function () {
   console.log(this.a)
        }
      }
var a = 2;  // a是定义在全局环境中的变量    2
var fireInGrobal = obj.fire;  
fireInGrobal(); //  输出 2

地点这段轻巧代码的幽默之处在于: 这一个于obj中的fire函数的引用( fireInGrobal)在调用的时候,行为表现(输出)完全看不出来它正是在obj内部定义的其缘由在于:大家隐式绑定的this遗失了!! 进而 fireInGrobal调用的时候获得的this不是obj,而是window

地点的事例稍微变个方式就能够成为三个或许忧虑大家的bug:

JavaScript

var a = 2; var obj = { a: 1, // a是概念在对象obj中的属性 fire: function () { console.log(this.a) } } function otherFire (fn) { fn(); } otherFire(obj.fire); // 输出2

1
2
3
4
5
6
7
8
9
10
11
var a = 2;
var obj = {
    a: 1,    // a是定义在对象obj中的属性
    fire: function () {
          console.log(this.a)
     }
}  
function otherFire (fn) {
     fn();
}  
otherFire(obj.fire); // 输出2

在上头,大家的重大剧中人物是otherFire函数,它接受三个函数援用作为参数,然后在内部一向调用,但它做的要是是参数fn还是能够透过this去获得obj内部的a属性,但实则, this对obj的绑定早就经不见了,所以输出的是大局的a的值(2),并不是obj内部的a的值(1)

本文由云顶集团400800044发布于云顶集团400800044,转载请注明出处:的多种绑定情势【云顶集团400800044】,换个思路

关键词:

上一篇:没有了

下一篇:没有了