JS让网页可以互动,是web编程语言
JS是事件驱动型的编程语言,依靠事件去驱动,然后执行对应的程序
事件如click,对应事件句柄为onclick。事件句柄就是在事件单词前添加一个on,事件句柄是以HTML标签的属性存在
<body> <input type="button" value="hello" onclick="window.alert('恭喜你开始了JS!') window.alert('HHH')"/> </body>
上面代码中,window可以省略不写
而且需要注意的是,第一条语句后面如果换行,则不需要分号
暴露在脚本块中的程序,在页面打开时执行,自上而下
<body> <script type="text/javascript"> window.alert("Hello JS!"); </script> </body>
javascript的脚本块在一个页面当中可以出现多次,且位置也没有要求
java是强类型语言,编译阶段,数据类型等就固定,直到最终内存释放,一直都不变
javascript是弱类型语言,没有编译阶段,一个变量可以随意赋值
<body> <script> var i; alert("i:"+i); </script> </body>
方式一:function 函数名(形式参数列表){函数体}
方式二:函数名 = function(形式参数列表){函数体}
JS函数没有重载一说,如果两个函数重名,即使形参不同,后面一个函数也会覆盖前面那个函数
<body> <script> function hello(userName){ alert("hello"); } function hello(){ alert("hello javascript!"); } hello("java"); hello(); </script> </body>
这段代码只会弹出两次hello javascript!
全局变量是在函数体之外声明的变量,生命周期随着浏览器的存货
局部变量是在函数体中声明的变量,包括形参,函数执行结束,局部变量就释放
<body> <script> // 全局变量 var userName = "zhangsan"; function hello(){ // 局部变量 var userName = "lisi"; // 就近原则 alert("userName:"+userName); } hello(); // 局部变量随着方法的消失而消失 alert("userName:"+userName); </script> </body>
如果在函数中,局部变量前未加var
,那么改该变量将变为全局变量
JS中的变量声明时不需要指定数据类型,但是赋值时,每一个数据还是有类型的
原始类型:
引用类型:
使用typeof可以在程序的运行阶段动态获取变量的数据类型,格式为:typeof 变量名
,结果为一下6个字符串之一(即需要带双引号)
JavaScript中没有equals方法,请直接使用==
<body> <script> function sum(a,b){ if(typeof a == "number" || typeof b == "number"){ return a+b; }else{ alert(a+","+b+"必须为数字"); } } var resValue = sum("abc","hello"); alert(resValue); alert(typeof sum); var x; alert(typeof x); var m = 1; var n = "1"; var k = null; var j = false; alert(typeof m); alert(typeof n); alert(typeof j); alert(typeof k); </script> </body>
Undefined类型只有一个值,这个值就是undefined
属性:
函数:
<body> <script> function sayHello(){ alert("Hello"); } sayHello(); var say = new sayHello(); alert(say); </script> </body>
类的定义和函数定义,不能说一模一样,只能说完全一样
区别在于使用时,类使用new来创建,函数则直接调用
<body> <script> function myFunc(name,age,number){ this.name = name; this.age = age; this.number = number; // 类中定义函数 this.getNumber = function(){ return this.number; } } var myFunc1 = new myFunc("lisi",18,100); var temp = myFunc1.getNumber(); alert(temp); // 通过prototype动态扩展函数 myFunc.prototype.getAge = function(){ return this.age; } // 注意,这里的new不要去掉,去掉的话就不是一个类,会有问题 var zhangsan = new myFunc("zhangsan",20,120); var age = zhangsan.getAge(); var number = zhangsan.getNumber(); alert(age); alert(number); </script> </body>
同时,因为new出来的String也是Object,那么String也可以通过prototype添加函数
<body> <script> String.prototype.addFunc = function(){ alert("恭喜你添加了一个新函数"); } "hello".addFunc(); </script> </body>
比较Java和JavaScript的类的定义与创建对象
// java定义类 public class User{ private String username; private String pasword; public User(){} public User(String username,String password){ this.username = username; this.password = password; } } // java创建对象 User user = new User(); User user = new User("zhangsan","123");
User = function(username,password){ this.username = username; this.password = password; } var u = new User(); var u = new User("zhangsan"); var u = new User("zhangsan","123");
双等于比较值,三等于全都比较(类型)
<body> <script> alert(10=="10"); // true alert(10==="10"); // false alert(1==true); // true alert(1===true); // false alert(undefined==null); // true alert(undefined===null) // false </script> </body>
<body> <script type="text/javascript"> // 对当前程序来说,sum被称为回调函数 function sum(a,b){ alert(a+b); } sum(3,5); userName = function(username){ alert("hello "+username); } </script> <!-- 将函数sum注册到按钮上,等待click事件发生后,浏览器调用 --> <button onclick="sum(6,9)">计算6和9的和</button> <button onclick="userName('javascript');">点击欢迎</button> </body>
<body> <button onclick="window.alert('Hello JS!')">直接注册</button> <button id="button1">通过get获取</button> <button id="button2">匿名函数</button> <button id="button3">匿名函数整合</button> <script> myFunc1 = function(){ alert("Hello JS1!"); } // 通过getElementById获取,然后注册 var id1 = document.getElementById('button1'); id1.onclick = myFunc1; // 注意这里给函数名,不是给函数,即id1.onclick = myFunc1();是错误的 // 通过匿名函数注册事件 var id2 = document.getElementById("button2"); id2.onclick = function(){ alert('Hello JS2!'); } // 整合 document.getElementById('button3').onclick = function(){ alert('Hello JS3!'); } </script> </body>
JS一般放在内容的后面,如果想放在内容前面,最好加上onload表示页面加载之后再执行js代码
<body> <script> window.onload = function(){ document.getElementById("btn").onclick = function(){ alert("Hello JS!"); } } </script> <button id="btn">开始</button> </body>
<body> <script> window.onload = function(){ document.getElementById("btn").onclick = function(){ var textVal = document.getElementById("mytext"); textVal.type = "checkbox"; } } </script> <input type="text" id="mytext"> <button id="btn">点击修改</button> </body>
<body> <input type="text" id="btn"> <script> document.getElementById("btn").onkeydown = function(event){ if(event.keyCode==13){ alert("正在验证登陆!") } } </script> </body>
void运算符执行表达式,但不返回任何结果,在超链接中可以运用上
javascript:
表示后面接的是一段JavaScript代码,而不是路径
void(0)
表示不返回任何结果
<body> <div>首页</div> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <div>尾部</div> <a href="javascript:void(0)" onclick="window.alert('测试中')">点击</a> <br><br><br> </body>
JavaScript中的数组遍历,如果使用for in语句,与Java有些不一样
<body> <script> var arr = [1,'t',false,true,null] for(var i=0;i<arr.length;i++){ alert(i) } for(var i in arr){ alert(i) } </script> </body>
上述输出都是数组下标,而不是数组元素
如果是对象的话,for in就变成了属性名,此时为字符串
<body> <script> UserName = function(username,password){ this.username = username this.password = password } var obj = new UserName("张三","123456") for(var i in obj){ alert(obj[i]) } </script> </body>
ECMAScript是js基础内容,DOM是文档对象模型,对HTML中的节点进行操作;BOM是浏览器对象,对浏览器本身操作,如前进、后退、弹窗等
BOM顶级对象是window
DOM顶级对象是document,实际上BOM包括DOM
<body> <input type="text" id="text"> <button id="btn">点击</button> <script> window.onload = function(){ document.getElementById("btn").onclick = function(){ var xxx = document.getElementById("text") alert(xxx.value) alert(document.getElementById("text").value) document.getElementById("text").value = "hello" alert(document.getElementById("text").value) } } </script> <hr> <script> window.onload = function(){ document.getElementById("id3").onclick = function(){ document.getElementById("id2").value = document.getElementById("id1").value } } </script> <input type="text" id="id1"> <br> <input type="text" id="id2"> <br> <button id="id3">切换</button> <br> <script> window.onload = function(){ document.getElementById("tttt").onblur = function(){ alert(this.value) } } </script> <input type="text" id="tttt"> </body>
<body> <script> window.onload = function(){ document.getElementById("btn").onclick = function(){ document.getElementById("text").innerHTML = "<font color='red'>abcdefg</font>" } } </script> <div id="text"></div> <button id="btn">写入文本框</button> </body>
正则表达式主要用于格式匹配
复习了一遍正则表达式,然后也在菜鸟上又看了一遍
对于自己来说,贪婪匹配,前置约束等内容不太熟悉
最简单最有用的应用:查找文本中两个相同的相邻单词的匹配项的能力
如:
var str = "Is is the cost of of gasoline going up up"; var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1));
正则表达式的标记(修饰符)用于指定额外的匹配策略
标记不写在正则表达式里,标记位于表达式之外,如上面反向引用的最后面的ig
.
中包含换行符\n
(默认情况下的.
匹配除换行符\n
之外的任何字符)var regExp = /正则表达式/flags
var regExp = new RegExp("正则表达式","flags")
<body> <script> window.onload = function(){ document.getElementById("btn").onclick = function(){ var email = document.getElementById("text").value var regExp = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ var result = regExp.test(email) if(!result){ document.getElementById("span").innerHTML = "邮箱格式错误!" }else{ document.getElementById("span").innerHTML = "邮箱格式正确!" } } document.getElementById("text").onfocus = function(){ document.getElementById("span").innerHTML = "" } } </script> <input type="text" id="text"> <button id="btn">点击</button> <br> <span id="span" style="font-size: 14px;color: red;"></span> </body>
在低版本的IE中,trim函数不能使用,这时需要通过动态扩展prototype结合正则表达式来进行重写trim函数
<body> <script> /* window.onload = function(){ document.getElementById("btn").onclick = function(){ var result = document.getElementById("text").value result = result.trim() alert("----->"+result+"<-----") } } */ // 如果在低版本的IE中,trim函数不能使用,这时可以通过prototype进行扩展 String.prototype.trim = function () { // alert("正在改写trim......") return this.replace(/^\s+/, "").replace(/\s+$/, "") } // "hello".trim() window.onload = function () { document.getElementById("btn").onclick = function () { var result = document.getElementById("text").value result = result.trim() alert("----->" + result + "<-----") } } </script> <input type="text" id="text"> <input type="button" value="按钮" id="btn" name="button"> </body>
![image-20220117184554199](C:\Users\OptiPlex 7090\AppData\Roaming\Typora\typora-user-images\image-20220117184554199.png)
<body> <script> window.onload = function () { document.getElementById("btn").onclick = function () { var flag = true var userRegExp = /^[A-Za-z0-9]{6,14}$/ var password1Reg = /^[a-zA-Z]\w{5,17}$/ var username = document.getElementById("text1").value var result1 = userRegExp.test(username) if (result1) { // alert("true") var password1 = document.getElementById("password1").value var result2 = password1Reg.test(password1) if (result2) { // alert("true") var result3 = document.getElementById("password2").value if (password1 == result3) { alert("注册成功!") } else { document.getElementById("password2Span").innerHTML = "两次密码不一致" flag = false } } else { // alert("false") document.getElementById("password1Span").innerHTML = "密码不满足要求" flag = false } } else { // alert("false") document.getElementById("textSpan").innerHTML = "用户名不满足要求" flag = false } document.getElementById("text1").onfocus = function () { document.getElementById("textSpan").innerHTML = "" } document.getElementById("password1").onfocus = function () { document.getElementById("password1Span").innerHTML = "" } document.getElementById("password2").onfocus = function () { document.getElementById("password2Span").innerHTML = "" } } } </script> <div>注册界面</div> 用户名:<input type="text" id="text1"> <span id="textSpan"></span> <br> 密 码 : <input type="password" id="password1"> <span id="password1Span"></span> <br> 确 认 : <input type="password" id="password2"> <span id="password2Span"></span> <br> <input type="button" value="注册" id="btn"> <span id="btnSpan"></span> </body>
正则表达式网上抄的,innerHTML中的内容写在head中的style里面
可以把点击按钮进行验证,改成onblur,这样条内容都会验证,而不是全部写完了再验证
<body> <script> window.onload = function () { var first = document.getElementById("firstCheck") var box = document.getElementsByName("box") first.onclick = function () { for (var i = 0; i < box.length; i++) { // alert(box[i]) box[i].checked = first.checked } } var total = box.length for(var j=0;j<box.length;j++){ box[j].onclick = function(){ var checkCount = 0 for(var k=0;k<box.length;k++){ if(box[k].checked){ checkCount++ } } first.checked = (total == checkCount) } } } </script> <input type="checkbox" id="firstCheck"><br> <input type="checkbox" id="secondCheck" name="box">抽烟<br> <input type="checkbox" id="thirdCheck" name="box">喝酒<br> <input type="checkbox" id="lastCheck" name="box">烫头<br> </body>
有时候我们需要周期性执行某函数,那么此时需要用到周期函数
<body> <input type="button" id="btn" value="时间"> <input type="button" id="stopBtn" value="停止" onclick="stop()"> <div id="text"></div> <script> document.getElementById("btn").onclick = function(){ start() } function start(){ varStop = window.setInterval("displayTime()",1000) } function displayTime(){ var date = new Date(); date = date.toLocaleString() document.getElementById("text").innerHTML = date } function stop(){ window.clearInterval(varStop) } </script> </body>
<body> <input type="button" id="btn" value="删除"> <script> function del(){ var flag = window.confirm("亲,确认删除吗?") alert(flag) } window.onload = function(){ document.getElementById("btn").onclick = function(){ del() } } </script> </body>
后退:
window.history.back() window.history.go(-1)
网址:
window.location.href
// 窗口1 <body> <iframe src="窗口2.html" frameborder="0"></iframe> <script></script> </body>
// 窗口2 <body> <div> <input type="button" id="btn" value="将当前窗口设置为顶级窗口" onclick="setTop()"> </div> <script> function setTop() { if (window.top != window.self) { window.top.location = window.self.location } } </script> </body>
数据交换格式
<body> <script> window.eval("var i = 100") alert("i:"+i) </script> </body>
<body> <input type="button" value="显示" id="btn"> <h2>员工列表</h2> <hr> <table border="1px" width=50%> <tr> <th>员工编号</th> <th>员工名字</th> <th>员工薪资</th> </tr> <tbody id="tbody"> <!-- <tr> <td>7369</td> <td>SMITH</td> <td>800.00</td> </tr> <tr> <td>7369</td> <td>SMITH</td> <td>800.00</td> </tr> <tr> <td>7369</td> <td>SMITH</td> <td>800.00</td> </tr> --> </tbody> </table> 总共<span id="count">0</span>条数 <script> var data = { "total":4, "emps":[ {"empno":7369,"ename":"SMITH","sal":800.00}, {"empno":7370,"ename":"SMIH","sal":1800.00}, {"empno":7371,"ename":"SMTH","sal":2800.00}, {"empno":7332,"ename":"SITH","sal":3800.00} ] } document.getElementById("btn").onclick = function(){ var emps = data.emps; var html = "" for(var i=0;i<emps.length;i++){ var emp = emps[i] html += "<tr>" html += "<td>"+emp.empno+"</td>" html += "<td>"+emp.ename+"</td>" html += "<td>"+emp.sal+"</td>" html += "</tr>" document.getElementById("tbody").innerHTML = html } document.getElementById("count").innerHTML = data.total } </script> </body>