HTML-CSS-JS 基础知识

Posted by franki on July 1, 2018

html css javascript 基础回顾

HTML & CSS 部分

HTML

lable 标签有什么用 label主要作用于表单填写,当用点击了标签,就会聚焦到绑定的输入框 eg:

<label for="Name">username</lable>
<input type="text" name="Name" id="Name" />

如何进行跨页面访问或者说跨标签访问 主要通过localStorge、sessionStorage来进行通信

b和strong标签的区别 b和strong都是进行对元素进行加粗显示,b是个实体标签,会对所包含的字体设为bold粗体,是html语言的 strong则是逻辑标签,作用是加强语气而加粗字体,是xhtml的,主要是强调作用,更加语义化。

css常用布局

CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些? CSS 选择符: 1 id选择器(#myid) 2 类选择器(.myclassname) 3 标签选择器(div, h1, p) 4 相邻选择器(h1 + p) 5 子选择器(ul > li) 6 后代选择器(li a) 7 通配符选择器(*) 8 属性选择器(a[rel=”external”]) 9 伪类选择器(a: hover, li:nth-child)

可继承的样式 1 font-size 2 font-family 3 color 4 text-indent

不可继承样式 1 border 2 padding 3 margin 4 width 5 height

优先级算法 1 同权重情况下样式定义最近者为准 2 载入样式以最后载入的定位为准 3 !important > id > class > tag 4 !important > 内联样式 > id > class

CSS3新增伪类: p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素

p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素

p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素

p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素

p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素

:enabled :disabled 控制表单控件的禁用状态

:checked 单选框或复选框被选中

CSS 实现正方形等比放大缩小

div {
  width: 1vw;
  height: 1vw;
  background: red;
}

div {
  padding-bottom: 100%;
  background: red;
}

CSS 3 新增属性 1 css 边框 (border: 完整为border-top-left, border-top-right, border-bottom-right, border-bottom-left; border-radius: border-top-left-radius, border-top-right-radius, border-bottom-right, border-bottom-left-radius)

2 边框阴影 (box-shadow) 语法 {boxf-shadow: [inset] x-offset y-offset blur-radius extension-radius spread-radiuscolor}

div{
  /* 内阴影,向右偏移10px,向下偏移10px,模糊半径5px,阴影缩小10px */
  box-shadow: inset 10px 10px 5px -10px #888888;
}

阴影类型:此参数可选。如不设值,默认投影方式是外阴影;如取其唯一值inset ,其投影为内阴影;

X-offset:阴影水平偏移量,其值可以是正负值。如果值为正值,则阴影在对象的右边,其值为负值时,阴影在对象的左边;

Y-offset:阴影垂直偏移量,其值也可以是正负值。如果为正值,阴影在对象的底部,其值为负值时,阴影在对象的顶部;

Blur-radius:阴影模糊半径:此参数可选,但其值只能是为正值,如果其值为0时,表示阴影不具有模糊效果,其值越大阴影的边缘就越模糊;

Extension-radius阴影扩展半径:此参数可选,其值可以是正负值,如果值为正,则整个阴影都延展扩大,反之值为负值时,则缩小;

阴影颜色:此参数可选。如不设定颜色,浏览器会取默认色,但各浏览器默认取色不一致,特别是在webkit内核下的safari和chrome浏览器下表现为透明色,在Firefox/Opera下表现为黑色(已验证),建议不要省略此参数。

3 边框图片

border-image : border-image-source || border-image-slice [ / border-image-width] || border-image-repeat

4 CSS3 背景

background-size 在 CSS3 之前,背景图片的尺寸是由图片的实际尺寸决定的。在 CSS3 中,可以设置背景图片的尺寸,这就允许我们在不同的环境中重复使用背景图片。可以像素或百分比规定尺寸。如果以百分比规定尺寸,那么尺寸相对于父元素的宽度和高度

div{
  background:url(bg_flower.gif);
  /* 通过像素规定尺寸 */
  background-size:63px 100px;

  /* 通过百分比规定尺寸 */
  background-size:100% 50%;
  background-repeat:no-repeat;
}

background-origin 规定背景图片的定位区域,背景图片可以放置于 content-box、padding-box 或 border-box 区域

div{
  background:url(bg_flower.gif);
  background-repeat:no-repeat;
  background-size:100% 100%;
  /* 规定背景图片的定位区域 */
  background-origin:content-box;
}

background-clip 与background-origin 属性相似,规定背景颜色的绘制区域,区域划分与background-origin 属性相同

div{
  background-color:yellow;
  background-clip:content-box;
}

CSS3 多重背景图片

body{
  background-image:url(bg_flower.gif),url(bg_flower_2.gif);
}

5 CSS3 文本效果 给为本添加阴影,能够设置水平阴影、垂直阴影、模糊距离,以及阴影的颜色。

text-shadow

h1{
  text-shadow: 5px 5px 5px #FF0000;
}

text-wrap 属性

text-wrap: normal | none | unrestricted | suppress | break-word

p {word-wrap: break-word;}

6 CSS3 字体

/* 定义字体 */
@font-face{
  font-family: myFont;
  src: url('Sansation_Light.ttf'),
       url('Sansation_Light.eot');     /* IE9+ */
}

div{
  font-family:myFont;
}

7 CSS3 2D 转换

通过 CSS3 转换,我们能够对元素进行移动、缩放、转动、拉长或拉伸,转换是使元素改变形状、尺寸和位置的一种效果。

translate() 方法(移动)

div{
  transform: translate(50px,100px);
  -ms-transform: translate(50px,100px);        /* IE 9 */
  -webkit-transform: translate(50px,100px);     /* Safari and Chrome */
  -o-transform: translate(50px,100px);         /* Opera */
  -moz-transform: translate(50px,100px);        /* Firefox */
}

rotate (旋转,正值顺时针,负值逆时针)

div{
  transform: rotate(30deg);
  -ms-transform: rotate(30deg);        /* IE 9 */
  -webkit-transform: rotate(30deg);    /* Safari and Chrome */
  -o-transform: rotate(30deg);         /* Opera */
  -moz-transform: rotate(30deg);       /* Firefox */
}

scale() 方法 (缩放)

div{
  transform: scale(2,4);
  -ms-transform: scale(2,4);         /* IE 9 */
  -webkit-transform: scale(2,4);     /* Safari 和 Chrome */
  -o-transform: scale(2,4);         /* Opera */
  -moz-transform: scale(2,4);       /* Firefox */
}

skew() (扭曲)

/* 设置围绕 X 轴把元素翻转 30 度,围绕 Y 轴翻转 20 度。 */
div{
  transform: skew(30deg,20deg);
  -ms-transform: skew(30deg,20deg);         /* IE 9 */
  -webkit-transform: skew(30deg,20deg);     /* Safari and Chrome */
  -o-transform: skew(30deg,20deg);          /* Opera */
  -moz-transform: skew(30deg,20deg);        /* Firefox */
}

matrix()

matrix() 方法把所有 2D 转换方法组合在一起。matrix() 方法需要六个参数,包含数学函数,允许旋转、缩放、移动以及倾斜元素。

/* 使用 matrix 方法将 div 元素旋转 30 度 */
div{
  transform:matrix(0.866,0.5,-0.5,0.866,0,0);
  -ms-transform:matrix(0.866,0.5,-0.5,0.866,0,0);          /* IE 9 */
  -moz-transform:matrix(0.866,0.5,-0.5,0.866,0,0);         /* Firefox */
  -webkit-transform:matrix(0.866,0.5,-0.5,0.866,0,0);      /* Safari and Chrome */
  -o-transform:matrix(0.866,0.5,-0.5,0.866,0,0);           /* Opera */
}

8 CSS3 3D 转换

CSS3 允许使用 3D 转换来对元素进行格式化

rotateX() rotateY()

/* 设置元素围绕其 X 轴以给定的度数进行旋转 */
div{
  transform: rotateX(120deg);
  -webkit-transform: rotateX(120deg);   /* Safari 和 Chrome */
  -moz-transform: rotateX(120deg);  /* Firefox */
}

/* 设置元素围绕其 Y 轴以给定的度数进行旋转 */
div{
  transform: rotateY(130deg);
  -webkit-transform: rotateY(130deg);   /* Safari 和 Chrome */
  -moz-transform: rotateY(130deg);  /* Firefox */
}

9 CSS3 过度

通过 CSS3可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果。

/* 设置将变化效果添加在“宽度”上,时长为2秒;该时长在其他属性上并不适用 */
div{
  transition: width 2s;
  -moz-transition: width 2s;         /* Firefox 4 */
  -webkit-transition: width 2s;      /* Safari 和 Chrome */
  -o-transition: width 2s;           /* Opera */
}
/* 配合在一起使用的效果就是当鼠标移上去的时候宽度变为300px,这个过程耗时2秒 */
div:hover{
  width:300px;
}

| 属性                       |                                       描述 |
| -------------------------- | -----------------------------------------: |
| transition                 | 简写属性用于在一个属性中设置四个过渡属性 |
| transition-property        |            规定应用过渡的 CSS 属性的名称 |
| transition-duration        |         定义过渡效果花费的时间默认是 0。 |
| transition-timing-function |    规定过渡效果的时间曲线默认是 "ease" |
| transition-delay           |           规定过渡效果何时开始默认是 0。 |

9 CSS3 动画

通过 CSS3可以创建动画,这些动画可以取代网页中的画图片、Flash 动画以及 JavaScript。

/* 通过@keyframes 创建动画 */
@keyframes myfirst{
  from {background: red;}
  to {background: yellow;}
}
/* Firefox */
@-moz-keyframes myfirst {
  from {background: red;}
  to {background: yellow;}
}
/* Safari 和 Chrome */
@-webkit-keyframes myfirst {
  from {background: red;}
  to {background: yellow;}
}
/* Opera */
@-o-keyframes myfirst {
  from {background: red;}
  to {background: yellow;}
}

/*
   将创建的动画绑定到选择器,并至少指定以下两项 CSS3 动画属性
   1.指定动画的名称;
   2.指定动画的时长;
*/
div{
  animation: myfirst 5s;
  -moz-animation: myfirst 5s;       /* Firefox */
  -webkit-animation: myfirst 5s;    /* Safari 和 Chrome */
  -o-animation: myfirst 5s;         /* Opera */
}
属性 描述  
@keyframes 规定动画。  
animation 所有动画属性的简写属性, 除了 animation-play-state 属性。
animation-name 规定 @keyframes 动画的名称。  
animation-duration 规定动画完成一个周期所花费的秒或毫秒。默认是 0。  
animation-timing-function 规定动画的速度曲线。默认是 “ease”。  
animation-delay 规定动画何时开始。默认是 0。  
animation-iteration-count 规定动画被播放的次数。默认是 1。  
animation-direction 规定动画是否在下一周期逆向地播放。默认是 “normal”。  
animation-play-state 规定动画是否正在运行或暂停。默认是 “running”。  
animation-fill-mode 规定对象动画时间之外的状态。  

10 CSS3 多列

/* 将div中的文本分为3列 */
div{
  column-count:3;
  -moz-column-count:3;        /* Firefox */
  -webkit-column-count:3;     /* Safari 和 Chrome */
}

11 CSS3 用户界面

CSS3 resize

/* 设置div可以由用户调整大小 */
div{
  resize:both;
  overflow:auto;
}

CSS3 box-sizing

/* 规定两个并排的带边框方框 */
div{
  box-sizing:border-box;
  -moz-box-sizing:border-box;        /* Firefox */
  -webkit-box-sizing:border-box;     /* Safari */
  width:50%;
  float:left;
}

css 实现一个三角形

1 .test {
  width: 0;
  height: 0;
  margin: 0 auto;
  border: 6px solid transparent;
  border-top: red;
}

2 .test {
  width: 0;
  height: 0;
  margin: 0 auto;
  border-width: 6px;
  border-color: red transparent transparent transparent;
  border-style: solid dashed dashed dashed;
}

css 等高布局

原理:利用padding补偿法,设置父类超出隐藏,要等列的元素设置padding-bottom为一个很大的值,目的是为了填充,然后再设置margin-bottom去抵消这个值 这样就可以做成等高的布局

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>高度自适应布局</title>
<style>
body{ padding:0; margin:0; color:#f00;}
.container{ margin:0 auto; width:600px; border:3px solid #00C;
    overflow:hidden; /*这个超出隐藏的声明在IE6里不写也是可以的*/
}
.left{ float:left; width:150px; background:#B0B0B0;
    padding-bottom:2000px;
    margin-bottom:-2000px;
}
.right{ float:left; width:450px; background:#6CC;
   padding-bottom:2000px;
   margin-bottom:-2000px;
}
</style>
</head>
<body>
<div class="container">
    <div class="left">我是left</div>
    <div class="right">我是right<br><br><br>现在我的高度比left高,但left用它的padding-bottom补偿了这部分高度</div>
    <div style="clear:both"></div>
</div>
</body>
</html>

overflow: scroll 不能平滑滚动

-webkit-overflow-touching: touch;

盒模型:内容+内边距+边框+外边距 布局:定位布局、流布局、浮动布局、flex布局、grid布局,还有三栏布局中的圣杯和双飞翼布局。

圣杯:

<div id="container">
    <div id="center">center</div>
    <div id="left">left</div>
    <div id="right">right</div>
</div>

#container {
            padding: 0 100px 0 200px;/*左宽度为200px 右边宽度为100px*/
}
.col {
    float: left;
    position: relative;
    height: 300px;
}
#center {
    width: 100%;
    background: #eee;
}
#left {
    width: 200px;
    background: blue;
    margin-left: -100%;
    right: 200px;
}
#right {
    width: 100px;
    background: red;
    margin-right: -100px;
}

