JavaScript
狂神有一些地方笔记写的不对,我跟着敲得时候有一些自己改了过来,但是不能保证写出的代码就是对的//
有不懂的地方问百度//
视频地址
在网页里调试js
在网页中预览了代码之后,右键然后选择审查(谷歌浏览器),然后选择colsole控制台来进行调试
控制台常用代码:
? console.log() //打印代码中的变量
也可以选择sources可以看到源代码,通过打断点来进行调试。
Application用来查看cookie
Element用来查看网站元素
network用来抓包
在HTML中使用js
<script>
alert("hello,word");
</script>
<script src="js/lesson1.js"></script>
语法
<script>
var c=1;
var name="ssss";
if(9>c){
alert(name);
}
</script>
数据类型快速浏览
js不区分整数和小数
== 等于 (类型不一样,值一样,也会判断为true)
=== 绝对等于 (类型一,值一样,才会判断为true)
所以平时我们要坚持使用绝对等于。
NaN 表示不是一个数 not a number
Infinity 无限大
注意精度问题:
alert( (1/3) === (1-2/3) );
alert((1/3)-(1- 2/3)<0.000001)
注意空和未定义不一样
null:定义了但是没有值
undefined:未定义 查询数组越界也会出现undefined
数组:类似python里的列表 因为var类似auto 使用中括号括起来
var arr =[1,2,3,true,null,'s'];
new Array(1,12,3,5,'hello');
对象:使用大括号括起来
var Person = {
name='szg',
age=4,
tag=['student',3,6];
};
严格检查模式
在js代码前面加入这句话能够规避一些不严谨的操作定义
'use strict';
数据类型
字符串
- 正常字符串使用单引号或者双引号包裹
- 注意转义字符 \
\'
\n
\t
\u4e2d
\x41
var=` ss
name
`
'use strict';
let name='szg';
let msg=`你好呀,${name}`;
console.log(msg);
name.length;
name.toUpperCase();
name.toLowerCase();
name.indexOf('s');
name.substring(1,3)
数组
Array可以包括任意类型的元素
arr.length=2;
arr[1]=1;
arr.indexof(1);
arr.indexof("1");
arr.slice(1,2);
arr.push('a','b');
arr.pop();
arr.shift();
arr.unshift('a','b');
arr.sort()
arr.reverse();
arr1.concat(arr2);
arr1.concat([3,4,5]);
arr.join('-');
arr=[[1,2]['1','2','3']];
arr.fill();
对象
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}
- 当想要获取对象中不存在的属性时,会提示未定义而不是报错
- 可以动态的删减添加属性
delete Person.name;
Person.haha="haha";
'age' in Person
‘toString’ in Person
Person.hasOwnProperty('age')
Person.hasOwnProperty('toString')
分支和循环
if,else,while,dowhile都和java一样
for in 由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给Array对象添加了额外的属性后,遍历时会将额外的属性也加入进来
let age=[1,2,3,4,5,6,7,4,3];
for(let num in age){
if(age.hasOwnProperty(num)){
console.log('存在');
console.log(age[num]);
}
}
for(let x of age){
console.log(x);
}
age.forEach(function(value){
console.log(value);
});
Map和Set
var map =new Map([ ['tom',10],['javk',90],['szg',100] ]);
var name=map.get('szg');
map.set('admin',23);
map.delete('tom');
console.log(name);
var set=new Set([1,3,2,5,4,6,7,2,3,4]);
console.log(set.has(1));
set.delete(1);
set.add(9);
for (var x of set){
console.log(x);
}
for (var x of map){
console.log(x);
}
函数
function abs(x){
if(x>=0)return x;
else return -x;
}
var abs=function(x){
if(x>=0)return x;
else return -x;
}
abs(10);
javascript可以传任何个参数,也可以不传参数 参数进来是否存在的问题?假设不存在参数,如何抛出异常?
var abs = function(x){
if (typeof x !== 'number') {
throw 'not a number';
}
if (x>=o) {
return x;
}else{
return -x;
}
}
使用方法: 虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同,直接采用读取下标
因此在js代码中,不需要指出参数名称,就能够访问他们
function test() {
var s = "";
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
test("name", "age");
使用场景:函数定义了两个参数,但是传入了第三个参数,要怎么取出第三个参数呢?
function test (a,b){
console.log('a->'+a);
console.log('b->'+b);
if(arguments.length>2){
for(let i=2;i<arguments.length;i++){
console.log(arguments[i]);
}
}
}
function test1(a,b,...rest){
console.log('a->'+a);
console.log('b->'+b);
console.log(rest);
}
变量的作用域
-
内部函数可以访问外部函数的成员,反之不行 -
在客户端 JavaScript 中,Window 对象是全局对象,所有的表达式都在当前的环境中计算。 也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性作为全局变量来使用。 -
ES6中的let关键字,用于解决局部作用域冲突问题,应该用let去定义局部变量而不是var -
在ES6之前,定义常量使用全部大写字母命名的变量就是常量,而现在使用const定义常量
方法
定义方法:方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数
var person = {
name: 'zhang',
brith: 1997,
age: function(){
var now = new Date().getFullYear();
return now - this.brith;
}
}
问题:为啥我的一直说person未定义,明明已经定义好了??
因为你把中间的逗号写成了分号。。。
function getAge(){
var now = new Date().getFullYear();
return now - this.brith;
}
var person = {
name: 'zhang',
brith: 1997,
age: getAge
}
person.getAge();
getAge.apply(person,[]);
对象
标准对象列举
typeof 123
“number”
typeof ‘123’
‘string’
typeof true
“boolean”
typeof NaN
“number”
typeof []
typeof {}
typeof Math. abs
typeof undefined
Date对象
列举的一些和java类似
var now = new Date();
now. getFu11YearO);
now. getMonth();
now. getDate();
now. getDay();
now. getHours();
now. getMinutes();
now. getseconds();
now. getTimeO);
比较复杂的函数
toLocaleSting:
- 本地时间把 Date 对象转换为本地格字符串。
- 可把一个 Number 对象转换为本地格字符串。
- 可把一个 Array 对象转换为本地字符串。
JSON对象
目前几乎已经成为了轻量级传递信息的一种格式标准
格式:
- 对象都用{}
- 数组都用[]
- 键值对都用 key:value
var user={
name :'szg',
age :3,
sex:'男'
}
var jsonuser=JSON.stringify(user);
var User=JSON.parse(jsonuser);
var User=JSON.parse('{"name":"szg","age":3,"sex":"男"}');
继承
原型继承
var student = {
name : 'szg',
age:3,
run: function (){
console.log(this.name + "run ... ");
}
}
var xiaoming = {
name : 'xiaoming'
}
xiaoming.__proto__ = student;
xiaoming.run();
console.log(xiaoming.run());
class继承
class student{
constructor(name) {
this.name=name;
}
hello (){
alert('hello');
}
}
var xiaoming=new student("xiaoming");
xiaoming.hello();
class xiaostudent extends student{
constructor(name,grade) {
super(name);
this.grade=grade;
}
}
var xiaohong=new xiaostudent("xiaohong",3);
但是通过打印小红可以看到其本质还是通过 proto 指定student为其父类
当在控制台打印上面的小红之后,可以发现每次拓展 proto会到最底端的object然后继续拓展会发现形成了一个圈。叫做原型链(具体百度
操作BOM对象
- window 当前窗口的信息 (长、宽
- navigator 当前浏览器的信息 (版号、所用系统
- screen 当前屏幕的信息 (长、宽
- location 当前页面的URL信息 (地址、连接、协议等
- document 当前页面的代码信息 (页面标题、获得节点、网页cookie、
扯皮:关于cookie的劫持的例子:登陆淘宝,天猫也会自动登录,因为cookie被淘宝发给了天猫)
- history 代表浏览器的历史记录,可以操控页面的前进或者后退( .back() 和 .forward() )
操作DOM对象
浏览器网页就是一个DOM树形结构
ID不要随手敲一个空格上去 空格也会算在id的一部分
获得DOM节点
<div id="father">
<h1> 标题1 </h1>
<p id ="p1">p1 </p>
<p class ="p2">p2 </p>
</div>
<script>
var h1 = document.getElementsByTagName('h1');
var pl = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var father = document.getElementById('father');
var childrens = father.children;
var first_child = father.firstchild
var last_child = father.lastchild
</script>
更新DOM节点
<div id="id1">123 </div>
<script>
var id1=document.getElementById("id1");
id1.innerText="456";
id1.innerHTML='<strong> 456 </strong>'
id1.style.color='red';
id1.style.fontsize='20px';
</script>
删除DOM节点
<div id="id1">123
<h1>h1</h1>
<p id='p1'>p1</p>
<p class ='p2'>p2</p>
</div>
<script>
var self=document.getElementById("p1");
var father=p1.parentElement;
father.removeChild(self);
</script>
注意删除多个节点,要从后往前删 例如:
father.removeChild(father.children[0]);
father.removeChild(father.children[1]);
father.removeChild(father.children[2]);
插入DOM节点
我们获得了某个Dom节点,假设这个dom节点是空的,我们通过 innerHTML 就可以增加一个元素了,但是这个Dom节点已经存在元素了,我们就不能这么干了!会产生覆盖
<p id="js"> javascript</p>
<div id="list">
<p id="ee">javaee</p>
<p id="se">javase</p>
<p id="me">javame</p>
</div>
<script>
var me = document.getElementById('me');
var js = document.getElementById('js');
var list = document.getElementById('list');
list.appendChild(js);
list.insertBefore(js,me);
var newP = document.createElement('p');
newP.id = 'newP';
newP.innerText = 'Hello,Kuangshen';
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript');
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerHTML = 'body{background-color:red;}';
document.getElementsByTagName('head')[0].appendChild(myStyle);
</script>
获取表单
<body>
<form action='#' method="post" >
<p>
<span>用户名:</span>
<input type="text" id="username">
</p>
<p>
<span>性别</span>
<input type="radio" name="sex" value="man" id="boy">男
<input type="radio" name="sex" value="women" id="girl">女
</p>
</form>
<script>
var input_text = document.getElementById('username');
var itext=input_text.value;
input_text.value='szg';
var boy_radio = document.getElementById('boy');
var girl_radio = document.getElementById('girl');
if(boy_radio.checked==false && girl_radio.checked==false)
{
alert("未选择");
boy_radio.checked=true;
}
</script>
</body>
扩展加密表单
对表单提交的密码进行加密,利用MD5在控制台加密
<head> <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<form action="https://www.baidu.com" method="post">
<p>
<span>用户名: </span> <input type="text" id="username" name="username">
</p>
<P>
<span>密码: </span> <input type="password" id="password" name="password">
</p>
.
<button type="submit" onclick="aaa()">提交</button>
</form>
<script>
function aaa() {
var pwd = document.getElementById('password');console.log(pwd.value);
pwd.value = md5(pwd.value);
console.log(pwd.value);
}
</script>
</body>
这样子会造成一定程度的感观不好,因为提交的一瞬间,用户会发现自己的密码框里的密码会变得特别长。
优化表单加密方式
<head> <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<form action="https://www.baidu.com/" method="post" onsubmit="return check()">
<P>
<span>用户名: </span> <input type="text" id="username" name="username">
</p>
<p>
<span>密码: </span> <input type="password" id="input-password" >
</p>
<input type= "hidden" id="md5-password" name=" password" >
<button type = "submit">提交</button>
</form>
<script>
function check() {
var pwd = document.getElementById("input-password" );
var md5pwd = document.getElementById('md5-password' );
md5pwd.value = md5(pwd.value);
return true;
}
</script>
</body>
jQuery
获取
有两种方式:一个是在官网下载然后在本地引入,第二个是现在练习可以使用cdn的工具连接直接写在head中
<head><script src="lib/jquery.js"></script></head>
<head><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script></head>
使用
唯一公式:
$(selector).action()
简单使用:
<a href="" id="jq_test1">点我</a>
<script type="text/javascript">
$('#jq_test1').click(function(){
alert('hello,jQuery');
})
</script>
选择器:
$('p').click()
$('#id').click()
$('.class').click()
然后可以通过查询文档了解更多的选择器:jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm (cuishifeng.cn)
事件
可以参考上面文档,有键盘鼠标的相关操作、点击、元素改变、焦点等等。。。
示例实现了一个窗口,鼠标在里面可以实时反应鼠标的坐标
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<style>
#divMove{
width:500px;
height:500px;
border:1px solid red;
}
</style>
</head>
<body>
mouse:<span id = "mouseMove"></span>
<div id = "divMove">
在这里移动鼠标试试
</div>
<script>
$(function(){
$('#divMove').mousemove(function(e){
$('#mouseMove').text('x:'+e.pageX+"y:"+e.pageY)
})
});
</script>
</body>
</html>
操作DOM
<ul id ='test-ul'>
<li class ='js'> js</li>
<li name='python'> python</li>
</ul>
<script>
</script>
|