JavaScript_入门
CSS弊端:
-
语法不够强大,比如无法嵌套书写,导致模块化开发中需要书写很多重复的选择器;
-
没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,导致难以维护;
CSS预处理器:
用一种专门的编程语言,进行Web页面样式设计,再通过编译器转化为正常的CSS文件,以供项目使用。常用预编译器:
-
SASS : 基于 Ruby,通过服务端处理,功能强大。解析效率高。需要学习Ruby语言,上手难度高于LESS。
-
LESS : 基于Node.JS,通过客户端处理,使用简单。功能比SASS简单,解析效率也低于SASS,但在实际开发中足够了,所以我们后台人员如果需要的话,建议使用LESS。
JavaScript框架:
-
jQuery : 大家熟知的JavaScript框架,优点是简化了DOM操作,缺点是DOM操作太频繁,影响前端性能,在前端眼里使用它仅仅是为了兼容IE6、7、8
-
Angular : Google收购的前端框架,由一群Java程序员开发,其特点是将后台的MVC模式搬到了前端并增加了模块化开发的理念,与微软合作,采用TypeScript语法开发;对后台程序员友好,对前端程序员不太友好;最大的缺点是版本迭代不合理
-
React : Facebook出品,一款高性能的JS前端框架;特点是提出了新概念【虚拟DOM】用于减少真实DOM操作,在内存中模拟DOM操作,有效的提升了前端渲染效率;缺点是使用复杂,因为需要额外学习一门【JSX】语言;
-
vue : 一款渐进式JavaScript框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开发、路由、状态管理等新特性。其特点是综合了Angular(模块化)和React(虚拟DOM)的优点;
-
Axios : 前端通信框架;因为 vue的边界很明确,就是为了处理DOM,所以并不具备通信能力,此时就需要额外使用一个通信框架与服务器交互;当然也可以直接选择使用jQuery 提供的AJAX通信功能;
UI框架:
-
Ant-Design:阿里巴巴出品,基于React 的UI框架
-
ElementUl、iview.ice:饿了么出基于Vue的UI框架
-
Bootstrap: Twitter 推出的一个用于前端开发的开源工具包
-
AmazeUl:又叫“妹子U”,一款HTML5跨屏前端框架
后端技术NodeJS:
框架及项目管理工具:
-
Express : NodeJS框架
-
Koa : Express 简化版
-
NPM : 项目综合管理工具,类似于Maven
-
YARN : NPM的替代方案,类似于Maven和Gradle的关系
前端主流框架:
vue.js
-
iView : 属于前端主流框架,选型时可考虑使用,主要特点是移动端支持较多
-
ElementUl : 属于前端主流框架,选型时可考虑使用,主要特点是桌面端支持较多(饿了吗)
-
ICE(飞冰) : 阿里
-
VantUI
-
CubeUI : 滴滴
2. 数据类型
alert 弹窗
console.log 打印输出(控制台)
2.1 数据类型
-
Number:
-
js不区分小数整数 (NaN不是一个数字 Infinity无限大)
-
-
字符串 不可变
-
使用单引号或双引号包裹
-
转义字符 \ ' \n \t \u#### Unicode字符 \x## Ascll字符
-
多行字符串 var msg= `
String 回车 String 回车 String` -
模板字符串 var msg= `
字符串拼接${name}` -
方法
-
stu.length
-
stu.toUpperCase() 转大写
-
stu.toLowerCase() 转小写
-
stu.indexOf('t') 获取t的位置
-
stu.substring(1) 从第一个字符串截取到最后一个字符串
-
stu.substring(1,3) 截取[1,3) 包含前不包含后
-
-
-
-
布尔值
-
逻辑运算
-
= / = =:等于,类型不一样值一样也为true / = = =:绝对等于,类型和值都一样为true
-
坚持不用 = = 进行比较
-
注意:NaN===NaN,与所有素值都不相等,包括自己
-
只能通过isNaN(NaN)判断这个数是否是NaN
-
-
console.log((1/3)===(1-2/3)) false 尽量避免浮点数进行运算,存在精度问题
-
-
null空 undefined未定义
-
数组
-
可包含任意数据类型 , 可变 , 可以给length赋值
-
方法
-
indexOf() 获取下标
-
slice() 截取数组一部分,返回一个新数组 , 类似substring
-
push() 压入尾部 , pop() 弹出尾部元素
-
unshift() 压入头部 , shift() 弹出头部
-
sort() 排序
-
reverse() 元素反转
-
concat() 拼接,未修改数组,返回新数组
-
join('-') 打印拼接数组使用定义的符号
-
多维数组
-
-
-
对象 : 若干键值对 (对象是大括号,数组是中括号)
-
所有键都是字符串 , 值都是任意形式
-
键值对形式 xxxx:xxxx 多属性间逗号隔开
-
使用不存在的对象不会报错,undefined
-
允许动态删减属性
-
delete person.name 动态删除
-
person.add = "add" 动态添加 , 直接给新的属性添加值
-
-
判断属性值是否在这个对象中 'age' in person
-
'toString' in person (true) 原因:继承
-
判断属性是否是这个对象自身拥有的 hasOwnProperty('age')
-
严格检查模式: 'use strict';
局部变量 ES6 建议使用 let 定义,可以使用 var 定义,严格检查模式下: i=1;错误,必须加上var或let
2.2 流程控制
与Java有区别的流程控制:
-
forEach循环 , 使用函数遍历
-
for-in循环 , 等同于java的增强for循环,遍历下标
2.3 Map,Set
ES6新特性
Map
-
var map = new Map([['tom',100],['jack',90],['键',值])
-
var name = map.get('tom') 通过key获得value
-
map.set('tom',123456) 新增或修改
-
map.delete('tom') 删除键值对
Set
-
var set = new Set([1,1,3,4,5,6]);
-
Set:无序不重复的集合,可以去重
-
set.add() set.delete() set.has()是否包含
2.4 iterator
ES6
打印数组的值,Map,Set也可以使用
*var arr = [3,4,5]
for (let x of arr) {
console.log(x)}**
3. 函数及面向对象
3.1 函数定义
方式一
绝对值函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
如果没有执行return,函数执行完也会返回结果NaN
方式二
var abs = function(x){
}
参数问题: JS可以传递任意参数,也可以不传参数
//如果不存在参数
function abs(x){
if(typeof x !== 'number'){
throw 'Not a number';//手动抛出异常
}
//.....
}
arguments :代表传递进来的所有参数,是一个数组
function abs(x){
for (var i = 0; i<arguments.length;i++){
console. log(arguments[i]);//可以打印传进来的所有参数,包括x
}
}
rest:获取除了以定义的参数以外的所有参数(arguments去掉以定义的参数(x))ES6
function abs(a,b,
3.2 变量作用域
函数体中声明的变量,函数体外不可用
两个函数使用相同的变量名,只要在函数内部,就不冲突
内部函数可以访问外部函数的成员,反之不行
如果内部函数和外部函数有变量重名
-
函数查找变量从自身函数开始,由内向外查找,如外部存在同名变量,则内部会屏蔽外部函数变量
提升作用域:
function q(){ var x="x"+y; console.log(x); var y = 'y'; } //等同于 function q(){ var y; var x="x"+y; console.log(x); y = 'y'; } //习惯规范:所有变量定义在函数的头部 var x,y,z....;
全局函数:
全局对象window : 默认所有的全局变量,都会自动绑定在window对象下
-
如alert()函数也是绑定在window下,如window.alert()
JS实际只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到就会向外查找,如果在全局作用域(window)也没有找到,则会报错
规范:
由于所有的全局变量都会绑在window上.如果不同JS文件使用了相同的全局变量,会有冲突
解决:
//唯一全局变量 var App = {}; //定义全局变量 App.name = 'name'; App.add = function (a,b) { return a + b; } //将自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题
局部作用域let:
function aaa(){ for (var i = o; i <100; i++) { console.log(i); } conso1e.1og(i+1);//正常输出101 - 问题:i出了这个作用域还可以使用 } //ES6 let关键字,解决局部作用域冲突问题,建议使用let
常量 const:
在ES6之前,全部大写字母命名的就是常量,建议不要修改这样的值,(实际上可以被修改)
-
const:使用此关键字可以保证此值无法修改
3.3 方法
定义方法
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
var fangfa = { name : 'name', bitrh: 2000, //方法 age: function { //今年-出生的年 var now = new Date().getFullYear(); return now-this.bitrh; } } //属性 fangfa.name //方法,带括号() fangfa.age( )
对比this:
function getAge() { //今年-出生的年 var now = new Date().getFullYear( ); return now-this.bitrh; } var fangfa = { name : 'name', bitrh: 2000, age: getAge } //fangfa.age() 正常 //getAge() NaN window对象
this无法指向,默认指向调用它的那个对象
apply在js中可以控制this指向
getAge.app1y(fangfa,[]);//this指向了fangfa,参数为空
//但还是不能直接调用getAge()
4. 内部对象
typeof 判断对象类型
4.1 Data
var now = new Data(); now.getFullYear();//年 now.getMonth();//月 0~11代表月 now.getDate();//日 now.getDay();//星期几 now.getHours();//时 now.getMinutes();//分 now.getseconds();//秒 now.getTime();//时间戳 1970 1.1 0:00:00 毫秒数 console.log(new Date(1578106175991))//时间戳转为时间
转换
now = new Date(1578106175991) > sat an 04 2020 10:49:35 GMT+0800(中国标准时间) now.toLocaleString//注意,调用是一个方式,不是一个属性! > f toLocaleString( { [native code] } now.toLocaleString() > "2020/1/4 上午10:49:35" now.toGMTString > "sat,04 ]an 2020 02:49:35 GMT"
4.2 JSON
-
轻量级的数据传输格式
-
简介清晰的层次结构使JSON成为理想的数据交换语言
在JavaScript一切皆为对象,任何JS支持的类型都可以用JSON来表示
-
格式
-
对象都用 { }
-
数组都用 [ ]
-
所有键值对都是用key:value
-
JSON字符串和JS对象的转化:
var user = { name: "xxxxx", age: 18, sex: '男' }; //对象转化为json字符串 {"name":"xxxxx","age":3,"sex":"男"} var jsonuser = sON.stringify(user); //json字符串转化为对象 - 参数为json字符串 var obj = SON.parse('{"name":"xxxxx","age":3,"sex":"男"}');
JSON和JS对象的区别:
var obj = {a:'he11oa',b:'he11ob'}; //JS对象
var json = '{"a":"he11oa","b":"he11ob"}'
4.3 Ajax
-
原生的js写法 xhr 异步请求
-
jQuey封装好的方法 $("#name").ajax("")
-
axios请求
5. 面向对象编程
JS,JAVA,C#....面向对象;JS有哪些区别
-
类:模板 -- 原型对象
-
对象:具体的实例
原型对象:
var student = { name: "name", age: 18, run : function () { console.1og(this.name+"run..."); } }; var xiaoming = { name:"xiaoming" }; //小明的原型是Student,相当于继承 xiaoming.__proto__ = student;
class继承
class关键字是ES6引入
function student(name) { this.name = name; } //给student新增一个方法 student.prototype.hello = function () { alert('Hel1o') }; //ES6之后 -- 定义一个学生的类 class student { constructor(name) { //构造器 this.name = name; } hello() { alert('hello') } } //继承 class xiaostudent extends student { constructor(name,grade){ super(name); this.grade = grade; } myGrade(){ alert('xiaostudent') } } var xiaoming = new student('xiaoming'); var xiaohong = new student('xiaohong');
本质:查看对象原型
原型链
__proto__
原型对象最后一定会指向object,object还可以向下循环
6. 操作Bom元素 ***
JS的诞生是为了能让他在浏览器中运行
Bom:浏览器对象模型
-
IE 6~11
-
Chrome
-
Safari
-
FireFox
第三方
-
QQ
-
360
Window : 浏览器窗口
window.alert(1)
> undefined
window.innerHeight //内部高度
> 258
window.innerwidth //内部宽度
> 919
window.outerHeight //外部高度
> 994
window.outerwidth //外部宽度
> 919
Navigator : 封装了浏览器信息(不建议使用)
navigator.appName
> "Netscape"
navigator.appversion
> "5.0 (windows NT 10.0; wOW64) ApplewebKit/537.36 (KHTML,like Gecko)chrome/63.0.3239.132 Safari/537.36”
navigator.userAgent
> "Mozilla/5.0 (windows NT 10.0;wOw64) ApplewebKit/537.36(KHTML,like Gecko)chrome/63.0.3239.132 safari/537.36”
navigator.platform
> "win32"
Navigator信息可以人为修改,不建议使用这些属性判断和编写代码
screen : 代表屏幕尺寸
screen.width
> 1920
screen.height
> 1080
location *** 代表当前页面的URL信息
localton
> host : "www.baidu.com"
> href : "https://www.baidu.com/"
> protoco7 : "https:"
>
document : 代表当前的页面,html dom文档树
document.title"百度一下,你就知道"
document.tit1e='xxx' //修改标题
获取具体的文档树节点
<dl id="app">
<dt>java</dt>
<dd>JavasE</dd>
<dd>JavaEE</dd>
</d1>
<script>
var d1 = document.getElementById('app');
</script>
获取cookie
document.cookie
"_guid=111872281.88375976493059340.1578110638877.133; monitor_count=1"
劫持cookie原理 www.taobao.com
<script><script src="aa.js"></script> //使用document.cookie获取用户cookie
<!--恶意人员,可能获取你的cookie上传到他人服务器-->
服务器端可以设置cookie : httpOnly 只读
history : 代表浏览器的历史记录(不建议使用)
history.back() //后退
history.forward() //前进
7. 操作Dom元素
DOM : 文档对象模型
核心
浏览器网页就是一个Dom树形结构
-
更新
-
遍历
-
删除
-
添加
要操作Dom,先获得Dom节点
获得Dom节点 :
原生代码,之后使用jQuery
<div id="father"> <h1>标题一</h1> <p id="p1">p1</p> <p class="p2">p2</p> </div> <script> //对应css选择器 var h1 = document.getElementsByTagName('h1'); var p1 = document.getElementById('p1'); var p2 = document.getElementsByclassName('p2'); var father = document.getElementById('father'); var childrens = father.children;//获取父节点下的所有子节点 //father.firstChild father.lastChild </script>
更新节点 :
-
设置文本
<div id="ida"></div>
<script>
var idx = document.getElementById('ida');
</script>
idi.innerText='456'修改文本的值
id1.innerHTML='< strong>123</strong>'可以解析HTML文本标签
-
设置js
idx.style.color = 'ye1low';
idx.style.fontsize='20px';//驼峰命名 - 下划线转驼峰
idx.style.padding = '2em';
删除节点 :
步骤:先获取父节点,再通过父节点删除自己
<div id="father"> <h1>标题一</h1> <p id="p1">p1</p> <p class="p2">p2</p> </div> <script> var self = document.getE1ementById('p1'); var father = p1.parentElement; father.removeChild(p1); //重点 //删除是一个动态的过程,child是时可变化的 father.removeChild(father.children[o])// <h1> father.removeChild(father.children[1])// <p class="p2"> father.removeChild(father.children[2])// 报错 </script>
插入节点 :
获得某个Dom节点,假设Dom节点是空的,可以通过innerHTML添加一个元素,但如果已经存在元素,就不能这样做.会产生覆盖
追加
<p id="js">Javascript</p> <div id="list"> <p id="se">JavaSE</p> <p id="ee">JavaEE</p> <p id="me">JavaME</p> </div> <script> //已存在节点追加 -- 移动 var js = document.getElementById('js'); var list = document.getElementById('list'); list.appendchild(js);//追加 //通过JS创建一个新节点追加 var newP = document.createElement('p');//创建一个p标签 newP.id = "newP"; //等同公用写法:newP.setAttribute('id','newP'); newP.innerText = "hello"; list.appendchild(newP); //创建一个标签节点(通过setAttribute属性 可以设置任意的值) var myScript = document.createElement('scrpit');//创建一个p标签 myScript.setAttribute('type','text/javascript'); //可以创建一个style标签 var mystyle= document.createElement('style');//创建了一个空style标签 mystyle.setAttribute('type','text/css'); mystyle.innerHTML = 'body{background-color: chartreuse;}';//设置标签内容 document.getElementsByTagName('head')[0].appendchild(mystyle); </script>
insertBefore :
var ee = document.getE1ementById('ee'); var js = document.getElementById('js'); var list = document.getElementById('list'); //要包含的节点.insertBefore(newNode ,targetNode) list.insertBefore(js,ee);//将JS插入ee前面
操作表单(验证)
-
文本框 text
-
下拉框 select
-
单选多选框 radio checkbox
-
隐藏域 hidden
-
密码框 ... passward
表单的目的:提交信息
<span>用户名:</span><input type="text" id="username" /> <script> var input_text = document.getElementById('username'); input_text.value; //得到输入框的值 input_text.value = '123' //修改输入框的值 </script> <span>性别: </span> <input type="radio" name="sex" value="man" id="boy">男 <input type="radio" name="sex" value="women" id="gir1">女 <script> var boy_radio = document.getElementById('boy'); var girl_radio = document.getElementById('giri'); //对于单选框,多选框等等固定的值,boy_rad io.value只能取到当前的值 boy_radio.checked; //查看返回的结果,是否为true,如果为true,则被选中 girl_radio.checked = true; //赋值 </script>
提交表单:
MD5加密
<!--MD5工具类--> <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script> <form action="post"> <p><span>用户名:</span><input type="text" id="username" name="user"></p> <p><span>密 码:</span><input type="passwordx'x'x" id="password" name="password"></p> <!--绑定事件 onclick 被点击--> <input type="submit" onClick="aaa()" / > </form> <script> function aaa() { var uname = document.getElementById('username'); var pwd =document.getElementById('password') ; console.log(uname.value); console.log(pwd.value); //MD5算法,加密密码 pwd.value = md5(pwd.value); //pwd.value = '*****"; console.log(pwd.value); } </script>
MD5加密 + 隐藏方法
<p><span>密码:</span><input type="password" id="input-password"></p> <input type="hidden" id="md5-password" name="password"> <script> function aaa(){ var pwd = document.getElementById('input-password'); var md5pwd = document.getElementById('md5-password'); md5pwd.value = md5(pwd.value); return false; } </script>
表单绑定 : MD5加密 + 表单优化
<!-- 表单绑定提交事件 onsubmit 绑定一个提交检测的函数 将这个结果返回给表单,使用onsubmit接收 --> <form action="#" method="post" onsubmit="return aaa()"> <button type="submit">提交</button> </form> <script> function aaa(){ ....//校验判断表单内容 如果通过返回true pwd.value = md5(pwd.value); return false;// } </script>
8. JQuery
JQuery库:存在大量的JS函数
获取
在线 : 搜索 CDN JQuery
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
下载 : 官网下载 导入lib工具类文件夹
公式 : $(selector).active() 选择器就是css选择器
<a href="#" id="test-jquery">点我</a> <script> document.getElementById('id'); //选择器就是css的选贼器 $('#test-jquery').click(function() { alert(" he1lo,jQuery'); }) </script>
选择器
//原生js,选择器少,麻烦不好记
//标签
document.getElementsByTagName( );
//id
document.getElementById();
//类
document.getElementsByclassName();
//jQuery css中的选择器它全部都能用:
$('p').click(); //标签选择器
$('#id').click(); //id选择器
$('.class').click() //class选择器
文档 : https://jquery.cuishifeng.cn/
事件
mousedown() 鼠标按下
mousemove() 鼠标移动
<script src="lib/jquery-3.4.1.js"></script> <!--要求:获取鼠标当前的一个坐标--> mouse : <span id="mouseMove"></span> <div id="divMove">在这里移动鼠标试试</div> <!--最好设置CSS--> <script> //当网页元素加载完华之后,响应事件 //$(document).ready(function () {}); //简写 $(function () { $('#divMove').mousemove(function (e){ $('#mouseMove').text('x:'+e.pagex+'y:'+e.pagey) }) }); </script>
JQuery操作DOM
节点文本操作
<script src="lib/jquery-3.4.1.js"></script> <ul id="test-ul"> <li class="js">JavaScript</li> <li name="python" >Python</li> </ul> <script> $('#test-ul li[name=python]').text(); //获得值 $('#test-ul li[name=python]').text('设置值'); //设置值 重载 $('#test-ul').html(); //获得值 $('#test-ul').html('<strong>123</strong>'); //设置值 </script>
css操作
$('#test-u1 li[name=python]').css({"color","red"})
元素的显示与隐藏,本质 display:none
$('#test-u1 1i[name=python]').show();
$('#test-u1 li[name=python]').hide();
ajax();
$('#from').ajax()

浙公网安备 33010602011771号