双飞翼布局:

<div id="container">
    <div id="center" class="col">
        <div class="wrap">center</div>
    </div>
    <div id="left" class="col">left</div>
    <div id="right" class="col">right</div>
</div>

#container {
            padding: 0 100px 0 200px;/*左宽度为200px 右边宽度为100px*/
}
.col {
    float: left;
    position: relative;
    height: 300px;
}
#center {
    width: 100%;
    background: #eee;
}
#left {
    width: 200px;
    background: blue;
    margin-left: -100%;
    right: 200px;
}
#right {
    width: 100px;
    background: red;
    margin-right: -100px;
}

两种布局的区别 这两种布局实现的都是两边固定宽度,中间自适应,中间栏放在最前面优先渲染。 不同的是,双飞翼布局多创建一个包裹的div,去掉了相对定位,css相对少写一些。 个人认为圣杯布局结构更简洁,平常工作中就看大家自己的选择了。

flex 容器

display: flex
  • 包含水平的主轴(main axis) 和垂直的交叉轴(cross axis)。主轴开始的位置叫main start, 主轴结束的位置叫做main end,交叉轴开始的地方叫cross axis,交叉轴结束的位置叫cross axis。主轴是从左到右,交叉轴从上到下 主要有6个属性:
  • flex-direction: row(水平方向,起点在左边) row-reverse(水平方向,起点在右边) column(垂直方向,起点在上面) column-reverse(垂直方向,起点在下面); (决定主轴的方向)
  • flex-wrap: nowrap(不换行) wrap(换行,第一行在上方) wrap-reverse(换行,第一行在下方)(换行定义)
  • flex-flow: (flex-direction 与 flex-wrap的组合,默认为row nowrap)
  • justify-content: flex-start(左对齐) flex-end(右对齐) center(居中) space-between(两端对齐,项目之前的间距都相等) space-around(每个项目两侧的间距相等,项目之前的间距俾项目与边框的间距大); (主轴的对齐方式)
  • align-items: flex-start(交叉轴起点对齐) flex-end(交叉轴终点点对齐) center(交叉轴中点对齐) baseline(项目第一行文字的基线对齐) stretch(交叉轴占满整个容器的高度); (交叉轴的对齐方式)
  • align-content: flex-start(与交叉轴起点对齐) flxe-end(与交叉轴终点对齐) center(与交叉轴中点对齐) space-between(与交叉轴两端对齐) space-around(每根轴线之前的距离相等) strech(默认,轴线充满整个交叉轴);(多根轴对齐方式,若只有一条轴线,该属性不起作用)

