javascript

2017-08-09  本文已影响0人  ishgy

语法基础

类型转换

1,parseInt(),parseFloat(),Number()要传参,toString()不传参

字符串

charAt()返回传入参数在字符串中的下标

charCodeAt()用法和charAt()一样,返回字符的字符编码

截取字符串方法

substring(),slice()第一个参数为开始位置,第二个为结束位置(参数是负数才有区别)

substr()第一个参数为开始位置,第二个为截取的字符个数

indexOf(),lastIndexOf()返回指定字符在字符串中的下标

trim()删除前/后空格

对象

对象具有的属性和方法:

1,constructor:构造函数,用来创建当前对象的函数

2,hasOwnProperty(propertyName):用于检查对象中是否具有某属性,属性名用字符串形式指定

3,isPropertyOf(object):传入的对象是否是另一个对象的原型

4,toLocaleString():转换成当地的字符串

5,toString():转换成字符串

流程控制

1,++a和a++如果是单独的一条语句两者没区别,做运算的时候才会有

2,foreach(for

in):如果扩展了原始数组,此方法就有问题了。建议忘记这种方法

3,switch使用的全等符做比较的

数组

1,判断某对象是不是数组用Array.isArray(someObject)

2,join(),分割数组,括号中传入分隔符,如不传分隔符默认以空格分隔

3,数组操作方法

push()在数组末尾添加一项或多项,返回修改后的长度

pop()移除数组最后一项,返回移除的项并修改数组长度

unshift()在数组前端添加一项或多项,并返回修改后的长度

shift()移除数组最前面的一项,返回移除的项并修改数组长度

reverse()逆转排序

sort()从小到大(不是转换成数值而是字符串类型作比较,所以不适用数字数组大小排序)

concat()把参数组合成一个行数组,参数可以是数组也可以是字符串等

slice()截取数组指定部分(传参下标确定哪些项)

splice()删除;插入;替换(都是通过传入的下标确定)

indexOf()------lastIndexOf()查找

10,数组迭代方法(下面的方法都会让每一项执行指定的函数)

every()---每一项都返回true,则返回true

some()---只要有一项返回true,返回true

filter()---返回true组成的数组

forEach()---没有返回值

map()---返回每项函数的结果

函数

1,没有方法重载,但是可以模拟。后面的同名函数会覆盖前面的函数。

2,函数可以写在调用之后(和变量不一样,变量会是undefined,函数会正常执行),但是必须是函数声明而不是函数初始化语句

eg:函数声明:function funName(){}函数初始化语句:var funName = function(){}

3,函数也可以作为参数传递给另一个函数,这样必须去掉括号,只传函数名

4,对象A想调用对象B的方法,给对象A添加属性,值是对象B的方法。

5,在window下定义函数,就是给window添加了属性,函数名是属性名,函数是属性值

6,我的函数习惯:写在调用之前,用匿名函数赋值于变量的方式

7,包含两个属性:

length:希望接收参数的个数

prototype:后面会详解,非常重要的属性,其值不能枚举

8,对于第4点,对象A调用对象B的方法,ES5添加了bind()方法能简便实现

eg:varsayColor = function(){//这是全局对象的方法

alert(this.color);

}

var myO = {color:’red’};//定义一个对象

var myOColor = sayColor.bind(myO);//这样就可以了

myOColor();//弹出red

Math对象

min(),max(),ceil()--向上取整,floor()—向下取整,round()—四舍五入

random()—0~1的随机数,不包含0和1,1位小数

面向对象

对象

万物皆对象

1,数据属性

对象属性具有的属性叫数据属性

configurable----能否通过delete删除,默认为true。通过var声明的变量函数不能删除,通过window生命的全局属性可以删除。

enumerable----能否通过for in枚举。默认为true。

writable----能否修改属性值。默认为true。

value----属性值。默认为undefined(未初始化)。

2,设置或修改数据属性(有该属性就修改,没有就设置)

Object.defineProperties()----2个参数,对象名、数据属性集合

eg:var person = {

name: ‘Marry’,

age: 24

}

Object.defineProperties(person,{

name : {

value : 28,

configurable : ‘false,’

},

age : {

writable : ‘false’,

enumerable : ‘false,’

},

})

Object.defineProperty()----一次只能修改一个数据属性,传3个参数(可以忘记)

3,获取数据属性

Object.getOwnPropertyDescriptor()----2个参数,对象名、属性名

eg:var person= {

name: ‘Marry’,

age: 24

}

varattrAttr = Object.getOwnPropertyDescriptor(person,’name’);

console.log(attrAttr.configurable);//true

console.log(attrAttr.value);//Marry

