javaScript基础

来源:互联网 发布:2016网络梗 编辑:程序博客网 时间:2024/05/24 23:12

//review:

数据类型的隐式转换

字符串>数字>布尔值

强制类型转换

toString parseInt parseFloat  无法转换的时候会返回NaN

typeof传入一个参数判断是什么类型

 

JS中5/2的结果是2.5

 

多了===和!==  比较的是值和类型

 

一.  流程控制

表达式的值      对应的布尔值

true                     true

false                    false

0                                        false

null                       false

“”                          false

undefined         false

NaN                     false

“非空值”           true

 

//5.条件表达式

       //js中的条件表达式可以是任意类型的值

       //当以非布尔值作为条件的时候,空值等价于false,非空的值等价于true

       //空值: 0null""NaNundefined

       //目的:简化JS的编程代码

       //假设:判断某变量,当它非空时输出OK

       var k = NaN;

       if(k){

              console.log("OK");

 

       }else{

              console.log("NOT OK");

       }

       var w ="0";

w && console.log("hi");

 

//常用内置对象

-String对象:

-Number对象:

-Boolean对象:

-Array对象:

-Math对象:

-Date对象:

-RegExp对象:

-Function对象:

 

//String对象

x.charCodeAt(index):返回指定位置字符的Unicode编码

-JS中的String有length属性,java中是length方法。

-JS中多出一个方法s.charCodeAt(index)。

-JS比java少了一个replaceAll()方法。

-JS中的String和java基本类似

 

//Number对象

-toFixed(index)重要

var n = 3.1415926;

       console.log(n.toFixed(3));

       var s = 3.1;

       console.log(s.toFixed(3));

 

//Boolean对象

没有API需要了解

//Array对象(重要)

         -如何创建数组

         -数组倒转方法

         -数组排序方法(重要)

         -vars = [100,200,300]

         -vara1 = new Array();

         //Array.sort();

         两两相比假如:a和b,是一个迭代的过程。

         有一个专门的方法:

         functioncompare(a,b){

                  return a.unidecode – b. unidecode;

                   //如果返回值>0,ab互换位置

                   //如果返回值<0,位置不变

}

排序规则:按照有小到大排序,该规则不能改动。  

         默认的比较方法是按照字符串进行比较,该方法可以置换。

        

         //2.Array

       //1)如何创建数组

       //理解:JS中的数组都是Object数组

       var a1 = ["zhangsan","23",true];

       console.log(a1[0]);

       var a2 =new Array();

       a2.push("lisi");

       a2.push(25);

       a2.push(false);

       console.log(a2[2]);

       //2)数组倒转与排序,数组的方法直接修改原数组

       var a3 = [5,1,8,12,6,3];

       a3.reverse();

       console.log(a3.toString());

       //3)数组排序

       a3.sort(function(a,b){

              return a-b;

       });

       console.log(a3);

      

//Math对象

//Date对象

var d1 = new Date();

       var d2 =new Date("2016/10/112:12:12");

       console.log(d1);

       console.log(d2);

       console.log(d1.toLocaleDateString());

       console.log(d1.toLocaleTimeString());

       console.log(d1.getFullYear());

       console.log(d1.getMonth()+1);

console.log(d1.getDate());

 

//RegExp

 

1.      若何创建正则对象

a.      /\d/g    g表示全局模式

b.      new RegExp(\\d,”g”) 需要转义

2.      检测模式

a.      g:global,全局模式

b.      i:ignore,忽略大小写模式

3.      正则对象的方法

a.      reg.test(str)                  相当重要

b.      reg.exec(str)

               //5.1正则对象的方法

       //1)reg.test(str),检查str中是否包含和reg匹配的子串

       console.log(reg.test(str));

       //2)reg.exec(str)

       //非全局模式,在str中找出第一个和reg匹配的子串

       console.log(reg.exec(str));

       //全局模式下,第N次调用该方法,则返回str中与reg匹配的子串

       reg = /no/g;

       console.log(reg.exec(str));

       console.log(reg.exec(str));

       console.log(reg.exec(str));

       //5.2       String中支持正则的方法

       //1str.replace(reg ,目标)重要

       //str中和正则reg匹配的子串替换成目标

       //不会改变原来字符串,会产生一个新的字符串

       console.log(str.replace(reg,"bu"));

       //2) str.match(reg)

       //str中找出和正则匹配的子串

       console.log(str.match(reg));

       //3) str.search(reg)

       //str中找出第一个和reg匹配的子串的索引

       console.log(str.search(reg));

 

//onblur=” ”;失去焦点事件

//给元素加样式,一般是 元素.className=”xxx”

//onsubmit

form上有此事件,该时间触发时表单就提交数据。

在点击提交(submit)按钮时自动触发onsubmit事件。