项目 flex

display: inline-flex;
  • order: 1 (项目的排列顺序,数值越小,排列越靠前)
  • flex-grow: (定义项目放大比例,默认为0)
  • flex-shrink: (定义项目缩小比例,默认为1,负值无效)
  • flex-basis: <length auto> (定义项目占据主轴的空间,默认是0,可以是具体大小(350px))
  • flex: none [<’flex-grwo’> <’flex-shrink’>?   <’flex-basis’>](是flex-grow,flex-shrink,flex-basic,默认是0 1 auto)
  • align-self: auto flex-start flex-end center baseline stretch(与容器的align-items)(定义单个项目与其他项目不一样的对齐方式,可覆盖align-items属性,默认为auto)
  • BFC(block formatting context) 块级格式化上下文 浮动元素和绝对定位元素,非块级盒子(inline-block,table-cell,table-captions),overflow值不为’visiable’的块级盒子,就会创建块级格式化上下文

1 float 不为none 2 positon 的值不是 static和 relative 3 display的值是inline-block table-cell flex table-caption inline-flex 4 overflow 不是visiable

好处 1 元素布局不受外界的影响,块盒与行盒都会垂直沿着父元素的边框排列 2 解决元素之间的折叠问题 3 解决浮动元素,文字环绕的问题 4 overflow: none;