注:也可以在创建的对象的时候初始化数据属性的值,步骤:创建空对象>>使用Object.defineProperties()方法初始化。

4,对象类型

创建对象

1,普通模式

一次创建一个对象,即构造方法(通过new关键字)和对象字面量

2,工厂模式

function createPerson(name,age,sex){

varo = {

name: name,

age: age,

sex: sex

}

return o;

}

window.person1 = createPerson(‘Marry’,20,’women’);

window.person2 = createPerson(‘Jim’,24,’man’);

缺点:创建对象,返回对象,有点啰嗦,麻烦(看着麻烦,不过倒是易懂~),为了解决这个问题,于是有了自定义构造函数创建对象。

3,自定义构造函数模式

functionPerson(name,age,sex){

this.name= name;

this.age= age;

this.sex= sex;

this.sayName= function(){

console.log(‘Myname is ’ + this.name);

}

}

window.person1 = new Person(‘Marry’,20,’women’);

window.person1 = new Person(‘Jim’,24,’man’);

构造函数名首字母大写(小写也可以,为了好的习惯),必须通过new关键字;通过构造函数创建的对象具有constructor属性,该属性指向构造函数。在上例中person1.constructor== Person;//true

缺点:方法会在实例化的时候(在内存中)重新创建一遍,函数也是对象,所以占内存;这是其一,更不能接受的是不同的函数做同样的事,这就太浪费了。可以把方法放在构造函数外面,写成全局函数,然后指向它。这样就可以解决多个函数做一样的事:

var sayName = function(){

console.log(‘Myname is ’ + name);

}

functionPerson(name,age,sex){

this.name= name;

this.age= age;

this.sex= sex;

this.sayName= sayName;

}

window.person1 = new Person(‘Marry’,20,’women’);

window.person1 = new Person(‘Jim’,24,’man’);

不过新问题又来了,如果对象需要多个方法,就要定义多个全局函数。为了解决这个问题,于是出现了原型模式创建对象。

4,原型模式

functionPerson(name,age){}

Person.prototype.name= name;

Person.prototype.age= age;

Person.prototype.sayName= function(){

console.log(this.name);

};

var person1 = new Person(‘Marry’,20);

var person2 = new Person(‘Jim,24);

构造函数是一个空函数,将所有属性和方法添加到构造函数的prototype属性上。这样解决了自定义构造函数的问题。现在实例化对象时,(在内存中)方法只有一个。每个函数都具有prototype属性,该属性指向函数的原型对象。

BOM

window对象

1,窗口大小

outerWidth和outerHeight获得浏览器窗口大小(除了谷歌,别的浏览器在普分屏会有几像素的偏差,但是这两货用处不大)

innerWidth和innerHeight获得浏览器视口大小(不包含滚动条)window.innerWidth

2,打开窗口

window.open(‘url’,’方式’,’高宽,距离等属性’);-----3个参数都是可选的

方式:_blank,_self-------新开标签页或者当前标签页中

如果有第三个参数,无论第二个参数是什么方式,都会新开窗口

3,计时器

setTimeout(),clearTimeout()-------setInterval(),clearInterval()

location对象

1,location.href == window.location.href

2,location.replace(‘url’),会在当前标签页转到新地址,但是不会生成历史记录,不能返回

3,location.reload()-----重载页面(会从缓存中加载)

location.reload(true)-------重载页面(从服务器加载)

navigator对象

检测哪种浏览器

history对象

hidtory.go();参数如果是正数就前进,负数就后退

DOM

节点层次

代码中的换行也会被当成节点(空白节点)

1,nodeName----返回元素标签名

2,nodeType----返回节点类型

3,childNodes----子节点,其中保存了一个Nodelist对象

4,parentNode----父节点

5,previousSibling----哥哥节点(第一个子节点的previousSibling属性值是null)

6,nextSibling----弟弟节点(最后一个子节点的nextSibling属性值是null)

7,firstChild----第一个子节点(someNode.childNodes[0])

8,lastChild----最后一个子节点(someNode.childNodes[someNode.childNodes.length-1])

9,hasChildNodes()----检查是否含有子节点。有,返回true;没有,返回flase

节点操作

1,appendChild()----在尾部插入节点,参数表示将要插入的节点

2,insertBefore()----在指定位置插入节点,两个参数,一个是新节点,一个是参照节点(将成为参照节点的哥哥节点)

3,removeChild()----移除节点,一个参数即将要移除的节点

4,replaceChild()----替换节点,两个参数,一个是新节点,一个事将要被替换的节点

获取节点

1,document.documentElement----获得html元素