onsubmit事件内默认返回true,若设置返回false,则取消事件,数据不提交。

//

<style>

.ok {

       color: green;

}

 

.error {

       color: red;

}

</style>

<script>

       function checkCode() {

              //获取账号

              var code =document.getElementById("code").value;

              //写正则

              var span_code =document.getElementById("codemsg");

              var reg_code = /^\w{5,10}$/;

              if (reg_code.test(code)) {

                     //正确,将span设置绿色,否则红色

                     span_code.className= "ok";

                     returntrue;

              } else {

                     span_code.className= "error";

                     returnfalse;

              }

       }

       function checkPwd() {

              var psssword =document.getElementById("password").value;

              var span_msg =document.getElementById("psdmsg");

              var reg_msg = /^\w{10,20}$/;

              if (reg_msg.test(psssword)){

                     span_msg.className= "ok";

                     returntrue;

              } else {

                     span_msg.className="error";

                     returnfalse;

              }

       }

      

</script>

</head>

<body>

       <formaction="http://w3.tedu.cn/sql/sql_default.html"onsubmit="return checkCode()+checkPwd()==2;">

              <p>

                     账号:<inputtype="text"id="code"onblur="checkCode()">

                     <spanid="codemsg">5-10位字母、数字、下划线</span>

              </p>

              <p>

                     密码:<inputtype="password"id="password"onblur="checkPwd()">

                     <spanid="psdmsg">10-20位字母、数字、下划线</span>

              </p>

              <p>

                     <inputtype="submit"value="登录">

              </p>

       </form>

</body>

 

 

//function关键字(重要)

function对象

//6.Function

       //打开网页时,浏览器执行到此处,仅仅是创建了一个函数对象,并

       //没有调用这个函数,不传参数的时候调用时候几个就加几

       function sum(a,b,c){

              var s =0;

              if(arguments.length!=0){

                     for(vari=0;i<arguments.length;i++){

                            s+= arguments[i];

                     }

              }

              return s;

       }

       //打开网页时直接调用

console.log(sum(1,2));

 

-arguments(重要)

-eval(重要)

 

//匿名函数

数组排序的sort需要匿名函数

JS自带函数

-eval:

      

       var s ="2+3";

       console.log(s);//2+3

console.log(eval(s));5

作用是将字符串变为整数类型的加减

一般常用作计算器

 

一.  外部对象

BOM和DOM

浏览器对象

window:

-location:操作地址栏

           --history:操作历史记录

           -document:文档,代表浏览器显示的整个网页

DOM

           -screen:获取屏幕宽高、颜色等等

           -navigator:基础

         BOM(Browser ObjectModel):window和他的操作对象

         document:

                   -html:

                            head:meta 、title

                            body:div:<p><h>

                           

        

文档操作模型。

1.      外部对象就是浏览器提供的API

2.      BOM包含了DOM

 

//window

//弹出框

<script>

       function f1(){

//如果调用window属性或方法可省略对象名(window)

//我们直接调用的属性或方法浏览器默认为调用window的。

              //1.弹出框

              alert("好久不见!");

       }

       function f2(){

              var b = confirm("确认删除?");

              console.log(b);

       }

       function f3(){

              var v = prompt("好久不见了不是吗?");

              console.log(v);

       }

</script>

</head>

<body>

       <p>

              <inputtype="button"value="按钮1"onclick="f1()"/>

              <inputtype="button"value="按钮2"onclick="f2()"/>

              <inputtype="button"value="按钮3"onclick="f3()"/>

       </p>

</body>

 

//定时器

//周期性定时器

//setInterval(exp,time);

exp:周期性触发代码,习惯写匿名函数

time:单位为毫秒

 

clearInterval(tID):停止启动的定时器

//2.周期性定时器

       functionf4(){

              //启动周期性定时器,让它每隔1000毫秒调用一次函数,返回的是定时器的id,用来停止此定时器

              var n = 5;

              var id = setInterval(function(){

                     console.log(n--);

                     if(!n){

                            //通过定时器id来停止它

                            console.log("DUANG");

                            clearInterval(id);

                     }

              },1000);

              //启动定时器相当于启动了一个线程,当前方法f4()相当于主线程,而定时器相当于支线程,

              //二者并发执行不会等待,所以主线程在启动支线程之后立刻执行此行

              console.log("duang");

       }

       var id;

       //3.一次性定时器

       function f5(){

              //启动一次性定时器,让它在3000毫秒之后调用函数,返回定时器的ID。一次性定时器会在执行一次后自动停止,

              //若在未执行前希望手动停止,则需要使用ID

              id =setTimeout(function(){

                     console.log("dingdingdingding");

              },3000);

       }

       function f6(){

              //若定时器已经执行完成,则停止无效

              //若定时器未执行,则提前将其停止

              clearTimeout(id);

       }

