JS小结5

182 阅读10分钟

BOM:Browser Object Model

window对象

    1.网页打开链接的方式
        1、替换当前页面,可以后退:
	HTML:<a href="url">文字</a>
              JSopen("url","_self");
        2、替换当前页面,禁止后退:使用场景:电商网页:结账完毕后,不允许用户后退
            history对象:保存了当前窗口的历史记录,功能:前进后退
	location:保存了当前窗口正在打开的url
	location.replace("新url");//替换当前网址、不会产生历史记录
        3、在新窗口打开,可以打开多个:
	HTML:<a href="url" target="_blank">文字</a>
              JSopen("url","_blank");

        4、在新窗口打开,只能打开一个:使用场景:电商网页:跳转到 支付结账页面,只允许用户打开一个
	HTML:<a href="url" target="自定义">文字</a>
              JSopen("url","自定义");
              

扩展:a标签可以做的事? 1、跳转 2、锚点 3、下载:文字 4、打开图片、txt:文字 5、直接书写js:文字

    2、window对象:属性和方法:
        属性:
	获取浏览器窗口的大小:
	    文档显示区域的大小:body部分
		innerWidth/innerHeight

                完整的浏览器大小:
		outerWidth/outerHeight

                屏幕的大小:没用 - 桌面应用才用的
		screen.width/height

方法:

1、打开新窗口:var newW=open("url","自定义name","width=,height=,left=,top=");
特殊:如果没传入第三个参数,新窗口会和浏览器并为一体
         如果传入第三个参数,新窗口会脱离浏览器
         建议宽高不小于200
         有可能会被浏览器拦截
2、关闭窗口:窗口.close();
3、修改窗口的大小:新窗口.resizeTo(newW,newH);
4、修改窗口的位置:新窗口.moveTo(x,y);

扩展:获取鼠标的坐标:

1、事件中传入一个形参e->获得到事件对象event(其中一个作用获取鼠标的坐标)
2、获取:
        e.screenX/Y;//相对于屏幕
        e.clientX/Y;//相对于浏览器客户端
   *e.pageX/Y;//相对于网页的

鼠标跟随效果:关键点:
        1、绑定事件:window.onmousemove
        2、图片位置一定和鼠标位置一起
        3、图片的加载速度比js的执行速度要慢,
            img.onload=function(){
                   //最后才会执行
             }

定时器

周期性定时器

先等待,在执行一次,在等待,在执行一次...
开启:timer=setInterval(callback,间隔毫秒数);
停止:clearInterval(timer);

一次性定时器

先等待,在执行一次,结束
开启:timer=setTimeout(callback,间隔毫秒数);
停止:clearTimeout(timer);

BOM常用对象

1、history:保存当前窗口的历史记录(历史url)

作用:
  前进:history.go(1);
  后退:history.go(-1);
 *刷新:history.go(0);

2.location:保存当前窗口的正在打开的url

*1、常识:一个url由5部分组成
       协议:http/https(请求响应模式)/ftp(传输文件)/ws(广播收听模式:直播) - 网页的功能不同
        主机号/域名:www.baidu.com/127.0.0.1 - 主机号不方便记忆所以多半都会购买域名,而且127.0.0.1只能访问自己
        端口号::8020 - 默认端口:http - 80 https - 443,默认端口可以省略不写
        文件的相对路径:new/01-3.html  /s -百度加密了
        查询字符串:?wd=178&rsv_spt=1... - 表单提交到服务器的东西 - 请求消息

        一个网址一定由5部分:
	协议://域名:端口号/文件路径?查询字符串
2.属性:
不需要记忆,直接用console.log(location)可以查看到有哪些属性
作用:获取:协议、域名、端口号、文件路径、查询字符串         
3.API:跳转
location="新url"
    location.href="新url"
location.assign("新url");
        替换后禁止后退:location.replace("新url")
        刷新:location.reload();         

3、navigator:保存了当前浏览器的信息(浏览器的名称/版本号)

属性:navigator.userAgent;         
     

4、******event:事件对象

事件:多半用户触发 或 浏览器自动触发的操作

1、*绑定事件:3种

        1、在HTML元素上绑定
	<elem on事件名="js语句"></elem>
            缺点:
                1、没有实现JSHTML的分离 -HTML(内容)/CSS(样式)/JS(行为)分离
                2、无法动态绑定事件 - 一次只能绑定一个元素
                3、无法同时绑定多个函数对象

        2、*使用JS的事件属性绑定:
                elem.on事件名=function(){
		js语句
                }
		
	优:1、实现JSHTML的分离
                2、动态绑定事件
                缺:1、无法同时绑定多个函数对象 - 算不上是缺点,为什么不写一起         3、使用JSAPI绑定事件:
                主流:elem.addEventListener("事件名",callback)
                老IEelem.attachEvent("on事件名",callback);
                兼容:if(elem.addEventListener){
			elem.addEventListener("事件名",callback)
		  }else{
			 elem.attachEvent("on事件名",callback);
		  }

		优:1、实现JSHTML的分离
		    2、动态绑定事件
		    3、同时绑定多个函数对象
		缺:需要处理兼容性问题

