JavaScript入门第五周复习及MySQL、PHP、全栈开发初学复习

174 阅读9分钟

BOM

Browser Object Model - 浏览器对象模型

专门为操作浏览器准备的一些对象,没有任何标准,不像DOM由W3C制定标准,所以存在很大的兼容性问题,使用率相对DOM较少

BOM的对象:*window、history、navigator、location、screen、*event

window对象

在浏览器中扮演着两个角色:
1、代替了Global,充当全局对象 - 保存着全局变量和全局函数
2、指代当前窗口本身
    

打开网页的新方式

当前页面打开,可以后退

        HTML:<a href="url">内容</a>
	JSopen("url","_self");

当前页面打开,禁止后退

例:电商网站:结账过后不允许后退了

        HTML:做不了
	JS:
            history:当前窗口的历史记录,只有当前窗口有了历史记录才能前进后退
            location:当前窗口的正在打开的url网址,提供一个方法:
                location.replace("新url"); - 叫做替换,当时网址被替换了,页面也会跳转,但是不会产生历史记录

在新窗口打开,可以打开多个

        HTML:<a href="url" target="_blank">内容</a>
	JS:open("url","_blank");

在新窗口打开,只能打开一个

例:电商网站:购物车跳转到结账页面,结账页面只允许打开一个

        HTML:<a href="url" target="自定义name">内容</a>
	JS:open("url","自定义name");
            

其实在每一个窗口的底层都有一个名字name,_self指向的自己当前的名字, _blank始终会得到一个新名字。如果自定义名称,那么浏览器会发现这个窗口已经打开过了,那再次打开时,会把原来的窗口给替换掉

扩展:a标签的作用

		1、跳转
		2、锚点
		3、下载:<a href="xx.rar/zip/exe">文字</a>
		4、打开:<a href="xx.txt/图片后缀">文字</a>
		5、运行js - a标签不需要绑定事件:<a href="javascript:js代码;">文字</a>
                    

属性和方法

        打开新窗口:var 新窗口=open("url","target/自定义","width=,height=,left=,top=");
		特殊:1、没有加第三个参数的时候,新窗口会和浏览器融为一体
		      2、添加上第三个参数的时候,新窗口就会脱离浏览器独立存在,而且可以把它保存起来
	关闭窗口:window/新窗口.close();
	移动窗口:新窗口.moveTo(x,y);
	修改窗口的大小:新窗口.resizeTo(newW,newH);

	获取屏幕的大小:screen.width/height
	获取浏览器的完整大小:outerWidth/Height
	获取浏览器文档显示区域的大小:innerWidth/Height
            

定时器

等待一段时间才会执行的代码,可能会反复执行,也可能只会执行一次

        两种:
	1、周期性定时器
		开启:timer=setInterval(回调函数,延时);
		停止:clearInterval(timer);

	2、一次性定时器
		开启:timer=setTimeout(回调函数,延时);
		停止:clearTimeout(timer);
        特殊:1、不管是一次性还是周期性,底层其实都是一样的,两者可以互换
              2、一次性 < = > 周期性

函数和循环和定时器,都可以反复执行代码,区别在哪里?

        时机!
	1、函数:要么调用几次执行几次,要么用户触发几次执行几次
	2、循环:几乎是一瞬间就完毕了
	3、定时器:需要先等待一段时间才会执行
            

history

保存着当前窗口的历史记录 - 浏览器自带此功能

            前进:history.go(1);正整数数字
            后退:history.go(-1);负整数数字
            刷新:history.go(0);

navigator

保存着当前浏览器的基本信息(浏览器名称以及版本号)

        通过js判断用户打开的是什么浏览器 - 相当于js版本的css hack(专门为老IE准备),对不同的浏览器可以执行不同的操作
        属性:navigator.userAgent;
        
        不重要 - 现在大部分操作都提供了兼容的方式,不需要自己判断浏览器是什么

location

保存着当前窗口的正在打开url

        跳转页面location="新url"
                location.href="新url"
		location.assign("新url")
		跳转页面,禁止后退:location.replace("新url") - 不会产生历史记录
		刷新:location.reload();

event事件对象