</script>

 

//一次性定时器

<script>

       var id;

       function send() {

              if (id) {

                     //id非空,则定时器已启动,不要再次启动

                     return;

              }

              var p =document.getElementById("msg");

              p.innerHTML= "正在发送...";

              id =setTimeout(function() {

                     p.innerHTML= "已发送!"

                     //此时定时器自动停止,清空id

                     id= null;

              },3000);

       }

       function cancel() {

              if (id) {

                     //id非空,则定时器已启动,可以停止

                     var p =document.getElementById("msg");

                     p.innerHTML= "已撤销!"

                     clearTimeout(id);

                     //清空id

                     id= null;

              }

       }

</script>

<style>

#msg {

       width: 200px;

       height: 40px;

       line-height: 40px;

       text-align: left;

       font-size: 20px;

}

 

input {

       height: 30px;

       width: 40px;

       font-size: "微软雅黑";

}

</style>

</head>

<body>

       <inputtype="button"value="发送"onclick="send()"/>

       <inputtype="button"value="撤销"onclick="cancel()"/>

       <pid="msg"></p>

</body>

 

//常用属性

//location对象

-reload():重新载入当前网址,同按下刷新按钮

<script>

       //1. location

       function f1() {

              var b = confirm("您确定要离开本页面吗?");

              if (b) {

                     location.href= "http://tmooc.cn/web/index_new.html?tedu";

              }

       }

       function f2(){

              location.reload();

       }

</script>

</head>

<body>

       <inputtype="button"value="tarena"onclick="f1()"/>

       <inputtype="button"value="刷新"onclick="f2()"/>

</body>

//history对象

//back()后退、forward()前进、go(num)前进几步

<script>

       //1. location

       function f1() {

              var b = confirm("您确定要离开本页面吗?");

              if (b) {

                     location.href= "http://tmooc.cn/web/index_new.html?tedu";

              }

       }

       function f2(){

              location.reload();

       }

       function f3(){

              history.forward();

       }

       function f4(){

              history.back();

       }

</script>

</head>

<body>

       <inputtype="button"value="tarena"onclick="f1()"/>

       <inputtype="button"value="刷新"onclick="f2()"/>

       <inputtype="button"value="前进"onclick="f3()"/>

       <inputtype="button"value="后退"onclick="f4()"/>

</body>

 

//screen

width:

height:

availWidth:

availHeight:

 

//navigator

"Mozilla/5.0(Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"

项目名 

 

//BOM外部对象

浏览器对象模式,浏览器提供的API

//定时器

有规律的动画都是定时器做的。

java Timer底部就是线程

setInterval(exp,time);

setTimeOut(exp,time);

//navigator对象

包含浏览器信息

判断是什么客户端,PC或者手机终端

 

//实现秒表的小程序

<!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       //毫秒数

       var ms = 0;

       //计次的次数

       var n = 0;

       //启动秒表

       var id =null;

       function start() {

              if (id) {

                     return;

              }

              id =setInterval(function() {

                     //毫秒累加

                     ms+= 10;

                     //换算出分、秒、毫秒

                     var min = parseInt(ms / 1000/ 60);

                     var second = parseInt(ms /1000 % 60);

                     var milli = parseInt(ms %1000 / 10);

                     //分别写入对应的span

                     var span1 =document.getElementById("min");

                     var span2 =document.getElementById("second");

                     var span3 =document.getElementById("milli");

                     span1.innerHTML= prepend(min);

                     span2.innerHTML = prepend(second);

                     span3.innerHTML= prepend(milli);

              }, 10)

       }

       //0占位

       function prepend(m){

              return m.toString().length==1?"0"+m:m;

       }

       //暂停秒表

       function stop(){

              if(id){

                     clearInterval(id);

                     id= null;

              }

       }

       //复位秒表

       function reset(){

              if(id){

                     return;

              }

              var span1 =document.getElementById("min");

              var span2 =document.getElementById("second");

              var span3 =document.getElementById("milli");

              span1.innerHTML= "00";

              span2.innerHTML= "00";

              span3.innerHTML= "00";

              ms =0;

              n = 0;

       }

       //记录次数

       function record(){

              if(!id){

                     return;

              }

              //次数累加

              n++;

              //获取span中的分、秒、毫秒

              var span1 =document.getElementById("min");

              var span2 =document.getElementById("second");

              var span3 =document.getElementById("milli");

              //将上述信息记录到p

              var p =document.getElementById("record");

              p.innerHTML+=  "计次:" + n +" "+

              span1.innerHTML+ ":" +

              span2.innerHTML+ "." +

              span3.innerHTML+"<br>";

       }