2、事件周期:

主流:3个
1、捕获阶段:由外向内,记录着要执行的事件
2、目标触发:当前点击的元素优先出发
3、冒泡触发:由内向外的冒泡触发事件
老IE:2个
没有捕获阶段         
     

3、*****获取到事件对象event:

主流:事件函数中传入一个形参e,就可以自动接住事件对象event
老IE:window.event;
兼容:event;不光老IE可用,主流浏览器也可以使用 - 小三上位

获取到了事件对象event就可以做很多很多的操作了:
        1、*获取鼠标的位置
        2、*阻止冒泡:重要在于面试中/鄙视中,但是开发中绝对不会阻止冒泡,更需要利用冒泡
        主流:e.stopPropagation();
        老IE:e.cancelBubble=true;
        兼容:if(e.stopPropagation){
		e.stopPropagation()
	  }else{
                    e.cancelBubble=true;
	 }

        3、***事件委托(利用冒泡):
	为什么:优化,每绑定一个事件,相当于就创建了一个事件监听对象,创建的对象越多,网页的性能越底下
	建议:建议把事件都绑定在自己的父元素身上一次即可
	获取目标元素:触发的元素 - 永远不变就是你触发到的元素
            当前元素:this -> 指向多的一批
		  主流:e.target;
		  老IE:e.srcElement;
		  兼容:e.srcElement;不光老IE可用,主流浏览器也可以使用 - 小三上位
		  以后事件之中再也不要使用this了

		做一个:计算器、选项卡、轮播...

	  4、*阻止浏览器的默认行为:
		哪些:比如:F5带来的刷新,F12带来的控制台,右键带来的菜单框,F11全屏,a自带跳转,submit自带提交...
		主流:e.preventDefault();
		老IE:e.returnValue=false;
		兼容:if(e.preventDefault){
			e.preventDefault()
		      }else{
			e.returnValue=false;
		      }
		
		新事件:
		  1、鼠标右击:window.oncontextmenu
		  2、键盘事件:window.onkeydown

	  5、*获取键盘的键码
		e.keyCode;//不需要记忆,直接输出查看 或 百度 keyCode表      
     

扩展:客户端存储技术

以前使用cookie(缺点:大小有限2kb,30天必死),HTML5提出了一个新概念webStorage:2种(优:大小有限8mb,生命周期无限,缺点:老IE不支持)
1localStorage:本地级 - 浏览器关闭甚至电脑关闭,第二天打开依然存在
2、sessionStorage:会话级 - 浏览器一旦关闭自动死亡
作用:
  1、数据可以跨页面传输
  2、皮肤、主题
  3、浏览器的历史记录

语法:非常简单,类似于对象:

	添加:xxxxStorage.属性名="值";
	获取:xxxxStorage.属性名;
	删除:xxxxStorage.removeItem("属性名");//只会删除这一个
	清空:xxxxStorage.clear();//删除所有     

MySQL基本内容

学习SQL语句:关系型数据公用的SQL语句
1、数据库:
        创建数据库:CREATE DATABASE IF NOT EXISTS 数据库名称 CHARACTER SET utf8;
        查看数据库:SHOW DATABASES;
        切换数据库:USE 数据库名称;
    2、数据表:
        数据库的数据类型:
        数值:Int-整型
	Float/Double-浮点型
	DECIMAL-精确值
        字符串:
	CHAR - 长度固定的
	 VARCHAR - 长度可变的
        日期:
	 DATE - YYYY/MM/DD
	 DATETIME - YYYY/MM/DD hh:mm:ss
             TIMESTAMP - 时间戳(标识:唯一不重复的)
        创建数据库表:
	CREATE TABLE 表名(
                字段名 数据类型,
		...
            );

举例:
CREATE TABLE user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(30),
	pwd VARCHAR(30),
	email VARCHAR(30),
	vip VARCHAR(1)
);

主键约束:PRIMARY KEY
主键自增:AUTO_INCREMENT

3、*****数据:4句以后最常用的操作

增:INSERT INTO 表名 VALUES(字段值,...);
        举例:INSERT INTO user VALUES(0,"鲁俊杰","123123","ljj@qq.com","1");
    删:DELETE FROM 表名 WHERE id=几;
        举例:DELETE FROM user WHERE id=3;
    改:UPDATE 表名 SET 字段名=字段值,... WHERE id=几;
        举例:UPDATE user SET name="雍燕",email="yongyan@qq.com" WHERE id=4;	
    查:3种语法:
SELECT * FROM 表名;//获取此表所有的数据
SELECT * FROM 表名 WHERE id=几;//获取id为几的那一条数据
 SELECT 字段名,... FROM 表名;//获取此表所有的对应的字段值

****PHP

1、如何运行php文件:

***打开apache,并且将你的项目放到htdocs文件夹中,打开浏览器输入:127.0.0.1:端口号,打开你需要的文件
  
特殊:其实PHP文件也支持前端代码和PHP代码,以后我们上网时,看到网页后缀.php也不必惊讶 - 比js严格

2、PHP语法基础:

1、输出方式:
        1echo(想要输出的内容); 或 echo 想要输出的内容; - 只能输出4种标准类型,不能输出别的
        2var_dump(想要输出的内容);//输出数据类型和值
	缺点:1、输出的太过完整,以后PHP只要输出在页面上的东西,都会被前端使用ajax拿走
2、复合类型暂时也只能用var_dump输出 - 以后不会再用了

2、变量和常量:

*1、变量:值可以改变
	语法:$变量名=值;
	注意:使用时$也不能省略
    2、常量:值一旦创建,不可以改变
	语法:const 常量名=值;

3、*数据类型:

四种标准/基础类型:
整型:Int
浮点型:Float/Double
布尔:Boolean
字符串:String - 不太一样
	单引号:直接放纯文本
            双引号:支持放入变量
echo "我的名字叫{$name}今年{$age}岁喜欢{$hobby}";

两种复合类型:
1、Array - 数组
        创建:
            1、直接量:$arr=[值1,....]; - 索引数组
	2、内置函数:$arr=array( - hash数组。其实就是对象
			"key"=>value,
			...
                       )

	访问:$数组名[下标/"自定义"]
            遍历:循环
    2、Object - 面向对象
        两种特殊类型:
	1、Resource - 资源类型:连接上数据库才会看到
	2、Null - 释放内存
		"" - 有值,值为空
		null - 没有

全栈

1、前端->后端:

前端需要发起请求:
1、表单请求 提交
        注意:
	1、input必须添加name属性,甚至有的input/textarea/select*option还要添加value属性
	2、form表单必须添加action="服务器端文件的路径";
	3、method到底用get还是post,和后端沟通(安全性为主)
		只负责发送,不负责保存
2、服务器端 需要接收住 前端传来的 请求消息
	语法:$_GET/POST/REQUEST["input的name的值"];
	REQUEST->请求:能接住一切请求不管是get还是post

2、后端<->数据库:PHP自带操作MySQL数据的API,只需要学习4句话

1、创建出连接数据库对象
            $conn=mysqli_connect("hostname","username","userpwd","dbname");

1.5、立马为数据库传输设置中文编码
	mysqli_query($conn,"SET NAMES utf8");
2、创建SQL语句:
	$sql="INSERT/DELETE/UPDATE/SELECT";
3、某个数据库要执行某个操作
        $rs=mysqli_query($conn,$sql);
        //$rs:增删改,是一个布尔值,true->成功,false->失败
	   查:是一个我们都不认识的结果集:解决将不认识结果集变为我们认识的数据
                mysqli_fetch_row($rs)//一次只能得到一行的数据,是一个索引数组
                *mysqli_fetch_assoc($rs)//一次只能得到一行的数据,是一个hash数组  
解决固定套路:
        while(($row=mysqli_fetch_assoc($rs))!=null){
	$row;//当前行数据,做什么操作就看你了
        }

4、断开和数据库的连接
	mysqli_close($conn);

扩展: - 隐藏作用域,不是给用户看/输入,提交时用户后端判断执行不同代码的

ajax

asynchronous javascript and xml:直译:异步的javascript和xml
好处:1、不会让用户等待
      2、不会刷新页面也能和服务器端进行交互(比表单强)
      3、将服务器端的数据获取到前端页面

 使用步骤:41、创建ajax核心对象xhr
   var xhr=new XMLHttpRequest();

2、创建和服务器端的连接
   xhr.open("GET/POST","xx.php");

3、向服务器端发送请求消息
   xhr.send()
	特殊:
	  1GET方式,xhr.send失效,还不能省略,必须写为xhr.send(null),请求消息需要拼接到url?后面
		xhr.open("GET","xx.php?key=value&key=value...");
		xhr.send(null);

	  2POST方式,xhr.send可用,在之前设置请求头部
		xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		xhr.send("key=value&...");

4、绑定监听状态改变事件
   xhr.onreadystatechange=()=>{
	if(xhr.readyState==4&&xhr.status==200){
		xhr.responseText;//php放在页面上的东西 - 服务器端响应的消息
	}
   }   

ajax就是固定的方法:难就难在你拿到数据后要干什么