居中问题

水平居中:

1 定宽

.center {
    width: 960px;
    margin-left: auto;
    margin-right: auto;
}

2 父元素为块元素,属性为text-align: center,子元素设置为display: inline-block;

3 浮动实现水平居中的方法

.pagination {
  float: left;
  width: 100%;
  overflow: hidden;
  position: relative;
}
.pagination ul {
  clear: left;
  float: left;
  position: relative;
  left: 50%;/*整个分页向右边移动宽度的50%*/
  text-align: center;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
  display: block;
  float: left;
  position: relative;
  right: 50%;/*将每个分页项向左边移动宽度的50%*/
}
.pagination a {
  display: block;
}

4 绝对定位实现水平居中

.ele {
    position: absolute;
    width: 500px;
    left: 50%;
    marign-left: -250px;
}

5 CSS3的flex实现水平居中

display: flex;
justify-content: center;

6 fit-content实现水平居中

.ele {
    width: fit-content;
    marign-left: auto;
    margin-right: auto;
}

垂直居中

1 行内元素垂直居中

.one {
    height: 100px;
    line-height: 100px;
}

2 利用display:table-cell使内容垂直居中

.two {
    display: table-cell;
    vertical-align:middle;
    text-align: center;
    width: 120px;
    height: 120px;
}