</script>

</head>

<body>

       <p>

              <inputtype="button"value="启动"onclick="start()"/>

              <inputtype="button"value="暂停"onclick="stop()"/>

              <inputtype="button"value="复位"onclick="reset()"/>

              <inputtype="button"value="计次"onclick="record()"/>

       </p>

       <p>

              <spanid="min">00</span>:<spanid="second">00</span>.<spanid="milli">00</span>

       </p>

       <pid="record"></p>

</body>

</html>

 

 

 

//DOM内部对象

文档对象模型

一.  DOM对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


1.      浏览器获取网页内容并解析成对象,其目的是为了面向对象编程,而不是面向字符串编程。

2.      由于这套对象具有树型结构,称其为DOM树。

3.      树型结构的对象中,每一级对象称为一个节点。

4.      根据节点所对应的网页内容的而不同,给他们分类。

结论:学习DOM就是学习他的结构和每类对象上的API

DOM操作

增删改查

//读写节点

         <!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       //页面加载时间,在浏览器加载完页面后

       //自动触发,触发时调用对应的函数

       window.onload= function(){

              //1.读写节点

              //1.1读取节点的名称和类型

              var p1 =document.getElementById("p1");

              console.log(p1.nodeName);

              console.log(p1.nodeType);

              //1.2读写节点的内容(<a>内容</a>)

              //只要是双标签大部分都可以,单标签没有内容,例如:<br> <input>

              //1.2.1 innerHTML,显示的内容包含子标签

              console.log(p1.innerHTML);

              p1.innerHTML="1.<u>读写</u>节点";

              //1.2.2 innerText,显示的内容不包含子标签

              var p2 =document.getElementById("p2");

              console.log(p2.innerText);

              p2.innerText= "2.<u>查询</u>节点";

              //1.3 读写节点的值

              //只有表单控件有值(input/select/textarea)

              var btn =document.getElementById("btn1");

              console.log(btn.value);

              btn.value="BUTTON";

              //1.4 读写节点的属性

              //1.4.1 通过方法读写

              //它们都是标准API,任何浏览器都支持

              //读:getAttribyte("class")

              //写:setAttribute("class","      ")

              //删:removeAttribute("class")

              var img =document.getElementById("img1");

              console.log(img.getAttribute("src"));

              img.setAttribute("src","../images/06.jpg");

              //移出src属性,图片就消失

              img.removeAttribute("src");

              //1.4.2 通过属性名读写

              //1)使用标准的属性名(w3c规定)

              //常用属性名:className(最常用),style,id

              var p6 =document.getElementById("p6");

              console.log(p6.style);

              p6.style.fontSize= "30px";

              console.log(p6.className);

              //2)使用不标准属性名(简单了解即可)

              //其他的属性几乎都是非标准的

              //srchrefname

       }

</script>

</head>

<body>

       <pid="p1"><b>1.读写</b>节点</p>

       <pid="p2"><b>2.查询</b>节点</p>

       <pid="p3"><b>3.增删</b>节点</p>

       <p><inputtype="button"value="按钮"id="btn1"/></p>

       <p><imgsrc="../images/01.jpg"id="img1"/></p>

       <pid="p6"class ="ss"style="color:red">最常用的是className属性</p>

</body>

</html>

 

//图片轮播

 

<!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       //页面加载后

       var count = 0;

       var id =null;

       window.onload=function(){

              start();

       }

       function start(){

              //启动定时器每两秒换一张图片

                      id = setInterval(function(){

                     //累加轮播次数

                     count++;

                     //获取所有图片

                     var imgs =document.getElementsByTagName("img");

                     //遍历数组

                     for(vari=0;i<imgs.length;i++){

                            //将每个图片隐藏

                            imgs[i].className="hide";

                     }

                     //找出本次轮播要显示的图片

                     var n = count%imgs.length;

                     //将这个图片显示

                     imgs[n].className="show";

              },500);

       }

       //停止轮播

       function stop(){

              clearInterval(id);

       }

 

</script>

<style>

       div{

              width:218px;

              height:218px;

              border:1px solid #666;

       }

       /*让元素以行内块的形式来显示*/

       .show{

              display:inline-block;

       }

       /*隐藏元素*/

       .hide{

              display:none;

       }

</style>

</head>

<body>

       <!-- onmouseover是鼠标悬停事件 hovercss中的伪类选择器

       onmouseout是鼠标离开事件

       -->

       <divonmouseover="stop()"onmouseout="start()">

              <imgsrc="../images/01.jpg"/>

              <imgsrc="../images/02.jpg"class="hide"/>

              <imgsrc="../images/03.jpg"class="hide"/>

              <imgsrc="../images/04.jpg"class="hide"/>

              <imgsrc="../images/05.jpg"class="hide"/>

              <imgsrc="../images/06.jpg"class="hide"/>

       </div>

