第20天
BOM概述
- 全称Browser Object Model,即浏览器对象模型,操作浏览器
- DOM是由W3C制定相关标准,而BOM没有任何标准,因此存在兼容性问题
- BOM由多个对象组成:
- window
- event:包含当前所触发的事件对象
- history:包含用户在浏览器窗口中访问过的URL
- navigator:包含有关浏览器的信息
- location:包含有关当前URL的信息
- screen
- document
window对象
- 在浏览器中,有双重角色:
- 代替了Global,充当全局对象
- 指代当前浏览器窗口
- 网页的打开方式:
- 当前页面打开,可以后退:
<a href="url" target="_self">链接文本</a>//open("url","_self"); - 当前页面打开,禁止后退:
location.replace("新url");使用场景:电商网站中付款后 - 在新窗口打开,可以打开多个:
<a href="url" target="_blank">链接文本</a>//open("url","_blank"); - 在新窗口打开,只能打开一个:
<a href="url" target="自定义name">链接文本</a>//open("url","自定义name");使用场景:电商网站中,购物车跳转到结账页面
- 当前页面打开,可以后退:
- 方法:
- 打开新窗口:
var newW=open("url","target值/name","width=n,height=n,left=n,top=n");若不写第三个配置参数(即config),则新窗口与浏览器融为一体;否则脱离浏览器独立存在,且可用变量保存 - 关闭窗口:
window(原窗口)/newW(新窗口).close(); - 移动窗口:
newW.moveTo(x,y); - 修改窗口的大小:
newW.resizeTo(width,height);
- 打开新窗口:
- 属性:
- 获取屏幕的大小:
screen.width/height - 获取整个浏览器窗口的大小:
outerWidth/Height - 获取浏览器文档显示区域的大小:
innerWidth/Height
- 获取屏幕的大小:
a标签的作用
- 超链接、页面跳转
- 锚点、单一页面内不同位置间跳转:
<a href="#id名">文本</a> - 下载:
<a href="文件名.rar/zip/exe">文本</a> - 打开:
<a href="文件名.txt/图片后缀">文本</a> - 运行js、不需绑定事件:
<a href="javascript:代码;">文本</a>
event对象-获取鼠标位置
- 浏览器会自动将事件对象event传递给事件处理函数的第一个形参,即elem.on事件名=function(e){ }
- 获取鼠标相对于屏幕的坐标:
e.screenX/Y;获取鼠标相对于文档显示区域的坐标:e.clientX/Y;获取鼠标相对于整个页面的坐标:e.pageX/Y
定时器
- 周期性定时器(反复执行)
- 开启:
timer=setInterval(callback,delay); - 停止:
clearInterval(timer);
- 开启:
- 一次性定时器(只执行一次)
- 开启:
timer=setTimeout(callback,delay); - 停止:
clearTimeout(timer);
- 开启:
- 两者的底层是一样的,可以相互转换
扩展
- img.onload=function(){图片加载完成后立即执行js代码}
- 面试题:函数、循环和定时器都可反复执行代码,区别在哪? 区别在时机:函数是程序员调用几次或用户触发几次就执行几次;循环是程序员写好的,几乎一瞬间执行完毕;定时器是需等待一段时间才会执行
第21天
history对象
- 保存着当前窗口的历史记录(访问过的URL)
- 前进:
history.go(1);后退:history.go(-1);刷新:history.go(0);
navigator对象
- 保存着当前浏览器的基本信息(浏览器名称/版本号)
- 通过js判断用户打开的是什么浏览器从而执行不同的操作,相当于css hack(通过条件注释载入代码,只有IE才会执行)
- 属性:
navigator.userAgent(返回的是浏览器相关信息的字符串,可查找关键字来区分浏览器)
location对象
- 保存着当前窗口正打开的url
- 一个url网址由5部分组成:协议://主机号或域名:端口号/路径?查询字符串
- 协议:http/https(安全版)
- 主机ip地址/域名(需花钱购买、更容易记忆)
- 端口号:http默认为80,https默认为443,可省略不写
- 文件的相对路径:百度加密了
- 查询字符串/请求消息:客户端发送到服务器(如get提交form表单)
- 属性:location.protocol/hostname/port/pathname/search(可分别获取上述5部分;无需记忆,直接输出location查看)
- 实现页面跳转:
location="新url";/location.href="新url";/location.assign("新url"); - 禁止后退:
location.replace("新url"); - 刷新:
location.reload();
event事件对象(用户触发或浏览器自动触发)
- 绑定事件的3种方式:
- 在html标签上添加事件属性
<elem on事件名="js代码"></elem>/ 缺点:不符合结构(html)与行为(js)分离原则;一次只能绑定一个元素,无法动态绑定事件;一个事件只能绑定一个事件处理函数 - 在js中使用元素的事件处理函数属性
elem.on事件名=function(){}/ 优点:符合结构(html)与行为(js)分离原则;可以动态绑定事件(循环) / 缺点:一个事件只能绑定一个事件处理函数(多个会导致覆盖;可直接将代码放在一起) - API的兼容写法:
- 在html标签上添加事件属性
if(elem.addEventListener){
elem.addEventListener("事件名",callback); //主流
}else{
elem.attachEvent("on事件名",callback); //老IE
}
- 事件周期的3个阶段:
- 事件捕获:由外向内记录所要执行的事件
- 目标触发:执行实际触发事件的元素(即目标元素)上的处理函数
- 事件冒泡:由内向外触发
- 如何获取事件对象event:
- 主流:会自动作为事件处理函数的第一个形参传入
- 老IE:window.event(主流也支持,window可省略)
- 兼容:
elem.on事件名=e=>{ e=event; }
- 获取到event后可做5个操作:
操作1:获取鼠标的位置/坐标
操作2:阻止冒泡(笔试面试)
if(e.stopPropagation){
e.stopPropagation(); //主流
}else{
e.cancelBubble=true; //老IE
}
操作3:利用冒泡/事件委托
- 如何:若需多个子元素共有一个事件,则把事件绑定在父元素上;由于冒泡,点击子元素,父元素的事件也会触发
- 为什么:绑定的事件越多,创建的事件监听对象也就越多,网站性能就会越低下
- 如何找到目标元素target:(点击哪个就是哪个;淘汰了当前元素this):主流
e.target/ 老IEe.srcElement(主流也支持)
操作4:阻止浏览器的默认行为
- 比如:鼠标右键弹框(window.oncontextmenu)、a默认跳转、submit默认提交、键盘事件(F5刷新页面、F12查看网页源代码等;window.onkeydown)
- 兼容写法:
if(e.preventExtensions){
e.preventExtensions(); //主流
}else{
e.returnValue=false; //老IE
}
操作5:获取当前点击的键盘键码:无需记忆,直接键盘事件下console.log(e.keyCode);
第22天
了解
- 全栈:客户端(PC端+移动端+小程序)+服务器端(php+node.js)+数据库(MySQL+MongoDB)
- 服务器是计算机的一种,模样与电脑主机相似,是打开网站的必要载体;分为物理服务器(微机)和云服务器;对于开发人员来说,硬件服务器是电脑,软件服务器是中间件(将自己的电脑变为一台服务器)
- 软件架构:
- C/S:Client客户端/Server服务器端,如QQ、微信、大型网络游戏 / 优点:用户体验感较好,操作界面丰富;对带宽(即网速)要求低,运行稳定 / 缺点:必须安装,占用硬盘空间;维护成本高,服务器端和客户端都需更新升级
- B/S:Browser浏览器端/Server服务器端,如淘宝网、微博网页版 / 优点:浏览器可直接访问,节省硬盘空间;只需更新服务器端 / 缺点:对带宽要求高
- 网站架构:
- Linus操作系统+Apache网页服务器+MySQL数据库+PHP编程语言(免费)
- AIX操作系统+Weblogic应用服务器+Oracle数据库+JavaEE编程语言(收费)
XAMPP软件包(中间件)
- 是什么:允许用户在自己的电脑上安装包含MySQL、PHP的Apache网页服务器
- 如何使用:Apache服务器控制着htdocs文件夹,路径:C:\xampp\htdocs
- 自己访问:浏览器的地址栏输入127.0.0.1:80(指本地机)或localhost:80(80是默认端口可以省略)
- 他人访问:搜索cmd并打开,输入ipconfig,把IPv4地址复制给他人(192.168.30.85)
- 将项目搭建在服务器上:即将项目的所有文件复制到htdocs中
- 添加网页小图标:任意图片,改为favicon.ico的文件名后缀,放入htdocs
- 修改顶级域名(假象,自己可用):C:\Windows\System32\drivers\etc\hosts文件(VSCode打开),在最后添加上127.0.0.1及www.olivia.com
数据库的类型
- 关系型数据库:以表格为主
- Oracle(Oracle/甲骨文公司),主要应用于企业级开发市场,安全性高,但价格高昂
- MySQL(Oracle/甲骨文公司),主要应用于互联网开发市场,免费、简单、开源
- SqlServer(Microsoft/微软),一门大学课程
- 非关系型数据库:无固定格式;比如:MongoDB,以JSON格式为主
MySQL的使用
图形化界面(简单)
在XAMPP软件包中同时开启Apache和MySQL,在浏览器的地址栏输入localhost或127.0.0.1:80/phpmyadmin即可访问
命令行(复杂)
- 进入数据库:进入C:\xampp\mysql\bin,在上方路径处改输入cmd
- 登录:输入mysql -uroot -p、回车两次
- 退出:exit回车 或 直接×掉 SQL语句:
- 关系型数据库互通;约定俗成大写;未来会在php中运行而非cmd中
- 数据库
- 查看:SHOW DATABASES;
- 创建:CREATE DATABASE IF NOT EXISTS 数据库名称 CHARACTER SET uft8;
- 切换:USE 数据库名称;
- 数据表
- 数据库常用的数据类型:(数值)Int整型、Float/Double浮点型、Decimal精确值;(字符串)Char长度固定、*Varchar长度可变;(日期)Date日期、Datetime日期+时间、Timestamp时间戳(唯一地标识某一刻的时间)
- 创建:CREATE TABLE 表名(字段名/表头 数据类型(长度),......);
- 3.数据
- 【增】:
INSERT INTO 表名 VALUES(字段值,...); - 【删】(永久):
DELETE FROM 表名 WHERE id=几; - 【改】:
UPDATE 表名 SET 字段名=字段值,...... WHERE id=几; - 【查】:
SELECT * FROM 表名;/SELECT 字段名,...... FROM 表名 WHERE id=几;
- 【增】:
第23天
PHP
-
如何运行php文件:
- 打开Apache网页服务器,将项目放入htdocs文件夹中,在浏览器的地址栏输入127.0.0.1,选择想要运行的文件
- 特殊:php文件也支持前端代码(html+css+js)
-
输出方式:(可识别标签)
echo(内容);或echo 内容;只能输出4种标量类型;解决:echo JSON_encode(复合类型);var_dump(内容);可以输出任何数据类型且详细显示出来(不好),php在页面上输出的内容会通过ajax拿去前端
-
变量:
$变量名=值;(使用时不可省略$);常量:const 常量名=值; -
数据类型:
- 四种标量类型:Int整型、Float/Double浮点型、Boolean布尔、String字符串
- 两种复合类型:Array数组、Object对象
- 两种特殊类型:Resource资源、Null空、不存在(区别于"",存在但值为空)
注意:String单引号只能放入纯文本;双引号支持放入变量,但必须{变量名},类似js的模板字符串; 举例:`echo "{name}今年{age}岁,喜欢{hobby}";
创建数组: 直接量arr=array(key=>value,...);得到hash数组; 访问:i=0;i<count(i++){echo i];}`
- 与js不同,php中字符串拼接运算符是".",不能使用+,意味着php的API不能使用. 分支、循环、函数与js完全相同;API:面向百度开发
全栈开发
前端向后端发送请求-表单提交
- input必须添加name属性,radio、checkbox、select&option等表单控件还需添加value属性 (由用户输入而非选择的表单控件可不写value,直接提交innerHTML)
- form表单必须加上action="服务器端文件的路径"
- form表单的mthod是用get还是post,需与后端沟通或看开发文档
- get是从服务器上获取数据,不能大于2kb,如搜索框
- post是向服务器传送数据,安全性较高,如登录/注册
后端接收前端的请求消息
语法:$变量名=$_GET/POST/REQUEST["input的name值"];
后端<=>数据库:php自带操作MySQL的API
- 创建到数据库的连接对象:
$conn=mysqli_connect("hostname","username","userpwd","dbname"); - 为此数据库设置中文编码:
mysqli_query($conn,"SET NAMES utf8"); - 创建sql语句:
$sql="INSERT/DELETE/UPDATE/SELECT......";(增删改查) - 数据库需要执行sql语句:
$result=mysqli_query($conn,$sql);- 若是增删改,会返回bool值,true则执行成功,false则执行失败
- 若是查,会返回不认识的结果集对象;解决如下:
while(($row=mysqli_fetch_row|assoc|array($result))!=null){
对$row的操作;
}
- 断开和数据库的连接:
mysqli_close($conn);