2,document.body----获得body元素

3,document.URL----获取当前页面地址

4,document.forms----document.getElementsByTagName(‘forms’)----获取所有表单

元素节点

1,nodeType == 1

2,nodeName为元素标签名

3,nodeValue为null

4,parentNode是document或某元素

5,子节点可能是元素节点(element),文本节点(text),注释节点(comment)----注意:实用的子节点只有3个,别的都不是子节点

6,每个元素节点都有属性节点(但不是子节点),访问、修改或设置属性节点通过element.attributes----不能移除某属性

7,元素特性操作getAttribute(),setAttribute(),removeAttribute();获取自定义属性时用getAttribute()。因为别的都可以用对象的方式来替代,这样更方便。element.style,elsment.className。

8,创建元素document.createElement(‘div’);传的参数是标签名

文本节点

1,nodeType为3

2,nodeName为#text

3,nodeValue为文本内容

4,没有子节点

5,创建文本节点:document.createTextNode(‘参数’);参数为文本内容

注释节点

1,nodeType为8

2,nodeName值为#comment

3,nodeValue为注释内容

4,没有子节点

属性节点

1,nodeType为11

2,nodeName为属性名称

3,nodeValue为属性值

4,没有父节点和子节点

H5DOM扩展

选择器

1,querySelector()参数为css选择器,所以要加“#”或“.”如果是元素就不加,选取第一个元素。

eg:document.querySelector(‘p’)-----获取第一个p元素

document.querySelector(‘.my-div’)----获取第一个class为my-div的元素

document.getElementById(‘banner’).querySelector(‘.my-p’)----获取id为banner下面第一个class为my-p的元素

2,querySelectorAll()用法一样,不过选取的不是第一个元素而是多个元素

3,matchesSelector()检查某元素是否具有某特性(id,class之类)

eg:document.getElementById(‘my-div’).matchesSelector(‘.select’);----如果id为my-div的元素具有class.select返回true否者返回false。

注意兼容:ie — msMatchesSelector()chrome – webkitMatchesSelector()

firefox— mozMatchesSelector()opera – oMatchesSelector()

推荐使用classList.contains()代替

节点选择

1,childElementCount----子节点个数(不包括空白节点和注释节点)

2,firstElementChild----第一个子元素(非空白节点和注释节点)

3,lastElementChild----最后一个子元素(非空白节点和注释节点)

4,previousElementChild----哥哥元素(非空白节点和注释节点)

5,nextElementChild----弟弟元素(非空白节点和注释节点)

与类相关

1,document.getElementsByClassName()

2,classList----返回类名集合(字符串)

2.1add()remove()toggle()contains()----是否含有

eg:div.classList.add(‘d1’)----添加d1类

div.classList.remove(‘d1’)----移除d1类

div.classList.toggle(‘d1’)----切换d1类

div.classList.contains(‘d1’)----如含有类d1返回true,反之返回false

文档加载状态

document的属性readyState的值如果为loading表示文档还在加载,如果是complete则表明文档加载完毕。不适用于ajax。

if(document.readyState== ‘loading’){

//执行操作,loading动画等

}

元素大小

style不是万能的

获取或设置元素样式最常见的是selector.style.attr如div.style.color,这种不能获取外部样式中的样式,只能获取行内样式;通过这种方式修改或设置元素样式也只能修改在行内样式,行内样式优先级高于外部样式,从而达到修改或设置的目的。

偏移值

1,style对象方式

如上所说,假如要获取div的高宽,如果元素高宽样式没有写在行内就获取不到,通常会写在外部样式表中。如果就是写在行内样式中,获取的是content的高宽不含padding和border(由盒模型box-sizing决定包不包含padding和border)。能使用此方法修改元素高宽。

2,offsetWidth----获取元素宽度,样式写在外部样式中也能获取到,不能以此修改高宽

3,offsetHeight----和offsetWidth一样,获取的是高度,也不能设置或修改元素高度

4,offsetLeft----offsetTop,获取元素距离文档顶部和左边的值。td是例外,是距离table

5,图解:

视口大小

clientWidth和clientHeight----获取适口大小

元素视口大小和offsetWidth,offsetHeight的值一样,浏览器视口大小会去掉被滚动隐藏的部分和滚动条。

document.documentElement.clientWidth----浏览器视口宽度

document.documentElement.clientHeight----浏览器视口高度

使用window.innerWidth,window.innerHeight更方便

滚动条

滚动条距离顶部的距离

document.body.scrollTop----没有DTD申明

document.documentElement.scrollTop----没有DTD申明

教程网络上都是这么说的,但是这是屁话!!!还是做兼容吧