</body>

</html>

 

节点信息

1.      节点名称:nodeName

2.      节点类型:nodeType

节点属性

1.      getAttribute()

2.      setAttribute()、removeAttribute()

document.getElementById(“id”).style.color;

 

 <!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       window.onload= function(){

              //1.根据标签名查询节点

              //1.1在整个文档(网页)内查询

              var lis =document.getElementsByTagName("li");

              console.log(lis);

              //1.2在某个节点查询

              var ul =document.getElementById("city");

              var lis =ul.getElementsByTagName("li");

              console.log(lis);

              //2.根据层次查询节点

              //查询某节点的亲戚(父亲、孩子、兄弟)

              //2.1查询父亲

              var gz =document.getElementById("gz");

              console.log(gz.parentNode);

              //2.2查询孩子

              //2.2.1查询所有的孩子(带空格,了解)

              console.log(ul.childNodes);

              //2.2.2查询类型为元素的孩子(常用)

              lis =ul.getElementsByTagName("li");

              console.log(lis);

              //2.3查询兄弟

              //节点.父亲.孩子们[i]

              var li =gz.parentNode.getElementsByTagName("li")[1];

              console.log(li);

              //根据name查询节点

              var radios =document.getElementsByName("sex");

              console.log(radios);

       }

</script>

</head>

<body>

       <ol>

              <li>河北省</li>

              <li>山东省</li>

              <li>江苏省</li>

       </ol>

       <ulid="city">

              <li>北京</li>

              <li>上海</li>

              <liid="gz">广州</li>

              <li>深圳</li>

              <li>天津</li>

       </ul>

       <p>

              <inputtype="radio" name="sex"/>

              <inputtype="radio"name="sex"/>

       </p>

</body>

</html>

//增加和删除节点

 <!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       //1.创建新节点li

       //2.将它追加到ul的最后

       function f1(){

              //创建的新节点无任何内容和属性

              var li =document.createElement("li");

              //设置内容、值或属性

              li.innerHTML="连云港";

              //将其挂到DOM树下以显示

              var ul =document.getElementById("city");

              ul.appendChild(li);

       }

       //1.创建一个新节点li

       //2.将它插入到ul之下,广州之前

       function f2(){

              var li =document.createElement("li");

              li.innerHTML="连云港";

              //插入节点需要两个条件:父亲、弟弟

              var ul =document.getElementById("city");

              var gz =document.getElementById("gz");

              ul.insertBefore(li,gz);

       }

       //删除节点

       function f3(){

              var ul =document.getElementById("city");

              var gz =document.getElementById("gz");

              ul.removeChild(gz);

       }

</script>

</head>

<body>

       <p>

              <inputtype="button"value="追加"onclick="f1()"/>

              <inputtype="button"value="插入"onclick="f2()"/>

              <inputtype="button"value="删除"onclick="f3()"/>

       </p>

       <ulid="city">

              <li>北京</li>

              <li>上海</li>

              <liid="gz">广州</li>

              <li>深圳</li>

       </ul>

</body>

</html>

 

//联动菜单

 <!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       window.onload= function(){

              cities= [

                        ["石家庄","廊坊","唐山"],

                        ["郑州","开封","洛阳"],

                        ["济南","青岛","烟台"]

                        ];

       }

       //onchange是值改变事件,只有当控件的值发生变化时才会触发

       function chg(){

              //获取选中的省

              var sel1 =document.getElementById("province");

              //select.value  1.默认返回选中的option内容

              //2.当给option设置value后,它返回的是选中的option,value值随便设置(由程序员看情况决定)

              var index = sel1.value;

              //通过序号查找对应的一组城市

              var pcities = cities[index];

              //删除城市下拉选内旧的城市

              var sel2 =document.getElementById("city");

              /* var options =sel2.getElementsByTagName("option");

              for(vari=options.length-1;i;i--){

                     sel2.removeChild(options[i]);

              } */

              //从内容角度实现删

              sel2.innerHTML="<option>请选择</option>";        //将城市追加到城市下拉选内

              if(pcities){

                     for(vari=0;i<pcities.length;i++){

                            var option =document.createElement("option");

                            option.innerHTML= pcities[i];

                            sel2.appendChild(option);

                     }

              }

       }

</script>

</head>

<body>

       省份:

       <selectonchange="chg()"id="province">

              <optionvalue="-1">请选择</option>

              <optionvalue="0">河北省</option>

              <optionvalue="1">河南省</option>

              <optionvalue="2">山东省</option>

       </select>

       城市:

       <selectid="city">

              <option>请选择</option>

       </select>

</body>

</html>

 

 

 

 

 

