Javascript BOM DOM编程

#BOM 和 DOM
#####浏览器内核:
①渲染引擎:webkit;  
② JS引擎:V8引擎(谷歌)
DOM浏览器:对DOM的支持高于IE(包括谷歌)。
###怎么在浏览器里面写JS代码:
    方法1:外联JS
    <script src="路径 "></script>   可以引多个JS,从上往下指行。

    方法2:内部书写
    <script> 
    let a = 100;       // 这个a是全局变量,整个网页都可以通用。
    consle.log(a);        // 100
    </script> 

    方法3:内嵌  内嵌作用域全局尽量避免
    <a  herf = " javasript:console.log(内嵌JS) " 执行JS</a>      console.log(内嵌JS)它是一个代码块。
    <input type = "button" value onclick = "console.log('click')">   console.log('click') 它是一个代码块。
    

    <script> 
     window.onload = function (){            //后面是的会覆盖前面的
     let a = 100;                   // 局部的a ,定义在函数里的变量就是局部的。
     console.log("a",a)
    }
    </script>

    window.addEventListener  ("load",function(){});    不会覆盖前面的。
    


##BOM
    window代表一个窗口
    window 对象有哪些属性和方法:
    BOM :Bowser(浏览器) Object(对象) Moder (模式)
    属性:
    innerWidth    innerheight       // 可视区域的宽度
    outerWidth   outerHeight)      //浏览器的宽和高
    
     window.screenX      window.screenY    // screenX  窗口相当于屏幕的X轴 ;screenY窗口相当于屏幕的Y轴   类似雪碧图  

    (window里面的属性:就是window.属性)



    方法:alert("警告");  如果出现框,如果不关掉,会阻止代码,下面的代码不会执行。
    let  flag = confirm ("确认");
        console.log(flag);
    let value = prompt("请输入:")
     console.log(value);

    时间函数 :异步 一般用在动画中
    1.    setTimeout()给定一个时间,等时间时间到了之后,执行且执行一次这个方法。
    例:let timeId = setTimeout ( function(){
    console.log("timeout");
    },200);
    cleartimeout(timeoutId);

    2. setInterval()   每隔多长时间后,不断的间隔执行方法。
    let  count  =0;
    let intervalId = setInterval( function(){
        count++;
        if(count>5){
        clearInterval(inderId)    //用来结束循环
        }
        console.log("interval",count);
    }


    队例:先进先出
    open("")  打开一个新窗口 ,里面写地址,弹出一个标签页。
    open("地址","name","width=0,height=30" ); 子页面的宽高

    Screen 对象属性
    screen.availWidth      screen.availHeight    
        //电脑屏幕的宽度和高度  ,高度不加上下边的任务栏  。"screen.avail:",  可以不写它只是在终端显示出来,方便我们知道它是那个对象的属性。
    screen.width    screen.height         /电脑屏幕的总宽度和总高度   。高度要加上下边的任务栏

    location 对象属性 (通过location可以访问网站的任何一部分)
    location.herf = "http:"   ";   跳转到指定页面

    http://www.baidu.com:80/index.com/#xx?name:xxx





#DOM
##docunment(文档)Object(对象)Moder(模式)
DOM(文档树) : html根节点  {head , body是子节点}(head , body里面的元素是子节点)   

                            
##点击事件  格式: n.onclick= function(){ }
 


DOM节点分三种:
                
                                 nodeType       nodeName       nodeValue

                1.  元素节点 :       1          元素名           null
                2.  属性节点 :      2          属性名           属性值
                3.  文本节点:       3          #text           文本内容    例:<h1> 标题 <h1>
##获取节点的方法:(方法要调用)
1.  getElementById("");   (获取节点)
2.  getElementsByTagName("元素名");    根据元素获取多个节点(集合、数组)
3.  getElementsByName("元素名");    根据内容属性获取
4.  doucument.querySelector("css选择器");       根据css的选择器获取一个节点 (只得一个,第一个节点)
5.  doucument.querySelectorAll("css选择器");       根据css的选择器获取全部节点
##属性用来遍历节点:(.属性)
1. firstChild第一个节点
2. lastChild 最后一个节点
3. nextSibing 下一个节点(兄弟查找)
4. previousSibing上一个节点(兄弟查找)
5. parentNale 父节点
6. childNodes所有的节点
##创建节点
创建元素节点:createElement("");
创建属性节点:createAttribute("");   也可以直接用 格式:newNode.id = " ";
创建文本节点:createTextNode("");
##DOM 的方法:对整个节点的增改查删  进行操作。
添加:n.appendChild( ); - 添加新的子节点(元素)   ()括号里写新节点
插入父节点:n.insertBefore(新节点,旧节点 );   新节点会插入到旧节点的前面
删除:n.removeChild();  删除子节点(元素)  例:(n.lastChild)从最后一个开始删除
修改节点(替换节点):  n.replaceChild();   括号里面填(newnode新节点,n.firstChild.nexSibing旧节点);首先要先创建一个新的节点。
##innerHTML属性  :可以获取或改变任意HTML元素,包括(HTML和BODY)。(把获取的内容以字符串的形式返回) input id = "innerHTMLBth" type= "button" value

innerHTMLBth.onclick = function (){

      .innerHTML = "<p>新增元素</p>";     替换之前的元素

      .innerHTML += "<p>新增元素</p>" ;   添加在之前元素的后面

      .innerHTML = "<p>新增元素</p>" +    .innerHTML;     添加在之前元素的前面
}

.innerHTML设置的内容会被浏览器解析,而innerText的内容不会被解析,原样的显示出来。

###IE浏览器的限制:
1.    不允许tr,td通过innerHTML添加到table 里面
2.    不允许option通过innerHTML添加到select里面。 

##事件:在某一刻发生的事情
##事件流:在一个标签上触发了一个事件后,沿着这个方向进行传播

###事件流的分类:

1.    事件冒泡 :(IE仅支持冒泡) 从里到外;
2.    事件捕获:(网景浏览器仅支持)从外到里
3.    DOM事件流:(及支持冒泡也支持捕获)。
默认情况下浏览器都是事件冒泡

###DOM处理事件的方法:
1. 内嵌事件 直接在标签上绑定事件 (尽量避免,它在全局找)
2. DOM0 传统处理事件:
     优点:兼容浏览器,以on开头后加属性名,所有的字母都是小写。
     缺点:只能为一个事件添加一个处理方法。
3. DOM2  优点:为一个事件,添加多个处理方法。
        缺点:IE不兼容
       IE的处理方法:
###DOM2 的增加删除
    增加:.addEventListener("事件",function){    }
    删除:.removeEventListener("事件",function){   }
###IE浏览器的增加删除
    增加:.addEventListener("事件",show);
    删除:.removeEventListener("事件",show);
###DOM0 的增加删除
    增加:.事件 = function (){}
    删除:.事件=null;
###事件处理的类型:
    鼠标 常用的:onclick点击    ondbliclick双击    oncontextmenu右键
    键盘: onkeydown 按下    onkeyup 松开  onkeypress 按下松开
###事件对象:Event 每一个事件被触发后,就会产生一个对象,用形参来接收这个事件。
    IE :    e= window.event || e
    DOM  :   e.
    
    clientX    clientY  鼠标顶部到可视区域的距离
    screenX    screenY   电脑屏幕区域的距离   IE用e.screenX  e.screenY
    pageY     pageX     鼠标顶部到body顶部的距离

###阻止事件的冒泡:
    IE方法:cansel Bubble = true
    DOM浏览器方法: stopProgation()方法    一般用于做复杂的动画

###阻止事件的默认行为:不是每一个事件都有默认行为
    IE:returnValue = false
    DOOM : preventDafault ()方法
###事件委托:适用于同时为很多标签绑定事件。 (子元素不处理,委托父元素统一处理)
怎么确定是子元素:
event.target.parentNode.

##消除闭包
产生闭包的两个条件:1.一个函数的内部函数在访问外部变量
                2.在此函数外部引用了这个内部函数
```js
let arr = [1,2,3,4,5]
for(var i = 0; i < arr.length; i++){
    (function(index){
        lis[index].onclick = function(){
            console.log(index);
        }
    })(i)
    }
//解决办法就是:使用立即调用函数,传形参,不让它访问外部变量
``` 



###获取表单:
1. DOM方法 document.getElementById("");

BOM方法:
2. document.forms[0];              // [下标]
3.  document.forms[""];         // ["ID名"] 
  document.forms["f"+"m"];            //["f"+"m"]字符串拼接,
4.  document.name(名)


###获取表单域对象/表单字段:
1. let a = document.getElementById("a");
2. fm(form的Id名).elements(表单元素)    // 例:let a = fm.elements[0]
3. let a = fm.elements[“”];  //   [“Id名”]
4. let a = fm.a          //    .id或者  . name 都可以
5. let a = fm[""]      // ["ID名"] 
6. let a = fm[0]      //   [下标]


form表单可以用标签提交,也可以用JS方法提交
<input type="button">这是一个普通按钮,不具备提交功能,但是用JS方法也可以具备提交功能
<input type="rest">    返回初始状态(默认状态)
<input type="image" src = "地址">   具有提交功能
表单名.onsubmit = function (){}     当利用标签提交时会触发onsubmit事件,如果用JS提交就不会触发onsubmit事件。重置标签和重置方法都会触发onrest.
###特殊属性  :
多选     multipe    
关闭,禁用     disabled       无法提交到服务器  ,但是可以用JS(false,true)方法可以取消禁用,但是标签不可以取消
只读    readlyonly     只有输入框有readlyonly只读,单行和多行也可以有
选中   checked
添加元素:父级点. Option.add(Ls);   //(Ls)增加的内容
获取选中的元素: 父级点.onchange = function (){}  改变事件      [父级点. selectedIndex].innerHTML
删除元素:父级点.ption.remove();   删除一个
        父级点.ptions.length = 0;  清空
获取焦点事件: .onfocus  = function (){}
离开/失去焦点事件:  .onblur = function (){}           改变了值,并且离开才会触发焦点事件
              .oninput 只要改变了值以后,立即触发的事件。

###HTML5设置的JS方法
1. 视频
```js
<video>
    <source src = "" type = "video/mp4">
</video>
```
ontimeupdate   当时间改变时触发      //音频/视频的位置发生改变
ID名.play()    播放当前音频/视频
ID名.pause()       暂停 当前音频/视频  
controls   特殊属性   控制

2. 音频

3. canvas 标签
```html
        <canvas> </canvas>     //设置宽度,高度引用属性,并且不加px
        例:<canvas width = "800" height = "400"  id = "cs">     
       
```
```js
    let cs = document.getelementById("cs");/获取画板
    let ctx = cs.getContext("2d");      //获取画笔
    ctx.fillRect(0,0,200,50)//     矩型,有颜色填充
    ctx.fillStyle = "red"//     变换画笔颜色(默认为黑色)
    ctx.strokeStyle = "blue"无颜色填充
    ctx.lineCap ()设置直线
    ctx.arc(圆心X坐标,圆心Y坐标,半径,起始角位置,结束角 ,true/false(可选写))
      例:ctx.arc  ( 100,75, 50,2*Math.PI);    //画圆  如果半圆就把(2*Math.PI改成Math.PI) ;如果要逆时针的半圆就在第六个属性写true  ,顺时针 false) 
    
    ctx.beginPath();        //开始新的路径
    ctx.lineWidth = 20;
    ctx.moveTo(20,20);    //起始坐标(从那个地方开始   。初始化)
    ctx.lineTo(20,150);    //结束坐标  (要移动到的那个位置)
    ctx.closePath();    //关闭路径
```

4. 引入图片

```js
    let image = new Image();
    image.src = "images/地址/路径";
    image.onload = function(){      //等加载完之后
        ctx.rotate(Math.PI);
        ctx.drawImage(image,-125,-125,250,250)
    }
```

如果做旋转之类的动画:
先  .save(),    //保存  状态;
完了再   .restore()    //恢复;
 .translate(X,Y)    //改变原点位置;



###HTML5 内联SVG   全称(SVG可伸缩矢量图形)
1. 位图:有一个个的像素块构成。 
优点:图片色彩丰富
缺点:如果图片不等比例缩放会失真。
2. 矢量图:通过一系列的算法算出来的。 (它不是html5 的规范,它自己本身就是一个规范)
优点:不会失真,可伸缩。可通过编辑器来创建和修改。
缺点:色彩不够丰富。
3. SVG 优点:
可伸缩矢量图形
用于定义用于网络的基于矢量的图形
使用XML格式定义图形
SVG是万维网的标准
SVG可被搜索、索引
4. canvas 和SVG的区别:

Canvas  :

依赖分辨率

不支持事件处理器

弱的文本渲染能力

能够以 .png 或 .jpg 格式保存结果图像

最适合图像密集型的游戏,其中的许多对象会被频繁重绘



SVG:

不依赖分辨率

支持事件处理器

最适合带有大型渲染区域的应用程序(比如谷歌地图)

复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)