什么是事件:用户触发的 或 浏览器自动触发的

绑定事件:3种

在HTML标签上添加事件属性

        <elem on事件名="js代码"></elem>
	
	缺点:1、不符合html与css与js的分离
              2、一次只能绑定一个元素,不能动态绑定事件
              3、一个事件只能放入一个事件处理函数

在js中使用事件处理函数属性绑定事件

        elem.on事件名=function(){}

	 优点:1、符合html与css与js的分离
               2、动态绑定事件
	 ~~缺点~~:一个事件只能放入一个事件处理函数,但可以把代码放到一起,所以也不算缺点

绑定事件的API

        主流:elem.addEventListener("事件名",callback);
	老IE:elem.attachEvent("on事件名",callback);
	兼容:if(elem.addEventListener){
		   elem.addEventListener("事件名",callback);
	     }else{
                   elem.attachEvent("on事件名",callback);
             }

	 优点:1、符合html与css与js的分离
               2、动态绑定事件
               3、一个事件只能放入多个事件处理函数
	 缺点:不兼容老IE,且麻烦
             

事件周期

3个阶段

        1、捕获阶段:记录要执行的事件有哪些,由外向内
	2、目标触发阶段:目标元素:实际触发事件的元素
	3、冒泡执行阶段:由内向外的冒泡执行

获取事件对象event

        主流:事件处理函数的第一个形参会自动获得
	老IE:window.event;    主流也支持!
	兼容:e=event;

获取到了事件对象event才可以做后续5个操作:

获取鼠标的坐标

        获取鼠标相对于屏幕的坐标:e.screenX/Y
	获取鼠标相当于文档显示区域的坐标:e.clientX/Y
	获取鼠标相当于网页的坐标:e.pageX/Y

阻止冒泡:

一般不要用,用了就不能利用冒泡了

        主流:e.stopPropagation();
	老IE:e.cancelBubble=true;
	兼容:if(e.stopPropagation){
		   e.stopPropagation();
              }else{
		   e.cancelBubble=true;
              }

利用冒泡:【事件委托】

多个子元素都共有一个事件,把事件绑定在父元素身上,通过利用冒泡,点击子元素,父元素的事件也会触发

绑定的事件越多,创建的事件监听对象也就越多,网站性能就会越低下

	何时:任何一个功能都要做成事件委托
		当前元素:this (在不同的场景,指向的人是不一样的)
	找到目标元素:永远是事件触发的元素
		主流:e.target;
		老IE:e.srcElement;  主流也支持!
		兼容:var target=e.srcElement;

阻止浏览器的默认行为

例:阻止右键弹框(window.oncontextmenu),阻止键盘事件window.onkeydown(F12 、F5...)...

        主流:e.preventExtensions();
	老IE:e.returnValue=false;
	兼容:if(e.preventExtensions){
                    e.preventExtensions();
              }else{
                    e.returnValue=false;
              }

获取键盘键码

        e.keyCode
        直接输出可查
        

MySQL

图形化界面

        要求:同时打开mysql和apache
	访问:127.0.0.1:端口号/phpmyadmin
	      localhost:端口号/phpmyadmin

命令行方式

进入数据库

        1、打开cmd
	2、输入cmd的命令,进入到d:/xampp/mysql/bind
		1、输入:盘符:  回车
		2、输入:cd xampp/mysql/bin
	3、登录:mysql -uroot -p 回车
	4、退出:exit

操作:增删改查

SQL语句:关系型数据库SQL语句互通

数据库

        查看数据库:SHOW DATABASES;
	创建数据库:CREATE DATABASE IF NOT EXISTS 数据库名称 CHARACTER SET utf8;
	切换数据库:USE 数据库名称;

数据表

数据库的数据类型
        数值:Int - 整型
              Float/Double - 浮点型
              Decimal - 精确值

	字符串:
              Char - 长度固定的
              Varchar - 长度可变的

	日期:
              Date - YYYY/MM/DD
              Datetime - YYYY/MM/DD hh:mm:ss
              Timestamp - 时间戳(标识:唯一不重复 - id也可以)