//购物车

onclick=”add(this)”;

this就是你正在点的元素。比如button。

 

 

 <!DOCTYPEhtml>

<html>

<head>

<title>购物车</title>

<metacharset="utf-8"/>

 

<styletype="text/css">

h1 {

       text-align: center;

}

 

table {

       margin: 0 auto;

       width: 60%;

       border: 2px solid #aaa;

       border-collapse: collapse;

       text-align: center;

}

 

tableth, tabletd {

       border: 2px solid #aaa;

       padding: 5px;

}

 

th {

       background-color: #eee;

}

 

tr:hover {

       background-color: rgb(231, 231, 231);

}

</style>

<script>

       //加入购物车

       //参数名不能是关键字,调用此函数时传入了this,声明参数来接受它,参数名不能叫this

       function add_shoppingcart(btn) {

              //获取按钮的爷爷

              var tr =btn.parentNode.parentNode;

              //获取tr的所有孩子(td)

              var tds =tr.getElementsByTagName("td");

              //获取第一个td的内容(商品名)

              var name = tds[0].innerHTML;

              //获取第二个td的内容(单价)

              var price = tds[1].innerHTML;

              //测试

              //创建一个新的行

              var ntr =document.createElement("tr");

              //获取库存

              var kc = tds[3].innerHTML;

              tds[3].innerHTML=kc-1;        

              //给这个行设置内容

              ntr.innerHTML='<td>'+name+'</td>'+

                     '<td>'+price+'</td>'+

                     '<tdalign="center"><input type="button"value="-" onclick="decrease(this)"/> '+

                     '<inputtype="text" size="3" readonly value="1" /> '+

                     '<inputtype="button" value="+"onclick="increase(this)"/></td>'+

                     '<td>'+price+'</td>'+

                     '<tdalign="center"><input type="button"value="x" onclick="dele(this)"/></td>';

              //将这个行追加到tbody

              var tbody =document.getElementById("goods");

              tbody.appendChild(ntr);

       }

       function dele(btn){

              var tr =btn.parentNode.parentNode;

              var tbody =document.getElementById("goods");

              tbody.removeChild(tr);

              //增加库存

              var name =tr.getElementsByTagName("td")[0].innerHTML;

              console.log(name);

              var table =document.getElementById("things");

              var trs =table.getElementsByTagName("tr");

              console.log(trs);

              for(var i =1;i<trs.length;i++){

                     if(name==(trs[i].getElementsByTagName("td")[0].innerHTML)){

                            var amount =trs[i].getElementsByTagName("td")[3].innerHTML;

                            amount++;

                            trs[i].getElementsByTagName("td")[3].innerHTML=amount;

                     }    

              }

       }

       //加法

       function increase(btn){

              //获取按钮的父亲(td2)

              var td2 = btn.parentNode;

              //获取td2内的文本框

              var text =td2.getElementsByTagName("input")[1];

              //获取框内的值,+1后写回文本框

              /* text.value = parseInt(text.value)+1;*/

              var amount = text.value;

              //字符串没有++运算,默认是算数运算

              text.value= ++amount;

              var td1 =td2.parentNode.getElementsByTagName("td")[1];

              var price = td1.innerHTML;

              //计算金额

              var total = price*amount;

              var td3 = td2.parentNode.getElementsByTagName("td")[3];

              td3.innerHTML= total;

       }

       //减法

       //数量不能小于1

       function decrease(btn){

              var td2 = btn.parentNode;

              var text =td2.getElementsByTagName("input")[1];

              var amount = text.value;

              if(parseInt(amount)<=1){

                     return;

              }else{

                     text.value= --amount;

                     var td1 =td2.parentNode.getElementsByTagName("td")[1];

                     var price = td1.innerHTML;

                     //计算金额

                     var total = price*amount;

                     var td3 =td2.parentNode.getElementsByTagName("td")[3];

                     td3.innerHTML= total;

              }

       }

</script>

</head>