var scrTop =document.body.scrollTop || document.documentElement.scrollTop;

事件处理

DOM0级

添加事件处理程序:

var btn =document.querySelector(‘button’);

btn.onclick =function(){

console.log(this.id);

}

移除事件处理程序:

btn.onclick =null;

DOM2级事件

添加事件处理程序:

var btn =document.querySelector(‘button’);

btn.addEventListener(‘click’,function(){

console.log(this.id);

},flase);//flase表示冒泡,true表示捕获

btn.addEventListener(‘click’,function(){

console.log(‘第二个事件程序’);

},flase);

DOM2级事件优势:1,可以添加多个事件,会按照先后顺序执行;2,明确冒泡还是捕获

移除事件处理程序:

要把函数进行传参才能移除

var btn =document.querySelector(‘button’);

var showId =function(){

console.log(this.id);

}

添加事件处理程序:

btn.addEventListener(‘click’,showId,false);

移除事件处理程序:

btn.removeEventListener(‘click’,showId,false);

事件对象

有用的就这3个:

event.preventDefault();----阻止默认行为

event.stopPropagation();----阻止冒泡或捕获

event.currentTarget----响应事件的元素(等于this)

事件类型

1,load----加载完毕,可用于页面(window),窗体(iframe),图像(img)

页面加载:

HTML事件:

DOM2级事件:window.addEventListener(‘load’,function(){console.log(‘loaded’)},false);

图像加载:

HTML事件:

DOM2级事件:

document.querySelectorAll(‘img’).addEventListener(‘load’,function(){

console.log(‘loaded’)

},false);

2,resize----改变窗口

window. addEventListener(‘resize,function(){console.log(‘resized)},false);

3,scroll----当文档滚动

4,focusin----获得焦点

5,focusout----失去焦点

6,click----点击

7,dblclick----双击

8,mouseenter----鼠标位于元素上(不冒泡)

9,mouseleave----鼠标离开元素(不冒泡)

10,mousemove----鼠标在元素上移动

11,mousewheel----鼠标滚轮滚动

12,keydown----按下键盘上的某个键(keycode,返回物理键码)

13,keyup----松开键盘上的某个键

14,keypress----按下键盘上的某个键(返回字符串)

15,contextmenu----浏览器默认上下文菜单

eg:window.addEventListener('contextmenu',function(event){

event.preventDefault();//取消默认上下文菜单显示

},false);

16,DOMContentLoaded----文档就绪函数,jQuery文档就虚函数采用的就是这种

17,还有表单事件

鼠标坐标

1,clientX、clientY----鼠标在可视窗口的坐标

2,pageX、pageY----鼠标相对于整个页面的坐标

3,screenX、screenY----鼠标相对于电脑屏幕的而坐标

eg:functionshowCoords(event){

var span = document.getElementsByTagName("span");

span[0].innerHTML = event.clientX;

span[1].innerHTML = event.clientY;

}

document.onmousemove= showCoords;

事件委托

目的是为了提高性能,节约内存。每个函数都是一个对象,对象越多,性能越低。利用事件委托一个函数可以少写一些函数,达到减少内存使用的目的。原理是利用了事件冒泡。

表单

获取表单

1,传统document.getElement….

2,document.querySelector….

3,document.forms----获取页面所有表单,是个类数组对象,[0]表示第一个表单

4,document.forms[‘form2’]----获取name为form2的表单

提交表单

1,点击type为submit的按钮

2,点击type为image的按钮

3,document.forms.submit()----提交所有表单

4,验证提交

varmyForm = document.forms[0];

myForm.addEventListener(‘submit’,function(event){

//如果不合法

event.preventDefault();

},false);

表单重置

1,点击type为reset的按钮

2,form.reset()

表单字段

表单元素属性

☞disabled----禁用

☞readOnly----只读

☞type----类型

☞value----传给服务器的值

☞options[index]----selected元素特有,下拉选项

☞selected----选中下拉框中的opeions项

document.forms[0].value=”123”

document.forms[0].disabled=true

document.getElementsByTagName(“select”).options[0].selected= true;

表单事件

1,change() ----input和textarea的值变化时;select元素更改选择项时

2,forcusin,focusout----聚焦和失焦事件

3,添加下拉框选项

var newOption = new Option(‘页面显示文本’,’传递到服务器的value值’);

selectbox.add(newOption,undefined);//undefined参数不可少

4,移除下拉框选项

selectbox.remove(index);//传参表示移除第几项

富文本

表单相应字段属性contenteditable设置为true就可以编辑了,适用于任何元素。

上一篇下一篇

猜你喜欢

热点阅读