3 利用flex进行垂直居中

.three {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    flex-grow: row nowrap;
    align-items: center;
}

4 使用css3的新属性transfrom:translate(x,y)属性(可以不设定宽高,移动端常用)

.four {
    position: absolute;
    width: 80px;
    height: 80px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

5 最高大上的一种,用:before元素

.five {
    position: fixed;
    display: block;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    text-align: center;
}

.five:before {
    content: '';
    display: inline-block;
    vertical-align: middle;
    height: 100%;
}

.five.content {
    display: inline-block;
    vertical-align: middle;
    width: 60px;
    height: 60px;
    line-height: 60px;
}
  • session、cookie、sessionStorage、localStorage等区别

Cookie Cookie 是小甜饼的意思。顾名思义,cookie 确实非常小,它的大小限制为4KB左右,是网景公司的前雇员 Lou Montulli 在1993年3月的发明。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。(由服务器生成,可设置失效时间,如果在浏览器生成的cookie,关闭浏览器就会消失)

localStorage 是HTML5新加入的的技术,是一种本地存储

sessionStorage 与 session sessionStorage与localStorge的接口类似,session即是会话,在刷新浏览器时数据依旧存在,但是关闭浏览器后,数据就清空了,而localStorge却永久不会消失

  • px/em/rem的区别 px: 在页面缩放的时候无法调整大小 em: 值不是固定的,是根据父元素的字体大小,代表倍数 rem: 值不是固定的,是基于父元素根元素<html>字体大小的,也代表倍数

  • transform、animation和transiton的相关属性

两者区别: transition注重变换,注重几个属性 animation注重帧数变换,复杂的动画更适合

transition主要有四个属性: transition-property: none | all | [indent](执行变换的属性) transition-duration:

1、ease:(逐渐变慢)默认值,ease函数等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0).

2、linear:(匀速),linear 函数等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0).

3、ease-in:(加速),ease-in 函数等同于贝塞尔曲线(0.42, 0, 1.0, 1.0).

4、ease-out:(减速),ease-out 函数等同于贝塞尔曲线(0, 0, 0.58, 1.0).

5、ease-in-out:(加速然后减速),ease-in-out 函数等同于贝塞尔曲线(0.42, 0, 0.58, 1.0)

6、cubic-bezier:(该值允许你去自定义一个时间曲线), 特定的cubic-bezier曲线。 (x1, y1, x2, y2)四个值特定于曲线上点P1和点P2。所有值需在[0, 1]区域内,否则无效。

animation: @keyframes IDENT { from { Properties:Properties value; } Percentage { Properties:Properties value; } to { Properties:Properties value; } } 或者全部写成百分比的形式: @keyframes IDENT { 0% { Properties:Properties value; } Percentage { Properties:Properties value; } 100% { Properties:Properties value; } }