<body>

       <h1>真划算</h1>

       <tableid="things">

              <tr>

                     <th>商品</th>

                     <th>单价(元)</th>

                     <th>颜色</th>

                     <th>库存</th>

                     <th>好评率</th>

                     <th>操作</th>

              </tr>

              <tr>

                     <td>罗技M185鼠标</td>

                     <td>80</td>

                     <td>黑色</td>

                     <td>893</td>

                     <td>98%</td>

                     <tdalign="center"><inputtype="button"value="加入购物车"

                            onclick="add_shoppingcart(this);"/></td>

              </tr>

              <tr>

                     <td>微软X470键盘</td>

                     <td>150</td>

                     <td>黑色</td>

                     <td>9028</td>

                     <td>96%</td>

                     <tdalign="center"><inputtype="button"value="加入购物车"

                            onclick="add_shoppingcart(this);"/></td>

              </tr>

              <tr>

                     <td>洛克iphone6手机壳</td>

                     <td>60</td>

                     <td>透明</td>

                     <td>672</td>

                     <td>99%</td>

                     <tdalign="center"><inputtype="button"value="加入购物车"

                            onclick="add_shoppingcart(this);"/></td>

              </tr>

              <tr>

                     <td>蓝牙耳机</td>

                     <td>100</td>

                     <td>蓝色</td>

                     <td>8937</td>

                     <td>95%</td>

                     <tdalign="center"><inputtype="button"value="加入购物车"

                            onclick="add_shoppingcart(this);"/></td>

              </tr>

              <tr>

                     <td>金士顿U盘</td>

                     <td>70</td>

                     <td>红色</td>

                     <td>482</td>

                     <td>100%</td>

                     <tdalign="center"><inputtype="button"value="加入购物车"

                            onclick="add_shoppingcart(this);"/></td>

              </tr>

       </table>

 

       <h1>购物车</h1>

       <table>

              <thead>

                     <tr>

                            <th>商品</th>

                            <th>单价(元)</th>

                            <th>数量</th>

                            <th>金额(元)</th>

                            <th>删除</th>

                     </tr>

              </thead>

              <tbodyid="goods">

                     <!-- <tr>

                            <td>罗技M185鼠标</td>

                            <td>80</td>

                            <tdalign="center"><input type="button"value="-" /> <input

                                   type="text"size="3"readonly value="1" /> <inputtype="button"

                                   value="+"/></td>

                            <td>80</td>

                            <tdalign="center"><input type="button"value="x" /></td>

                     </tr>-->

              </tbody>

              <tfoot>

                     <tr>

                            <tdcolspan="3"align="right">总计</td>

                            <tdid="total"></td>

                            <td></td>

                     </tr>

              </tfoot>

       </table>

</body>

</html>

  

查询节点

--通过ID

--通过层次(节点关系)查询

parentNode

childNodes

--通过标签名称查询

--通过name属性查询

         设置name=”sex”

document.getElementByName(“xxx”);

//创建新节点

newNode.type=”text”;

newNode.value=””;

newNode.style.color=””;

 

appendChild();

insertBefore(newBode,node);

 

//删除节点

node.removeChild();

 

一.  自定义封装

相对于实现类的DAO

--直接创建对象

--使用构造器创建对象

--使用json创建对象

1.直接量(JSON)

           -var a = {“name”: “zs”,”age”:”25”}

           -一个{}代表一个对象,内含多个键值对,key一般是字符串,value是任意类型的数据。

采用直接量方式创建出来的对象也叫JSON对象

 

2.构造器(new的函数)

function Hello()

function hi()

名字首字母大写的时候表示构造器,需要new,小写的话就是一个方法。

           2.1 内置构造器

           --特定:Date、RegExp、Array

           --通用:Object

           2.2 自定义构造器

           --自定义一个函数,首字母大写

           --该函数上声明需要调用者传入的参数

           --调用者new这个函数来获得一个对象。

3.结论

--无论用哪种方式创建出来的对象本质是一样的

--若创建对象给别人用,建议用2.2

--若创建对象给自己用,看个人喜好选择1或是2.1

 

<!DOCTYPEhtml>

<html>

<head>

<metacharset="UTF-8">

<title>Insert title here</title>

<script>

       //1.采用直接量的方式创建对象

       function f1(){

              var student = {"name":"zhangsan","age":25,"job":function(){alert("我学PHP")}}

              alert(student.name);

              alert(student.age);

              student.job();

       }

       //2.1采用JS内置构造器创建对象

       //JS里用来new的函数就是构造器

       function f2(){

              var teacher =new Object();

              teacher.name= "cang";

              teacher.age= 18;

              teacher.job= function(){

                     alert("我教PHP");

              };

              alert(teacher.name);

              alert(teacher.age);

              teacher.job();

       }

       //2.2采用自定义构造器创建对象

       //1)定义构造器

       //2)声明参数

       function Coder(name,age,job){

              //this代表当前对象

              //this.name是给此对象加一个属性叫name

              //=name是将参数name赋值给这个属性

              this.name = name;

              this.age = age;

              this.work = job;

       }

       //3)new这个构造器,获得一个对象

       function f3(){

              var coder =new Coder("yannis",18,function(){alert("我写PHP")});

              alert(coder.name);

              alert(coder.age);

              coder.work();

       }

</script>

</head>

<body>

       <inputtype="button"value="按钮1"onclick="f1()"/>

       <inputtype="button"value="按钮2"onclick="f2()"/>

       <inputtype="button"value="按钮3"onclick="f3()"/>

