不定期更新的新问题(cookie、async、font-family)

cookie:

例子:

首先,我们创建一个函数用于存储访问者的名字:

function setCookie(cname,cvalue,exdays)
{
  var d = new Date();
  d.setTime(d.getTime()+(exdays*24*60*60*1000));
  var expires = "expires="+d.toGMTString();
  document.cookie = cname + "=" + cvalue + "; " + expires;
}

函数解析:

以上的函数参数中,cookie 的名称为 cnamecookie 的值为 cvalue,并设置了 cookie 的过期时间 expires

该函数设置了 cookie 名、cookie 值、cookie过期时间。

获取 cookie 值的函数

然后,我们创建一个函数用户返回指定 cookie 的值:

function getCookie(cname)
{
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for(var i=0; i<ca.length; i++) 
  {
    var c = ca[i].trim();
    if (c.indexOf(name)==0) return c.substring(name.length,c.length);
  }
  return "";
}

trim方法去掉两边空格

 indexOf() 方法返回调用 String 对象中第一次出现的指定值的索引

函数解析:

cookie 名的参数为 cname

创建一个文本变量用于检索指定 cookie :cname + "="

使用分号来分割 document.cookie 字符串,并将分割后的字符串数组赋值给 ca (ca = document.cookie.split(';'))。

循环 ca 数组 (i=0;i<ca.length;i++),然后读取数组中的每个值,并去除前后空格 (c=ca[i].trim())。

如果找到 cookie(c.indexOf(name) == 0),返回 cookie 的值 (c.substring(name.length,c.length)。

如果没有找到 cookie, 返回 ""

 

检测 cookie 值的函数

最后,我们可以创建一个检测 cookie 是否创建的函数。

如果设置了 cookie,将显示一个问候信息。

如果没有设置 cookie,将会显示一个弹窗用于询问访问者的名字,并调用 setCookie 函数将访问者的名字存储 365 天:

function checkCookie(
{
  var username=getCookie("username");
  if (username!="")
  {
    alert("Welcome again " + username);
  }
  else 
  {
    username = prompt("Please enter your name:","");
    if (username!="" && username!=null)
    {
      setCookie("username",username,365);
    }
  }
}

async函数:

async 函数就是 Generator 函数的语法糖。

先来介绍一下语法糖:

     加糖后的代码编译后跟加糖前一毛一样。加糖后的代码写起来很爽,包括但不限于:代码更简洁流畅,代码更语义自然...

 async函数最重要的就是async和await,async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。

async 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。

async function fn(args){
  // ...
}
// 等同于
function fn(args){ 
  return spawn(function*() {
    // ...
  }); 
所有的 async 函数都可以写成上面的第二种形式,其中的 spawn 函数就是自动执行器。

async函数的用法:async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

     举个栗子🌰:

                 50毫秒以后,输出"hello world"。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value)
}
asyncPrint('hello world', 50);

     await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。

async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise().catch(function (err){
    console.log(err);
  });
}

await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。

如果希望多个请求并发执行,可以使用 Promise.all 方法。

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = await Promise.all(promises);
  console.log(results);
}

// 或者使用下面的写法

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = [];
  for (let promise of promises) {
    results.push(await promise);
  }
  console.log(results);
}

 font-family:

   font-family是规定元素字体系列,font-family可以有多个属性,如果浏览器不支持第一个字体,则会尝试下一个。也就是说,浏览器会使用它可识别的第一个值。任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit"。

有两种类型的字体系列名称:

  • 指定的系列名称:具体字体的名称,比如:"times"、"courier"、"arial"。
  • 通常字体系列名称:比如:"serif"、"sans-serif"、"cursive"、"fantasy"、"monospace

 使用某种特定的字体系列(Geneva)完全取决于用户机器上该字体系列是否可用;这个属性没有指示任何字体下载。因此,强烈推荐使用一个通用字体系列名作为后路。

如果字体名称包含空格,它必须加上引号。在HTML中使用"style"属性时,必须使用单引号。

 

posted @ 2018-04-25 10:11  tcyA  阅读(264)  评论(0编辑  收藏  举报