不适合游戏应用


SVG教程:
cx和cy属性定义圆点的x和y坐标。如果省略cx和cy,圆的中心会被设置为(0, 0)
r属性定义圆的半径
```js
  例:<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="40" stroke="black"      //画圆
  stroke-width="2" fill="red" />
</svg>
```




CX属性定义的椭圆中心的x坐标
CY属性定义的椭圆中心的y坐标
RX属性定义的水平半径
RY属性定义的垂直半径
```js
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <ellipse cx="300" cy="80" rx="100" ry="50"          //椭圆
  style="fill:yellow;stroke:purple;stroke-width:2"/>
</svg>
```

元素可以安排任何分小组与<tspan> 元素的数量。每个<tspan> 元素可以包含不同的格式和位置。几行文本(与 <tspan> 元素
//几行文本共同组成的
```js
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <text x="10" y="20" style="fill:red;">Several lines:
    <tspan x="10" y="45">First line</tspan>
    <tspan x="10" y="70">Second line</tspan>         
  </text>
</svg>

```

###HTML的拖拽
draggable = "true"   允许拖拽 ,标签跟着鼠标移动
拖放事件:
ondragstart   开始
ondragend  结束
ondrag
要有拖放目标 :
 ondragenter 进入拖放目标 ,有响应事件(触发)
 ondragleave  离开时触发
ondragover  移动,一直在触发
ondrop 会受到干扰,如果让ondrop触发,首先要阻止 ondragover的默认行为,放开时才会触发。
e.preventDefault()  阻止默认行为。

###HTML5 web存储
cookie:服务器会发给浏览器一些简短的东西 (例登陆)   不属于HTML5
容量小 : 4KB
安全性 :容易被截获

HTML5开始的,存放在浏览器里面的对象。
sessionStorage 和 localStorage   本地存储,不会提交给浏览器

区别:
localStorage  存放时间长 除非自己删除,否则一直存放   用法一样

sessionStorage   打开浏览器开始,关闭浏览器结束。存放范围短,用法一样

方法: 保存数据   两者存进去的都是字符串,不是字符串会转成字符串。

JOSN.stringify();存入的是对象,先转成字符串 

JOSN.parse();取 还原成数组


属性:
保存数据:localStorage.setItem(key,value);

读取数据:localStorage.getItem(key);

删除单个数据:localStorage.removeItem(key);

删除所有数据:localStorage.clear();

得到某个索引的key:localStorage.key(index);


#jQuery

jquery:函数库,简化开发
特点:
1. 简单,小巧
2. 兼容所有的浏览器
 
jquery版本:
      1.X版本 任兼容IE8以下的版本
      3.X 以 2.X开始完全放弃IE9以下的版本
###一 引入jquery
jquery的用法:
先得到jquery对象:jquery("选择器")  ; 在jquery中 $ = jquery ,所以可以写成$("选择器")   例:$("#d1")
###二 jquery对象如何转化成原生
方法1:.get        例: $("选择器").get(0).innerHTML ="hello";   (0)下标
方法2. []    例: $("#d1")[0].innerHTMl = "hello";
###三 原生对象转化成jquery对象
$()  
   例:let d1 = document.getElementById("d1");
    $(d1).html("hello");
###四 jquery对象里循环对象的方法  (遍历出来的都是数组,需要转换成jquery)
 1.  for
 2.   for of
 3.   map
 4.   reduce
 5.   for in
 6.   forEach
 7.   filter
 8.   jquery each
 ###五jquery选择器
例:$("#d1").css("color","red");

atter一般用做普通属性的设置
prop一般用作特殊属性的设置
toggleClass:切换
###文档处理:
#####添加节点:
添加
方法1 父级. append 子级点   添加在父级的后面   例:$("选择器")("<p>增加节点</p>")
方法2 子级 . appendTo 父级    添加在父级的后面    例:$("<p>增加节点</p>") . appendTo("选择器")
添加在前面   :$("选择器") . prepend ("增加的节点")
加到对应的选择器后面: $("选择器").before  ("增加的节点")
加到对应的选择器前面: $("选择器"). after  ("增加的节点")

#####包裹节点:
$("选择器").mrap("<div></div>")   向每个选择器加入父节点
$("选择器").mrapAll("<div></div>")   向整个选择器加入父节点
$("选择器").mrapInner("<div></div>")   向每个选择器内容加入一个节点

#####修改/替换节点:
方法1:$("选择器").replaceWidth("节点")
方法2:$("节点").replaceWidth("选择器")

#####删除节点;
$("选择器").remove()     清空所有的内容,包括事件,标签,内容 //$("选择器")被删除
$("选择器").detach()  
$("选择器").empty()    还剩一个标签

###操作CSS
一个属性的书写格式:$("选择器").css(backgroundColor:red);
多个属性的:
$("选择器").css ({
backgroundColor:red,
border:1px solid red

})
###筛选
prev() 用于筛选前一个同辈元素
prevAll()查找当前元素之前的所有同辈元素

###其他:
$("选择器").offset.left/top     :相对可视区域 (有2个属性left/top )

("选择器").position :返回相对于父元素

width  height   设置的宽/高
innerWidth   innerHeihgt     还包含padding 和border
outerWidth    outerHeight        还包含padding 和border和 margin

###语法糖:on("事件类型",回调函数)   可以解决所有事件
格式:$("选择器"). on ("事件类型",function(){



})
 
事件委托点击事件:$("父级").delegate("指定哪一个子元素做委托","事件",function(){

})

###面试常问的;
on  可以解决所有事件
bind       现在几乎不用了,转向on
live      用来做委托事件,过时了
delegate     用来做委托事件,现在还在用

怎么在浏览器里写jquery代码:
$(window).on("load",function(){

});  可以添加多个事件。DOM加载完成,等整个页面加载完成后执行   尽量使用这个

而之前的window.oload = function(){}   只可以添加一个事件


$(document).ready(function(){
});    页面加载完成,等DOM加载完成后执行。  可简写 (语法糖):$(function(){  })  这两个如果一起写,他们的执行顺序是丛书到下的

###链式操作
  例:$("选择器").css({
            width:100,
            height:100,
            border:“1px  solid  red ”
    }).atter("title","标题").html("<p>段落</p>")     //  1. 链式操作的写法:不换行的写法
    2.普通操作的写法: $("").atter("name","id")
    3.或:let $d1 = $("")     //他也是链式操作的写法,换行的写法。把选择器先交给一个变                      $d1.css()                             量,而这个变量名我们通常给它前面加一个$.
    (在筛选的方法中会破坏原有链条  .find    .end回到最近一次破坏性的操作)       

###jquery动画
show:显示隐藏的匹配元素
hide:隐藏显示的元素
toggle:用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件。

如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。
slideDown:从下到上
slideUp:从上到下
slideToggle:

###animate 第一个参数是JOSN,第二个参数是时间   (指定一个最终样式,自动补充)
例:$("").animate({
    maginLeft:500,   //第一个参数仅限于数字(padding,top...)
    opcity:0,
    width:0,
    color:red

   },2000);
    $("").animate({


   },2000,function(){
    $("").stop(true ,false);
    }     //停止
   );

###停止动画:
.finsh():停止当前正在运行的动画,删除所有排队的动画,完成最终的状态。
.stop(参数1,参数2如果不写默认false)
.stop(true,true)  //来到当前状态
.stop(false,false)   //来到当前动画,执行下一个动画
.stop(true,false)     //停在原地
.stop(false,true)   //直接到当前动画的最终状态,执行下一个动画
###性能的优化:
1. 应该总是从ID选择器开始继承   例;$("")
2. 尽量在class前面加元素名    例:("h1.tt")
3. 尽量使用ID选择器来替代class选择器
4. 在适当的时候使用jquery的链式操作
5. 将jquery对象缓存起来使用,赋值给一个变量,变量名前加$

例:  let $obj = $("");
      $obj.css();
      $obj.html();

例: let $ps = $("");
    for (let i = 0;i<$ps.length;i++){
    $ps.eq(i).html();
   }
6. 限制直接操作DOM的次数(循环的时候不要append,先用字符串拼装,然后再一次型添加到节点上)。
7. 尽量使用事件委托
8. JS代码尽量推迟到window.onload事件中进行
9. 使用事件委托时用delegate来替代live
10. 能用子代选择器就不用后代选择器。

posted @ 2018-02-25 01:13  小小小梅子  阅读(452)  评论(0)    收藏  举报