</body>

</html>

 

二.  事件

指页面元素改变,用户在操作鼠标或键盘时触发的动作

--鼠标事件

           onclick

           ondblclick

           onmousedown

           onmouseup

           onmouseover

           onmouseout

--键盘事件

           onkeydown

onkeyup

--状态改变事件

           onload

           onchange

           onfocus

           onblur 失去闪烁光标

           onsubmit

event对象

--事件出发后将会产生一个event对象

1.事件概述

1.1什么是事件

           -就是用户的动作、操作

           -就是js被调用的时机

           用户在做出什么操作时才出发调用JS

1.2事件分几类

           鼠标事件,键盘事件,状态事件:某条件达成时自动触发

 

2.如何定义事件

                   2.1直接定义事件

                            在元素上通过属性直接定义事件

                            优点:直观、方便

                            缺点:HTML和JS耦合度高了

                   2.2后绑定事件

                            在页面加载后,用JS获取某节点,给它绑定事件。

                            优点:HTML和JS耦合度低

                            缺点:不直观

                   2.3   取消事件

                            在事件函数内returnfalse即可。

3.事件对象

           3.1 什么是事件对象

                            事件触发时很多信息可以固定,比如坐标、比如按键等

                            这些信息可能在开发时要用,用的场景不是很多

                            浏览器为了便于程序员获取这些信息方便,

                            将他们统一封装到了一个对象里,叫做事件兑现event

           3.2 如何获得事件对象

                    1)直接定义事件时

                             onclick=”f1(event)”

                             在函数f1(e)中增加参数接收event

                    2)后绑定事件时

                             事件触发并调用函数时,浏览器会自动传入event

                             只需要在函数f2(e)中增加参数接收event

4.事件处理机制

           body-div-p-button

           是从botton由内向外进行触发的。

           4.1   冒泡机制

                    事件时由内向外传播的

                    这个规律就叫做冒泡机制

                    event.stopPropagation();

                    event.cancelBubble= true;

           4.2   冒泡机制的作用

                    可以简化事件的定义

                    如果有很多元素都需要定义事件

                    可以只在他们父亲上定义一次事件即可

                    按照冒泡机制最终事件会传播到它们父亲上

           4.3   使用冒泡机制时需要解决的问题

                    需要知道事件产生在哪个具体子元素上

                    事件产生的具体位置叫做事件源

                    通过事件对象可以获取事件源

                    e.srcElement|| e.target

          

//nodeName返回的是大写的节点名

 

 

         <!DOCTYPEhtml>

<html>

<head>

<title>计算器</title>

<metacharset="utf-8"/>

<styletype="text/css">

.panel {

       border: 4px solid #ddd;

       width: 192px;

       margin: 100px auto;

       /*border-radius: 6px;*/

}

 

.panelp, .panelinput {

       font-family: "微软雅黑";

       font-size: 20px;

       margin: 4px;

       float: left;

       /*border-radius: 4px;*/

}

 

.panelp {

       width: 122px;

       height: 26px;

       border: 1px solid #ddd;

       padding: 6px;

       overflow: hidden;

}

 

.panelinput {

       width: 40px;

       height: 40px;

       border: 1px solid #ddd;

}

</style>

<script>

       window.onload= function() {

              //绑定单机事件

              var div =document.getElementById("jsq");

              div.onclick= function(e) {

                     var obj = e.srcElement ||e.target;

                     //筛选出按钮

                     if ("INPUT" == obj.nodeName) {

                            var p =document.getElementById("screen");

                            if ("C" == obj.value) {

                                   p.innerHTML= "";

                            }elseif ("=" == obj.value) {

                                   try {

                                          var result =eval(p.innerHTML);

                                          p.innerHTML= result;

                                   }catch (ex) {

                                          p.innerHTML= "Error";

                                   }

                            }else {

                                   p.innerHTML+= obj.value;

                            }

                     }

              }

       }

</script>

</head>

<body>

       <divid="jsq"class="panel">

              <div>

                     <pid="screen"></p>

                     <inputtype="button"value="C">

                     <divstyle="clear:both"></div>

              </div>

              <div>

                     <inputtype="button"value="7"><input type="button"

                            value="8"><input type="button"value="9"><input

                            type="button"value="/"><input type="button" value="4">

                     <inputtype="button"value="5"><input type="button"

                            value="6"><input type="button"value="*"><input

                            type="button"value="1"><input type="button" value="2">

                     <inputtype="button"value="3"><input type="button"

                            value="-"><input type="button"value="0"><input

                            type="button"value="."><input type="button" value="=">

                     <inputtype="button"value="+">

 

                     <divstyle="clear:both"></div>

              </div>

       </div>

</body>

</html>

 

 

0 0
原创粉丝点击