创建数据表
        CREATE TABLE 表名(
		字段名 数据类型,
		...
	);
            
        举例:CREATE TABLE user(
		id int PRIMARY KEY AUTO_INCREMENT,
		name varchar(30),
		pwd varchar(6),
		email varchar(30),
		vip varchar(1)
             );

	PRIMARY KEY:主键约束:绝对不会重复
	AUTO_INCREMENT:主键自增:每次都会+1
数据/记录
        增:INSERT INTO 表名 VALUES(字段值,...);
	例:INSERT INTO USER VALUES(0,"XX","123456","xx@qq.com","0");

	删:DELETE FROM 表名 WHERE id=几; - 一旦删除数据就不会再回来了

	改:UPDATE 表名 SET 字段名=字段值,... WHERE id=几;

	查:3种语法:
		SELECT * FROM 表名;
		SELECT 字段名,字段名,... FROM 表名;
		SELECT * FROM 表名 WHERE id=几;
                    

PHP

如何运行php

        打开apache,将项目/文件夹放到htdocs里面,再用浏览器输入127.0.0.1,打开需要运行的文件

        特殊:其实php文件也支持前端代码(HTML+CSS+JS)和php代码

PHP的语法基础

输出方式

        1echo(内容) 或者 echo 内容;
		echo只能输出4种标准类型,不能输出别的类型
	2var_dump(内容)
		var_dump可以输出一切数据类型,显示很详细,正是因为显示的太过详细,其实不太好
                        php输出在页面上的东西,都会被前端用ajax拿走拿到前端去

变量和常量

        1、变量:值可以变化的数据
	   语法:$变量名=值;
	   注意:使用时$不能省略

	2、常量:值一旦创建了,不允许修改
	   语法:const 常量名=值;

数据类型

        四种标准/基本/原始类型:
		整型:Int
		浮点型:Float/Double
		布尔:Boolean
		字符串:String - 有区别
			单引号 - 只能放入纯文本
			双引号 - 支持放入变量 - 类似js模板字符串
				例:echo "{$name}今年{$age}岁,喜欢{$hobby}";
	两种复合类型:
		Array - 数组:保存多个相关数据
			创建:
			  1、直接量:$arr=[值1,...] - 索引数组
			  2、内置对象:$arr=array( - hash数组:其实就是对象
						key=>value,
						...
				       )
			访问:$数组名[下标]
			遍历:循环
		Object - 面向对象,不需要
	两种特殊类型:
		Resource - 资源类型
		Null - 空,释放内存

运算符

几乎和js一致,除了字符串拼接.,意味着php的API调用方法绝对不可能用 .

分支

和js完全一样!if分支 switch分支 三目 都支持

循环

和js完全一样!

函数

和js完全一样!

API

和js理论上完全一样,但是操作却不同。

全栈开发

前端->后端

前端需要发起请求

1、表单请求/提交

	注意:
		1、input必须添加name属性,甚至有的input(radio、checkbox、select&option)可能还要添加value
		2、form表单必须添加action="服务器端文件的路径";
		3method到底是用get还是post,和后端进行沟通/看开发文档
			get->得到,只要跟安全性不挂钩的时候,大小有限制2kb,例:搜索框(把东西拿出来)
			post->发送,只要跟安全性挂钩的时候,优先使用,例:登录/注册(把东西放进去)
			

2、后端 需要接收住 前端传来的 请求消息

			语法:$变量=$_GET/POST/REQUEST["input的name的值"]

			REQUEST - 请求:不管前端是GET还是POST,都能接住

后端<->数据库

php自带操作mysql的API

        1、创建和数据库的连接对象
		$conn=mysqli_connect("hostname","username","userpwd","database name");
	
	1.5、为此数据库设置中文编码
		mysqli_query($conn,"SET NAMES utf8");

	2、创建SQL语句:要干什么
		$sql="INSERT/UPDATE/DELETE/SELECT";

	3、数据库要执行SQL语句
		$result=mysqli_query($conn,$sql);
		//增删改:true->执行成功  false->执行失败
		//查:返回的是一个结果集对象
			解决:php提供了一套方法
				while(($row=mysqli_fetch_row|assoc|array($result))!=null){
					拿到了数据要操作
				}

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