调用动画 .demo1 { width: 50px; height: 50px; margin-left: 100px; background: blue; -webkit-animation-name:’wobble’;/动画属性名,也就是我们前面keyframes定义的动画名/ -webkit-animation-duration: 10s;/动画持续时间/ -webkit-animation-timing-function: ease-in-out; /动画频率,和transition-timing-function是一样的/ -webkit-animation-delay: 2s;/动画延迟时间/ -webkit-animation-iteration-count: 10;/定义循环资料,infinite为无限次/ -webkit-animation-direction: alternate;/定义动画方式/ }

transform: transform: rotate(旋转) | scale(缩放) | skew(扭曲) | translate(移动) |matrix(矩阵);

JavaScript部分

  • JavaScript数据类型分哪些 六种原型数据类型: 1 Boolean 布尔值 2 null 空值 3 undefined 未定义 4 Number 数字 5 String 字符串 6 Symbol es6 新增 唯一的不可改变 主要作用判断变量属于哪一种类型

以及 Object 对象 Object 和 functions 是本语言的其他两个的基本元素

  • JavaScript闭包 我的看法是:所谓闭包就是内部函数可以访问其函数的内部变量,返回其内部函数,供函数外的环境使用

官方:闭包是函数和声明该函数的词法环境的组合。 经典实例:

function init() {
    var name = "Mozilla"; // name is a local variable created by init
    function displayName() { // displayName() is the inner function, a closure
        alert (name); // displayName() uses variable declared in the parent function
    }
    displayName();
}
init();

运行这段代码和之前的 init() 示例的效果完全一样。其中的不同 — 也是有意思的地方 — 在于内部函数 displayName() 在执行前,被外部函数返回。

第一眼看上去,也许不能直观的看出这段代码能够正常运行。在一些编程语言中,函数中的局部变量仅在函数的执行期间可用。一旦 makeFunc() 执行完毕,我们会认为 name 变量将不能被访问。然而,因为代码运行得没问题,所以很显然在 JavaScript 中并不是这样的。

这个谜题的答案是,JavaScript中的函数会形成闭包。 闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。在我们的例子中,myFunc 是执行 makeFunc 时创建的 displayName 函数实例的引用,而 displayName 实例仍可访问其词法作用域中的变量,即可以访问到 name 。由此,当 myFunc 被调用时,name 仍可被访问,其值 Mozilla 就被传递到alert中。

  • 前端跨域

跨域是指访问的东西来源,只要是协议、域名、端口不同就会限制访问。

1 通过document.domain跨域

2 通过location.hash跨域

try {
    parent.location.hash = 'data';
} catch (e) {
    // ie、chrome的安全机制无法修改parent.location.hash,
    var ifrproxy = document.createElement('iframe');
    ifrproxy.style.display = 'none';
    ifrproxy.src = "http://www.baidu.com/proxy.html#data";
    document.body.appendChild(ifrproxy);
}

3 通过HTML5的postMessage方法跨域

// a 页面
window.onload = function() {
    var ifr = document.getElementById('ifr');
    var targetOrigin = "http://www.google.com";
    ifr.contentWindow.postMessage('hello world!', targetOrigin);
};
// b页面
var onmessage = function (event) {
  var data = event.data;//消息
  var origin = event.origin;//消息来源地址
  var source = event.source;//源Window对象
  if(origin=="http://www.baidu.com"){
console.log(data);//hello world!
  }
};
if (typeof window.addEventListener != 'undefined') {
  window.addEventListener('message', onmessage, false);
} else if (typeof window.attachEvent != 'undefined') {
  //for ie
  window.attachEvent('onmessage', onmessage);
}

4 通过jsonp跨域

<script type="text/javascript">
    function dosomething(jsondata){
        //处理获得的json数据
    }
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>
执行服务器返回的一段js代码从而获取值

5 通过CORS跨域(Cross-Origin Resource Sharing)跨域资源共享 服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问

// 服务器需要配合设置
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

6 通过window.name跨域

JavaScript继承

javascript 是基于原型的 javascirpt对象都是基于原型链顶端的Object的实例

继承: JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

// 让我们假设我们有一个对象 o, 其有自己的属性 a 和 b:
// {a: 1, b: 2}
// o 的 [[Prototype]] 有属性 b 和 c:
// {b: 3, c: 4}
// 最后, o.[[Prototype]].[[Prototype]] 是 null.
// 这就是原型链的末尾,即 null,
// 根据定义,null 没有[[Prototype]].
// 综上,整个原型链如下:
// {a:1, b:2} ---> {b:3, c:4} ---> null

console.log(o.a); // 1
// a是o的自身属性吗?是的,该属性的值为1

