1.介绍
Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行 JavaScript 代码。 JS 是 Netscape 网景公司的产品,最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。 JS 是弱类型,Java 是强类型。
特点:
- 交互性(它可以做的就是信息的动态交互)
- 安全性(不允许直接访问本地硬盘)
- 跨平台性(只要是可以解释 JS 的浏览器都可以执行,和平台无关)
2.JS与HTML的结合方式
-
在head标签中编写js
-
通过文件引入
注:当这个 script标签引入JS文件时,该标签中的内容就会被覆盖掉,自能从新写一个script标签
3.变量
数据类型:
- 数值型 : number
- 字符串类型: string
- 对象类型: object
- 布尔类型: boolean
- 函数类型: function
特殊值:
- undefined : 所有未定义的变量都是 undefined
- null : 空值
- NaN : Not a Number 非数值类型
定义变量:
与python很相似
var 变量名;
var 变量名 = 值;
4.关系运算符
- == 与 ===
==: 比较的是字面值
===:比较 字面值 和 数据类型
- || && !
&&:
- 当全为真时,返回最后一个表达式的值
- 当有假时,返回第一个为假的表达式的值
||
- 当表达式全为假时,返回最后一个表达式的值
- 只要有一个表达式为真。就会把回第一个为真的表达式的值
5.数组
可以看作一个object型的动态数组。
不过有一点比较神奇
当给 arr[100] 复制时 那么他的长度就为 100
尽管数组前面没有赋值!!!
定义方式
var 数组名 = [] ; // 空数组
var 数组名 = [1, 2, “aaa”]; // 赋初始值
6.函数
- 与Linux中的编写脚本有点像!!
- 他可以不用指定参数个数(也可以指定参数),可以通过argument[]数组来获取
这也导致了函数不能重载- 返回值可有可无
定义形式一
function 函数名([形参列表]){ 函数体 };
定义形式二
var 变量名 = function([形参列表]){ 函数体 };
函数的隐形参数arguments(自在function内)
就是在 function 函数中不需要定义,但却可以直接用来获取所有参数的变量。我们管它叫隐形参数。 隐形参数特别像 java 基础的可变长参数一样。 public void fun( Object … args ); 可变长参数其他是一个数组。 那么 js 中的隐形参数也跟 java 的可变长参数一样。操作类似数组。
7.自定义对象
对象与java中的对象非常像
两种自定义方式
1.
对象的定义: var 变量名 = new Object(); // 对象实例(空对象)
变量名.属性名 = 值; // 定义一个属性
变量名.函数名 = function(){} // 定义一个函数
对象的访问: 变量名.属性 / 函数名();
var 变量名 ={
属性名 :值,
函数名 :function
}
8.事件
- onload加载完成事件
页面加载完成之后,常用于做页面 js 代码初始化操作
- onlick 单击事件
常用于按钮的点击响应操作。
- onblur 失去焦点事件
常用用于输入框失去焦点后验证其输入内容是否合法。
- onchange 内容改变事件
常用于下拉列表和输入框内容发生改变后操作
- onsubmit 表单提交事件
常用于表单提交前,验证所有表单项是否合法。
事件的注册两种
6. 静态注册
- 动态注册
案例实操:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function myOnload() {
alert("静态加载");
}
window.onload = function (){
alert("动态加载");
}
</script>
</head>
<!--<body οnlοad="myOnload();">-->
<!-- <div >ok</div>-->
<!--</body>-->
<body >
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
window.onload = function (){
// 按钮点击动态绑定
let elementById = document.getElementById("1001");
elementById.onclick = function (){
alert("按钮点击事件");
}
// 失去焦点动态绑定
let element = document.getElementById("1002");
element.onblur = function (){
alert("失去焦点事件");
}
// 内容改变动态绑定
let element1 = document.getElementById("1003");
element1.onchange = function (){
alert("内容改变事件");
}
// 表单提交事件
let elementById1 = document.getElementById("1004");
elementById1.onsubmit = function (){
alert("表单提交事件");
// return false; // 阻止表单提交
// return true; 允许表单提交
}
}
</script>
</head>
<body>
<button id="1001">按钮</button> <br>
输入框:<input type="text" id = "1002"><br>
下拉框:<select id="1003">
<option>哈哈</option>
<option>啊啊</option>
<option>背包</option>
</select><br>
表单提交:
<form action="http://localhost:8080" id = "1004" method="get" >
<input type="submit">
</form>
</body>
</html>
9.DOM模型
DOM 全称是 Document Object Model 文档对象模型 大白话,就是把文档中的标签,属性,文本,转换成为对象来管理。 那么 它们是如何实现把标签,属性,文本转换成为对象来管理呢。
整个结构是树结构,其实也跟java的结构很像
document对象的方法介绍
- document.getElementById(elementId)
通过标签的 id 属性查找标签 dom 对象,elementId 是标签的 id 属性值
- document.getElementsByName(elementName)
通过标签的 name 属性查找标签 dom 对象,elementName 标签的 name 属性值
- document.getElementsByTagName(tagname)
通过标签名查找标签 dom 对象。tagname 是标签名
- document.createElement( tagName)
通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名
注:
document 对象的三个查询方法,如果有 id 属性,优先使用 getElementById 方法来进行查询 如果没有 id 属性,则优先使用 getElementsByName 方法来进行查询 如果 id 属性和 name 属性都没有最后再按标签名查 getElementsByTagName 以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象
案例实操
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// 实现当失去焦点时自动检验内容是否合法(getElementById)
function myOnblur() {
// 获取对象
let id = document.getElementById("1001");
let value = id.value;
// 正则表达式
let pattern = /^\w{5,12}$/;
// 获取span对象
let element = document.getElementById("1002");
if (!pattern.test(value)) {
element.innerHTML = "输入不合法";
}else {
element.innerHTML = "看不到我";
}
}
// 实现复选框的全选 反选 全不选 (getElementByName)
function checkAll(){
for (const elementsByNameElement of document.getElementsByName("hobby")) {
elementsByNameElement.checked = true;
};
}
function checkNo() {
for (const elementsByNameElement of document.getElementsByName("hobby")) {
elementsByNameElement.checked = false;
};
}
function checkReserve() {
for (const elementsByNameElement of document.getElementsByName("hobby")) {
if (elementsByNameElement.checked == true){
elementsByNameElement.checked = false;
}else
elementsByNameElement.checked = true;
};
}
// getElementTag 和getElementByName一样
// createElement
window.onload = function (){
// 1.创建标签对象(在内存中)
let divElement = document.createElement("div");
// 2.给标签对象赋值
// divElement.innerHTML = "我是一个div";
let text = document.createTextNode("我是一个特殊的标签");
divElement.appendChild(text);
// 3.添加到body中
document.body.appendChild(divElement);
}
</script>
</head>
<body>
用户名:<input type="text" id="1001" onblur="myOnblur()">
<span id="1002">看不到我</span><br>
密码: <input type="password" id="1003"><br>
<input type="checkbox" name="hobby" value="cpp" checked="checked">c++
<input type="checkbox" name="hobby" value="java" >java
<input type="checkbox" name="hobby" value="python">python
<br>
<button onclick="checkAll()">全选</button>
<button onclick="checkNo()">全不选</button>
<button onclick="checkReserve()">反选</button>
<br>
</body>
</html>
节点(标签对象)的常用属性和方法
- 方法:
1.1 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点
1.2 appendChild( oChildNode ) 方法,可以添加一个子节点,oChildNode
- 属性:
childNodes 属性,获取当前节点的所有子节点
firstChild 属性,获取当前节点的第一个子节点
lastChild 属性,获取当前节点的最后一个子节点
parentNode 属性,获取当前节点的父节点
nextSibling 属性,获取当前节点的下一个节点
previousSibling 属性,获取当前节点的上一个节点
className 用于获取或设置标签的 class 属性值
innerHTML 属性,表示获取/设置起始标签和结束标签中的内容
innerText 属性,表示获取/设置起始标签和结束标签中的文本
案例实操
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>dom查询</title>
<link rel="stylesheet" type="text/css" href="style/css.css" />
<script type="text/javascript">
window.onload = function(){
//1.查找#bj节点
//2.查找所有li节点
var btn02Ele = document.getElementById("btn02");
btn02Ele.onclick = function(){
let str="";
for (const elementsByTagNameElement of document.getElementsByTagName("li")) {
str += elementsByTagNameElement.innerHTML + "\t";
};
btn02Ele.innerHTML = str;
};
btn02Ele.onblur = function (){
btn02Ele.innerHTML = "查找所有li节点";
};
//3.查找name=gender的所有节点
var btn03Ele = document.getElementById("btn03");
btn03Ele.onclick = function(){
let str="";
for (const elementsByNameElement of document.getElementsByName("gender")) {
str = elementsByNameElement.value + "\t";
};
btn03Ele.innerHTML = str;
};
//4.查找#city下所有li节点
var btn04Ele = document.getElementById("btn04");
btn04Ele.onclick = function(){
let str="";
let city = document.getElementById("city");
for (const child of city.getElementsByTagName("li")) {
str += child.innerHTML + "\t";
};
btn04Ele.innerHTML = str;
};
//5.返回#city的所有子节点
var btn05Ele = document.getElementById("btn05");
btn05Ele.onclick = function(){
let str = "";
let city = document.getElementById("city");
for (const childNode of city.childNodes) {
str += childNode + "\t";
};
btn05Ele.innerHTML = str;
};
//6.返回#phone的第一个子节点
var btn06Ele = document.getElementById("btn06");
btn06Ele.onclick = function(){
let phone = document.getElementById("phone");
btn06Ele.innerHTML = phone.firstChild.textContent;
};
//7.返回#bj的父节点
var btn07Ele = document.getElementById("btn07");
btn07Ele.onclick = function(){
let bj = document.getElementById("bj");
btn07Ele.innerHTML = bj.parentNode.innerHTML;
};
//8.返回#android的前一个兄弟节点
var btn08Ele = document.getElementById("btn08");
btn08Ele.onclick = function(){
btn08Ele.textContent = document.getElementById("android").previousSibling.textContent;
};
//9.读取#username的value属性值
var btn09Ele = document.getElementById("btn09");
btn09Ele.onclick = function(){
btn09Ele.textContent = document.getElementById("username").value;
};
//10.设置#username的value属性值
var btn10Ele = document.getElementById("btn10");
btn10Ele.onclick = function(){
btn10Ele.textContent = document.getElementById("username").value = "aa";
};
//11.返回#bj的文本值
var btn11Ele = document.getElementById("btn11");
btn11Ele.onclick = function(){
btn11Ele.textContent = document.getElementById("bj").innerText;
};
};
</script>
</head>
<body>
<div id="total">
<div class="inner">
<p>
你喜欢哪个城市?
</p>
<ul id="city">
<li id="bj">北京</li>
<li>上海</li>
<li>东京</li>
<li>首尔</li>
</ul>
<br>
<br>
<p>
你喜欢哪款单机游戏?
</p>
<ul id="game">
<li id="rl">红警</li>
<li>实况</li>
<li>极品飞车</li>
<li>魔兽</li>
</ul>
<br />
<br />
<p>
你手机的操作系统是?
</p>
<ul id="phone"><li>IOS</li><li id="android">Android</li><li>Windows Phone</li></ul>
</div>
<div class="inner">
gender:
<input type="radio" name="gender" value="male"/>
Male
<input type="radio" name="gender" value="female"/>
Female
<br>
<br>
name:
<input type="text" name="name" id="username" value="abcde"/>
</div>
</div>
<div id="btnList">
<div><button id="btn01">查找#bj节点</button></div>
<div><button id="btn02">查找所有li节点</button></div>
<div><button id="btn03">查找name=gender的所有节点</button></div>
<div><button id="btn04">查找#city下所有li节点</button></div>
<div><button id="btn05">返回#city的所有子节点</button></div>
<div><button id="btn06">返回#phone的第一个子节点</button></div>
<div><button id="btn07">返回#bj的父节点</button></div>
<div><button id="btn08">返回#android的前一个兄弟节点</button></div>
<div><button id="btn09">返回#username的value属性值</button></div>
<div><button id="btn10">设置#username的value属性值</button></div>
<div><button id="btn11">返回#bj的文本值</button></div>
</div>
</body>
</html>