美文网首页
javascript

javascript

作者: ishgy | 来源:发表于2017-08-09 21:45 被阅读0次

    语法基础

    类型转换

    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就可以编辑了,适用于任何元素。

    相关文章

      网友评论

          本文标题:javascript

          本文链接:https://www.haomeiwen.com/subject/tltcrxtx.html