console.log(o.b); // 2
// b是o的自身属性吗?是的,该属性的值为2
// 原型上也有一个'b'属性,但是它不会被访问到.这种情况称为"属性遮蔽 (property shadowing)"

console.log(o.c); // 4
// c是o的自身属性吗?不是,那看看原型上有没有
// c是o.[[Prototype]]的属性吗?是的,该属性的值为4

console.log(o.d); // undefined
// d是o的自身属性吗?不是,那看看原型上有没有
// d是o.[[Prototype]]的属性吗?不是,那看看它的原型上有没有
// o.[[Prototype]].[[Prototype]] 为 null,停止搜索
// 没有d属性,返回undefined

继承方法 JavaScript 并没有其他基于类的语言所定义的“方法”。在 JavaScript 里,任何函数都可以添加到对象上作为对象的属性。函数的继承与其他的属性继承没有差别,包括上面的“属性遮蔽”(这种情况相当于其他语言的方法重写)。

当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。

var o = {
  a: 2,
  m: function(){
    return this.a + 1;
  }
};

console.log(o.m()); // 3
// 当调用 o.m 时,'this'指向了o.

var p = Object.create(o);
// p是一个继承自 o 的对象

p.a = 4; // 创建 p 的自身属性 a
console.log(p.m()); // 5
// 调用 p.m 时, 'this'指向 p.
// 又因为 p 继承 o 的 m 函数
// 此时的'this.a' 即 p.a,即 p 的自身属性 'a'

使用不同的方法来创建对象和生成原型链 语法结构创建的对象

var o = {a: 1};

// o 这个对象继承了Object.prototype上面的所有属性
// o 自身没有名为 hasOwnProperty 的属性
// hasOwnProperty 是 Object.prototype 的属性
// 因此 o 继承了 Object.prototype 的 hasOwnProperty
// Object.prototype 的原型为 null
// 原型链如下:
// o ---> Object.prototype ---> null

var a = ["yo", "whadup", "?"];

// 数组都继承于 Array.prototype
// (Array.prototype 中包含 indexOf, forEach等方法)
// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null

function f(){
  return 2;
}

// 函数都继承于Function.prototype
// (Function.prototype 中包含 call, bind等方法)
// 原型链如下:
// f ---> Function.prototype ---> Object.prototype ---> null

构造器创建的对象

function Graph() {
  this.vertices = [];
  this.edges = [];
}

Graph.prototype = {
  addVertex: function(v){
    this.vertices.push(v);
  }
};

var g = new Graph();
// g是生成的对象,他的自身属性有'vertices'和'edges'.
// 在g被实例化时,g.[[Prototype]]指向了Graph.prototype.

Object.create 创建的对象

var a = {a: 1};
// a ---> Object.prototype ---> null

var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 (继承而来)

var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null

var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty); // undefined, 因为d没有继承Object.prototype

class 关键字创建的对象

"use strict";
class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}
class Square extends Polygon {
  constructor(sideLength) {
    super(sideLength, sideLength);
  }
  get area() {
    return this.height * this.width;
  }
  set sideLength(newLength) {
    this.height = newLength;
    this.width = newLength;
  }
}
var square = new Square(2);

性能 在原型链上查找属性比较耗时,对性能有副作用,这在性能要求苛 刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原 型链。

JavaScript的节流和防抖

函数防抖(debounce) 当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间

函数节流(throttle) 预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执 行该动作,然后进入下一个新周期

区别 函数防抖:如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。 函数节流 :保证如果电梯第一个人进来后,10秒后准时运送一次,这个时间从第一个人上电梯开始计时,不等待,如果没有人,则不运行

函数防抖

function _debounce(fn,wait){
    var timer = null;
    return function(){
        clearTimeout(timer)
        timer = setTimeout(()=>{
            fn()
        },wait)
    }
}
function _log(){
    console.log(1)
}
window.onscroll = _debounce(_log,500)

函数节流

function _throttle(fn,wait,time){
    var previous = null; //记录上一次运行的时间
    var timer = null;
    return function(){
        var now = +new Date();
        if(!previous) previous = now;
        //当上一次执行的时间与当前的时间差大于设置的执行间隔时长的话,就主动执行一次
        if(now - previous > time){
            clearTimeout(timer);
            fn();
            previous = now;// 执行函数后,马上记录当前时间
        }else{
            clearTimeout(timer);
            timer = setTimeout(function(){
                fn();
            },wait);
        }
    }
}
function _log(){
    console.log(1)
}
window.onscroll = _debounce(_log,500,2000)

