*书籍:
JavaScript高级编程设计
JavaScript语法精辟
FunctionJavaScript
周爱民-JavaScript
JavaScript模式
*JavaSript前身LiveScript由Netscape公司开发。
JavaScript本身与Java无直接关系。
*当到了高级的时候看高手的开源代码学习最快。
编程在精,贪多嚼不烂。
*只要是Web开发都是请求和响应。
JavaScript代码可以在浏览器进行简单计算,避免频繁访问服务器(TCP三次握手协议)的耗费流量和时间。
HTML只是描述网页长相的标记语言,没有计算和判断能力,如果所有计算、判断(比如文本框是否为空,判断两次密码是否一致)都放在服务器端执行的话,网页会非常慢,服务器压力会很大,因此要求能在浏览器执行一些简单的运算和判断。JavaScript就是一种在浏览器端执行的脚本语言。
*JavaScript组成:核心语法(ECMAScript)、Dom(文档对象模型)、Bom(浏览器对象模型)。Bom没有标准,易不兼容,慎重使用。
*JavaScript是一种脚本语言,由所使用的浏览器来执行。
*脚本,一条条的文字命令。执行时由系统的一个解释器将其一条条的翻译成机械可识别的命令,然后执行。常见的脚本:批处理脚本、T-SQL脚本、VBSCript等。(.net生成的EXE文件用记事本打开看不懂)
*JavaScript是解析型语言,无需编译,直接执行。不像C#或java需要先将源代码编译后才能运行。
描述:
*js是基于对象和事件的脚本语言,主要应用在客户端,由浏览来执行js代码。
*可以与用户执行信息交互。
*安全性,不允许访问本地磁盘。
*跨平台,只要是支持js的浏览器即可。
*js也是一门编程语言,所以也具有编程语言的基本特征,如:数据类型、变量、语句、函数、数组、对象等,但是表现实现和C#不同。
*js也是C系语言,所以语法与C、java、C#非常类似。
开发环境:
*记事本,没有语法着色、没有良好的缩进、行号,不方便。但用VS准确和快一些。
*高级记事本:editplus、ultraedit、notepad++
*VS中直接写在html文件里。
*js代码必须写在js标签里,如
<script type="text/javascipt">
alert('hello')/*警告信息:hello*/
alert(new Date().toLocateTimeString());//显示当前时间
</script>
*整个网页代码从上到下依次执行,上面没执行下面不会执行。
*在<script>块中有一处语法出错,本块整体不执行,直接跳过,不会影响其他部分。
*提取js代码到单独的js文件:右键添加建项-JScript文件-
*如果要使用js文件,直接将单独js文件拖拽到目标文件。
语法介绍:
*严格区分大小写。(n和N是两个不同的变量)
*js中定义字符串可以使用双引号也可以使用单引号。
推荐js中使用单引号,html中使用双引号,避免发生冲突。
*在js中声明变量不需要写数据类型,统一用var来声明。
*JavaScript是“弱类型”语言,支持动态类型。var n=10;n="a";
*每条语句后面用;结尾。(不是必须浏览器有自动插入分号的机制)
原因:1可以放心的做js压缩多余空白。2提高代码的可读性、性能(省去编译器加分号步骤)、避免出错。
*js注释
单行注释://这里是注释代码【建议对于代码推荐都用单行注释】
块级注释:/*这里是注释代码*/【建议对于说明性文字使用块级注释】
*变量命名规则:以字母、下划线或$(英文模式下)开头,中间可以包含数字、字母、下划线或$.
*js是灵活的动态语言不想C#静态语言那样严谨。智能提示只能辅助,并不全面,不要因为"点不出来"而烦恼。
数据类型
*js共六种数据类型:
Boolean(布尔),取值:只有两种true或false
Number(数字),取值:所有数字,包含整数、小数等,范围相当于double
String(字符串),取值:所有字符串。
Undefined(未定义),取值:只有一个值underfined
Null(空对象),取值:只有一个值null
Object(对象类型),取值:任何对象、Array、function等等。
以上除了Object是引用类型以外,其他都是基本类型。
typeof运算符,该运算符返回一个表达式的数据类型的字符串表示形式。
<script type="text/javascript">
var n= new Date();
alert(typeof (n));
var n='hi ';
alert(typeof (n));
</script>
循环语句
if-else、while、do-while、for、switch、continue、break语句几乎和C#一致。但是for循环和switch语句也有点不同。
var sum=0;//变量声明后,使用前一定要赋,不赋值会认为是Undefined。
//var sum;
//sum=0;
for(var i=1;i<=100;i++){
sum=sum+i;
}
alert(sum);
奇数和、偶数和
var sum=0;
for(var i=1;i<=100;i++){
if(i%2=0)
{ sum1=sum+i}
else
{ sum2=sum+i}
}
alert("奇数和={0},偶数和={1}",sum1,sum2)
js中的==与===
*相等运算符:==、(!=)
对于==两边的表达式,如果类型相同,则直接比较。
对于==两边的表达式,如果类型不同,则先试图将==两边的运算符转换为String、Boolean、Number这些相同的数据类型,然后在判断是否相等。
==认为null与undefined、null与null、undefined与undefined是相等的。
*完全相等运算符(恒等运算符):===、(!==)
====运算符判断前不进行类型转换,并且===两边必须类型相同、值也相同的情况下才返回true。
<script type="text/javascript">
var n1='123';
var n2=123;
alert(n1==n2);//true
alert(n1==n2);//false
var n1=null;
var n2;
alert(n1==n2);//true
alert(n1===n2);//false
var n1=true;
var n2='false';
alert(n1==n2);//false
alert(n1===n2);//false
//switch内部使用的也是===恒等于来判断是否相等。
var s=123;
switch(s){
case'123':
alert('等于字符串123');
case 123:
alert('等于数字123');
default:
alert('没有找到相等的');
break;
}
</script>
W3C资料:Ecma-262
1如果==两边都是字符串类型,那么必须这两个字符串完全相同才返回ture
2如果==两边的两个变量指向了同一个对象,那么也返回true
3如果==两边一个是字符串一个是数字类型,那么js引擎会尝试把其中的字符串类型转换为数字类型后在进行比较。
4如果==两边一个字符串类型,一个是数字类型,会尝试吧其中布尔类型转换为数字类型后在比较。
5如果==两边其中一是string或number类型,而另外一个是object类型,那么判断相等前先将object转化为string或number,然后在于另一个值比较。
null和undefined
*当声明变量未赋值的时候,那么变量的值 就是undefined
var x;
alert(x);
*变量压根没有声明。
alert(w);//报错
在使用变量前,先校验该变量是否可用。
if(typeof(w)=='undefined'){
alert('变量不可用');
}else{
alert(w);
}
*方法没有返回值的时候,接受的返回值就是undefined类型
var n=fun1();
alert(n);
functon fun1(){
}
*---------null----------
*null值表示指定了一个空对象,需要我们为n赋值一个null值。
一般爱对象使用完毕,需要显示告诉浏览器可以被垃圾回收站回收的情况下,需要显示吧变量赋值为null,这样这个变量所指向的对象就可以被垃圾回收站回收了。var n=null;
*无论变量的值为null还是nudefined都表示变量不可用。所以在使用变量前可以先判断变量是否可用。
var x;
//var x;
//var x='';
//var x=null;
if(typeof(x)!='undefined'&&x!=null){
alert('x变量可用!');
}else{
alert('x变量不可用!');
}
js中变量作用域
<head>
<title></title>
<script type="text/javascript">
//在页面声明的变量,在整个页面中任何一个地方都可以访问。
// var n = 10;
// alert(n);//10
// var x = 100;
// function f1() {
// x++;
// alert(x);//101
// }
// f1();
// alert(x);//101
// var y = 100;
// function f1(){
// var x = 1;
// x++;
// alert(x); //2
// }
// f1();
// alert(x); //报错,未定义。(实际:360浏览器并没有报错,只是没有任何显示)
// function f1() {
// 在js中不存在块级作用域范围,所以在方法累不任何一个地方声明变量,都是在整个方法内部有效。
// var x = 10;
// if (x > 5) {
// var y = 100;
// alert(y);//100
// }
// alert(y);//100
// }
// f1();
// alert(y); //无显示
// function f1() {
// var sum=0;
// for (var i = 0; i < 10; i++) {
// sum=sum+i;
// }
// alert(i);//10
// for (var i = 0; i < 5; i++) {
// //当重复声明变量(i)时,js会自动忽略第一次以后的所有声明语句,但是赋值会正常执行。
// alert(i);
// }
// alert(i);//5//i++后i变成了5
// }
// f1();
function f1() {
//声明变量时不写var关键字,表示该变量时一个整个页面都能访问的全局变量。
//建议:声明变量时,一定不要忘记加var,避免使用全局变量。
x = 100;
x++;
alert(x);//101
}
f1();
alert(x);//101
</script>
</head>
<body>
<!-- <script type="text/javascript">
//在页面声明的变量,在整个页面中任何一个地方都可以访问。
n++;
alert(n); //11
</script>-->
</body>
</html>
转义符和C#中一样
注意:js不能用@,@只在C#中有效。想在页面输出:c:\windows\microsoft\vs.txt,需要这样写:alert('c:\\windows\\microsoft\\vs.txt').
innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容;
如:<div id="aa">这是内容</div> ,我们可以通过 document.getElementById('aa').innerHTML 来获取id为aa的对象的内嵌内容;
也可以对某对象插入内容,如 document.getElementById('abc').innerHTML='这是被插入的内容'; 这样就能向id为abc的对象插入(还是替换?)内容
<head>
<title></title>
<script type="text/javascript">
数据类型转换
//字符串转换为数字类型
// var n = '123';
// alert(n + 1); //1231
// var n='2pew3';//2
//var n='e2343';//NaN
// var n = '123dfjafda';
// alert(typeof (n));//string 显示该数据的数据类型
// n = parseInt(n);//将字符串转换为整数的函数,当他遇到非字符时停止解析。
// alert(typeof (n));//number
// alert(n + 2);//125
// var n = '15';
// //把15转为8进制
// n = parseInt(n, 8);
// alert(n); //13
//--------------
// alert(parseInt('828.3'));//828
// alert(parseFloat('232.3.4.4')); //232.3
// alert(parseInt('0782')); //782
// alert(parseInt(0782)); //782
// //---------把任意类型转换为数字类型
// var n = '123.3';
// alert(Number(n));
// var n = 123;
// n.toString(); //把任何类型转换为string类型
// alert(n);
// alert(typeof (n)); //number?????
// var n = null;
// alert(n.toString()); //null对象不能调用任何方法
// alert(String(n)); //字符型的"null"
// var s4;
// alert(s4); //undefined
//isNaN()函数
// var n = parseInt('a432v');
// //判断一个值是否是一个NaN不能用==或!=,必须使用isNaN()函数。
// if (isNaN(n)) {
// alert('转换失败!');
// } else {
// alert('转换成功结果是:'+n);
// }
js中的逻辑运算符
//eval() 函数
// var n = 'var x=1;x++;alert(x);';
// eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。; //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
// x++;
// alert(x);
// var r = "a" || "";
// alert(r); //a
// r = null || 15;
// alert(r);//15
// r = null && 15;
// alert(r);//null
// r = "123" || 12;
// alert(r);//123
// r = "1234" && 12;
// alert(r);//12(同时为真,以最后一个为准)
在浏览器中调试错误
// aletr('hello'); //浏览器-工具-开发人员工具-console(控制台)
// for (var i = 0; i < 10; i++) {
// alert(i);
// }
// var arr = [1,2,3,'hello,true'];
var sum=0;
for (var i = 0; i < 5; i++) {
sum=sum+i;
}
alert(sum);
//调试问题:
//1、没有刷新页面;
//2、浏览器安装了各种插件影响了调试结果。
//卸载插件-IE浏览器Internet选项-删除信息-高级-还原高级设置-重置-应用-重启IE。
//3、浏览器禁用了javascript.
//4、IE和vs调试功能同时只能用一个。
//5、火狐浏览器-f12-控制台,有错不报的原因是没有安装插件,需要添加Firebug组件。
//函数的定义:
// 1.在C#中创建函数
// public string GetMessage(int id)
// {
// }
// 2、在js中创建函数
// //定义一个函数
// function getMessage(id){
// return id+'Hello';
// }
// //调用函数
// var msg = getMessage('0001');
// //输出返回结果
// alert(msg);
//定义一个函数
// function sayHi(){
// alert('Hi');
// }
// //调用一个函数
// sayHi();
// //定义一个函数
// function getSum(x, y) {
// return x + y;
// }
// var result = getSum(50, 20);
// alert(result);
//
// 注意:1、js函数永远有返回值,如果没有则返回undefined。
// 把函数当做’构造函数‘时,return语句将不返回。
// 2、自定义函数名不要与js内置、dom内置函数重名。
// function f1() {
// alert('first f1');
// }
// function f1(name) {
// alert(name);
// }
// f1();
//因为js中没有函数重载的概念,所以遇到同名的函数,会用最后一次定义覆盖前面的函数定义。
//所以下面调用f1()函数,其实调用的是最后一次函数定义,但最后一次函数定义需要传递一个参数
//给name变量,但是却没有传递,所以name变量没有赋值,所以就是undefined
//函数和变量的预解析功能
// 1、如果不确定函数中将来要传递的参数的个数,那么可以使用了类似于C#中可变
// 参数的解决方法。在js中叫做arguement对象。
// 2、其实所有的方法都无需定义形参,定义形参的目的仅仅是为了使用方便。
// 无论是否定义了“形参”,在实际调用该函数的时候,所有的参数都包含了arguement对象中。
// function add() {
// var sum = 0;
// for (var i = 0; i < arguments.length; i++) {
// sum += arguments[i];
// }
// return sum;
//
// }
// //add(10,20);
// //add(1);
// //add(x1,x2,x3,...xn);
// var result = add(10, 23, 0, 12);
// alert(result);
//
// var x = 1, y = 0, z = 0;
// function add(n) { n = n + 1; return n }
// y = add(x);
// function add(n) { n = n + 3; return n }
// z = add(x);
// alert(y + '....' + z); //结果是多少?why?4...4
//因为函数有预解析功能,所以函数从上到下依次执行之前,最后一个定义add
//函数就已经覆盖了前面的定义的add函数。但是预解析无法解析函数体里面的东西。
// var user_name = 'steve';
// function f1() {
// alert(user_name); //undefined
变量与函数具有同样的预解析功能,在函数的代码正式执行之前,先会
解析函数中声明的多有的变量。也就是说正执行第一句代码: alert(user_name); 的时候,
局部变量user_name已经声明了,但是没有赋值(为yzk)。因为预解析只解析声明,不包含赋值语句(所以是underfined)。
// var user_name = 'yzk';
// alert(user_name); //yzk
// //如果遇到局部变量与全局变量冲突,优先选用局部变量。
// }
// f1();
// alert(user_name); //steve
// //1、函数内部声明的变量作用域只在这个函数内,超过作用域则失效。
// //2、函数内部声明的变量在整个函数中都有效,相当于在函数内部(的函数和声明)也有预解析功能,只不过不能超出作用域。。
// 正是因为函数中具有变量预解析功能,所以一般函数中声明变量不会像下面这样:
// function myfunction(){
// var n=10;
// alert(n);
// var m=n++;
// alert(m);
// var sum=n+m;
// alert(sum);
// }
// 而是在函数一看是就把所有要使用的变量都统一声明好:
// function myfuncton(){
// var n=10,m,sum;
// alert(n);//10
// m=n++;
// alert(m);//10 ???
// sum = n + m;
// alert(n);//11 ???
// alert(sum);//21
// }
// myfuncton();
// //alert(n);//错误,超出局部变量作用域。
//匿名函数
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
*document.getElementById('btn').click()搜索引擎的智能提示,点击后相当于点击了"搜索"按钮
*click();focus();blur();相当于通过程序来触发元素的单击事件,获得焦点以及失去焦点的事件。
*form对象是表单中的Dom对象。
*submit()提交表单,但是不会触发onsubmit事件。
*实现autopost,也就是焦点离开控件以后页面立即提交,而不需要提交submit按钮,当光标离开的时候
触发onblur事件,在onblur中调用form的submit方法。
*在待机submit后form的onsubmit事件比触发,在onsubmit中可以进行数据校验。如果数据有问题,返回false即可取消提交。
<title></title>
<style type="text/css">
#dv1
{
width:100px;
height:100px;
background-color:Blue;
}
</style>
<script type="text/javascript">
window.onload = function () {
//为div层注册一个单击事件
document.getElementById('dv1').onclick = function () {
//单击层的时候提交表单
//1.手动获取提交表单的按钮,并且调用该按钮的click()方法,触发该按钮的单击事件,从而实现表单的提交
// document.getElementById('btnSearch').click();
//2.直接调用表单对象的submit()方法来实现提交
document.getElementById('form1').submit();
//如果是通过调用submit按钮来提交的表单,会触发onsubmit事件,但是如果是通过调用的表单的submit()函数提交的表单不会触发事件的。
};
//为表单对象注册一个提交事件
document.getElementById('form1').onsubmit = function() {
//在表单的提交事件中验证用户是否在文本框中输入了内容,如果输入了内容则提交表单,否则停止提交表单
var searchTxt =document.getElementsByName('wd')[0].value;
if (searchTxt.length == 0) {
alert('请输入内容!');
return false;
}
};
};
</script>
</head>
<body>
<form action="http://www.baidu.com/s" method="get" id="form1">
<input type="text" name="wd" value="" />
<input type="submit" value="百度很强大哦" id="btnSearch"/>
<div id="dv1">
</div>
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<ul id="myList"><li>Coffee</li><li>Tea</li></ul>
<p id="demo">请点击按钮向列表中添加项目。</p>
<button οnclick="myFunction()">亲自试一试</button>
<script>
function myFunction()
{
var node=document.createElement("LI");
var textnode=document.createTextNode("hi");
node.appendChild(textnode);
document.getElementById("myList").appendChild(node);
}
</script>
<p><b>注释:</b>首先创建 LI 节点,然后创建文本节点,然后把这个文本节点追加到 LI 节点。最后把 LI 节点添加到列表中。</p>
</body>
</html>