JavaScript的事件

委托-捕获-冒泡-目标

ele.addEventListener('click', funciton, true) //捕获(从上到下,父节点到子节点的顺序)
ele.addEventListener('click', function, false) // 冒泡 (从里到外,子节点到父节点的顺序)

ajax请求方式

ajax是asynchronous javascript and XML的简写

//创建xhr对象
    var xhr;
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    //发送请求
    xhr.open('get','/uploads/rs/26/ddzmgynp/message.xml',false);
    xhr.send();
    //同步接受响应
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            //实际操作
            result.innerHTML += xhr.responseText;
        }
    }

    0(UNSENT):未初始化尚未调用open()方法
    1(OPENED):启动已经调用open()方法但尚未调用send()方法
    2(HEADERS_RECEIVED):发送己经调用send()方法且接收到头信息
    3(LOADING):接收已经接收到部分响应主体信息
    4(DONE):完成已经接收到全部响应数据而且已经可以在客户端使用了

this指向问题

具体看this所在环境 首先看方法的调用的方式,有直接调用,方法调用,new调用,bind后调用,call apply调用 ,es6箭头函数调用 1 直接调用 函数内部的 this 指向全局对象

// 简单兼容浏览器和 NodeJs 的全局对象
const _global = typeof window === "undefined" ? global : window;

function test() {
    console.log(this === _global);    // true
}

test();    // 直接调用

2 bind() 对直接调用的影响 还有一点需要注意的是 bind() 的影响。Function.prototype.bind() 的作用是将当前函数与指定的对象绑定,并返回一个新函数,这个新函数无论以什么样的方式调用,其 this 始终指向绑定的对象。还是来看例子:

const obj = {};

function test() {
    console.log(this === obj);
}

const testObj = test.bind(obj);
test();     // false
testObj();  // true

自己实现一个bind函数
const obj = {};

function test() {
    console.log(this === obj);
}

// 自定义的函数,模拟 bind() 对 this 的影响
function myBind(func, target) {
    return function() {
        return func.apply(target, arguments);
    };
}

const testObj = myBind(test, obj);
test();     // false
testObj();  // true

3 call 和 apply 对 this 的影响

const obj = {};

function test() {
    console.log(this === obj);
}

// 绑定到一个新对象,而不是 obj
const testObj = test.bind({});
test.apply(obj);    // true

// 期望 this 是 obj,即输出 true
// 但是因为 testObj 绑定了不是 obj 的对象,所以会输出 false
testObj.apply(obj); // false

4 方法调用

const obj = {
    // 第一种方式,定义对象的时候定义其方法
    test() {
        console.log(this === obj);
    }
};

// 第二种方式,对象定义好之后为其附加一个方法(函数表达式)
obj.test2 = function() {
    console.log(this === obj);
};

// 第三种方式和第二种方式原理相同
// 是对象定义好之后为其附加一个方法(函数定义)
function t() {
    console.log(this === obj);
}
obj.test3 = t;

// 这也是为对象附加一个方法函数
// 但是这个函数绑定了一个不是 obj 的其它对象
obj.test4 = (function() {
    console.log(this === obj);
}).bind({});

obj.test();     // true
obj.test2();    // true
obj.test3();    // true

// 受 bind() 影响,test4 中的 this 指向不是 obj
obj.test4();    // false

5 new 调用

var data = "Hi";    // 全局变量

function AClass(data) {
    this.data = data;
}

var a = new AClass("Hello World");
console.log(a.data);    // Hello World
console.log(data);      // Hi

var b = new AClass("Hello World");
console.log(a === b);   // false

6 箭头函数中的 this 这里已经清楚了说明了,箭头函数没有自己的 this 绑定。箭头函数中使用的 this,其实是直接包含它的那个函数或函数表达式中的 this。比如

const obj = {
    test() {
        const arrow = () => {
            // 这里的 this 是 test() 中的 this,
            // 由 test() 的调用方式决定
            console.log(this === obj);
        };
        arrow();
    },

    getArrow() {
        return () => {
            // 这里的 this 是 getArrow() 中的 this,
            // 由 getArrow() 的调用方式决定
            console.log(this === obj);
        };
    }
};

obj.test();     // true

const arrow = obj.getArrow();
arrow();        // true

es6相关知识点

1 let const

2 解构赋值

3 扩展

4 函数赋值默认参数

5 箭头函数

6 promise

7 generator(生成器)

8 symbol(类型判定)