JavaScript-2

6,node

(1)节点名称,值和类型:

l  nodeName:其内容是给定节点的名字。

l  如果是元素节点,nodeName返回这个元素的名称。

l  如果是属性节点,nodeName返回这个属性的名称。

l  如果是文本节点,nodeName返回一个内容为#text 的字符串。

l  nodeType:返回一个整数,这个数值代表着给定节点的类型。

l  Node.ELEMENT_NODE          ---1    -- 元素节点

l  Node.ATTRIBUTE_NODE        ---2    -- 属性节点

l  Node.TEXT_NODE            ---3    -- 文本节点

l  nodeValue:返回给定节点的当前值(字符串)。

l  如果给定节点是一个属性节点,返回值是这个属性的值。

l  如果给定节点是一个文本节点,返回值是这个文本节点内容。

l  如果给定节点是一个元素节点,返回值是null。

(2)父节点,子节点,和同辈节点:

l  父节点: parentNode 和 parentElement(只支持IE)

l  parentNode 属性返回的节点永远是一个元素节点,因为只有元素节点才有可能包含子节点。

l  document 节点的没有父节点。

l  子节点

l  ChildNodes:获取指定节点的所有子节点集合。

l  firstChild:获取指定节点的第一个子节点。

l  lastChild:获取指定节点的最后一个子节点。

l  同辈节点

l  nextSibling: 返回一个给定节点的下一个兄弟节点。

l  previousSibling:返回一个给定节点的上一个兄弟节点。

(3)节点属性:

l  节点属性attributes是Node接口定义的属性。

l  节点属性attributes就是节点(特别是元素节点)的属性。

l  事实上,attributes中包含的是一个节点的所有属性的集合。

l  attributes.getNameItem()和Element对象的getAttribute()方法类似。

(4)检查子节点和属性:

l  查看是否存在子节点:hasChildNodes()

l  查看是否存在属性:hasAttributes()

l  即使节点中没有定义属性,其attributes属性仍然有效的,而且长度值为0。同样节点中的childNodes属性也是如此。

l  当你想知道某个节点是否包含子节点和属性时,可以使用hasChildNodes()和hasAttributes()方法。但是,如果还想知道该节点中包含多少子节点和属性的话,仍要使用attributes和childNodes属性。

l  在IE浏览器中,不存在hasAttributes()方法!

(5)操纵DOM节点树:

l  插入节点

l  appendChild()方法

l  insertBefore()方法,注意:没有insertAfter()方法

l  删除节点:removeChild()方法

l  替换节点:replaceChild()方法

(6)复制和移动节点:

l  复制节点:cloneNode(boolean)方法,其中,参数boolean是判断是否复制子节点。

l  移动节点:由以下三种方法组合完成

l  查找节点

l  getElementById():通过节点的id属性,查找对应节点。

l  getElementsByName():通过节点的name属性,查找对应节点。

l  getElementsByTagName():通过节点名称,查找对应节点。

l  插入节点

l  appendChild()方法

l  insertBefore()方法

l  替换节点:replaceChild()方法

(7)innerHTML属性:

l  浏览器几乎都支持该属性,但不是 DOM 标准的组成部分。

l  innerHTML 属性可以用来读,写某给定元素里的 HTML 内容。

l  innerHTML 属性多与div或span标签配合使用。

(8)XML DOM访问节点:

l  document属性指向 XML 文档的根元素。

l  通过getElementsByTagName()方法可以把指定节点下面的所有特定标记名称的列表返回。

l  如果使用childNodes属性来获取子节点集合时,一般通过item(index)方法,而不是通过数组下标来访问每一个子节点。

(9)XML DOM操作XML文档:

l  创建新节点

l  移动和修改节点

l  读写节点属性和读写数据

以上操作,XML DOM与HTMLDOM的操作完全一致。

l  保存文档

与HTML DOM不同,XMLDOM提供了save()方法将XML文档保存到指定的本地目录。不过,出于安全考虑的原因,一般浏览器禁止这么做。


示例:

//	要求获取id="city"下所有子节点的个数
//	//1 获取目标节点
//	var city = document.getElementById("city");
//				
//	//2 获取目标节点的所有子节点
//	var children = city.childNodes;	//childNodes:获取所有子节点的集合
//				
//	//3 打印数量
//	alert(children.length);
				
	//要求获取id="edu"下所有子节点的个数
//	var eduElement = document.getElementById("edu");
//	var options = eduElement.childNodes
//	alert(options.length);
				
/*
 * * 编写java代码时,只要语法正确,效果就正确
 * * 编写javascript代码时,语法正确时,效果不一定正确
 * 		* 在于浏览器如果解析
 * 		* 当编写javascript代码时
 * 			* 不仅要看语法是否正确
 * 			* 还要看浏览器如何解析
例如获取xml中某个元素的所有子节点时,IE浏览器会把换行符也算做一个子节点。
 */
					
	var eduElement = document.getElementById("edu");
	var options = eduElement.getElementsByTagName("option");
	alert(options.length);
				
	//在标签中查找标签时,只有getElementsByTagName()方法有效!


<body>
    <input type="text" id="username" value="itcast">
	<p>
		明天上课
	</p>
</body>
<script type="text/javascript">
  				//1 元素节点
//				var username = document.getElementById("username");
//				
//				alert(username.nodeName);		//input
//				alert(username.nodeType);		//1
//				alert(username.nodeValue);		//null
				
				//2 属性节点
//				var username = document.getElementById("username");
//				var attr = username.getAttributeNode("id");
//				
//				alert(attr.nodeName);		//id
//				alert(attr.nodeType);		//2
//				alert(attr.nodeValue);		//username
				
				//3 文本节点
				var pElement = document.getElementsByTagName("p")[0];
				
//				var text = pElement.childNodes[0];
//				var text = pElement.firstChild;
				var text = pElement.lastChild;
				
				alert(text.nodeName);		//#text
				alert(text.nodeType);		//3
				alert(text.nodeValue);		//明天上课
				
				/*
				 * nodeName、nodeType、nodeValue
				 * 	* nodeType:判断获取的是什么节点
				 * 	* nodeValue:获取文本节点的文本内容
				 * 	* nodeName:获取元素节点是什么标签
				 */
				
  </script>


<body>
    <button id="login">登录</button>
	<p>
		段落
	</p>
  </body>
  <script type="text/javascript">
  				//复制一个button按钮,追加到p上
				var button = document.getElementById("login");
				
				//cloneNode()方法,接收的Boolean类型的参数,是否复制子节点
				var copy = button.cloneNode(true);
				
				var pElement = document.getElementsByTagName("p")[0];
				
				pElement.appendChild(copy);
				
  </script>


<body>
    <div id="div"></div>
  </body>
  <script type="text/javascript">
  				//需要创建一个<h1>今天</h1>插入到div中
					//方法一
//					var h1Element = document.createElement("h1");
//					var text = document.createTextNode("今天");
//					h1Element.appendChild(text);
//					
//					var div = document.getElementById("div");
//					
//					div.appendChild(h1Element);
				
					//方法二
					document.getElementById("div").innerHTML = "<h1>今天</h1>";
					
					/*
					 * WEB1.0与WEB2.0:
					 * 	* WEB1.0:以内容为主(门户网站)
					 * 	* WEB2.0:以人的关系为主(社交网站)
					 * 	* WEB3.0:基于移动互联网的社交网站
					 */
				
  </script>

7,如何编写js文档

在MyEclipse或Eclipse中开发,通常单独写一个js文件,再通过在html或jsp文件中的<head>标签中引入js文档(通过src属性),来编写js文档,耦合度比较高,代码比较清晰。

例如:<script type="text/javascript"src="demo.js"></script>

/*

       * 在HTML页面中的任意位置都可以引入javascript脚本

       * * head中:一般情况,都是引入外部脚本文件

       * * body前:

       *     * 获取页面元素:不行

       *     * 定义函数:

       *         *并调用:

       *            *函数中包含获取页面元素内容:不行

       *            *函数中不包含获取页面元素内容:行

       *         *不调用:可以

       * * body后:都可以

       */

//IE和火狐图标:表示支持IE及其他浏览器。

8 ,ECMA入门:

//				1 区分大小写:与Java一样。
//				var hero;
//				var Hero;
				
				//2 变量是弱类型的:与Java不一样。
				//按照java编写习惯
				
				//java,定义变量时,类型就已经明确了
//				String str;
//				Int i;
				//javascript,定义变量时,初始化时,类型才明确
//				var str;
				
				//3 每行结尾的分号可有可无:与Java不一样。
				alert("xxx");
				
				//4 {}括号表明代码块:与Java一样

9,arguments对象

在函数中,可以通过arguments对象获取这个函数的参数数组,是个隐式的对象,在函数中可以直接调用。

例如:

function add(a,b){

    alert(arguments.length);    //直接通过arguments获取参数数组的长度,打印2

    returna+b;

}

应用:可以通过arguments模拟函数的重载:

在javascript中,如果按照类似java中的重载形式编写函数,则最后的函数会覆盖所有的前面的同名函数,无法达到函数重载的效果,可以利用arguments来模拟函数的重载。

Function add(){

    if(arguments.length== 1) {

    alert(arguments[0] + 5);

} else if(arguments.length== 2){

    alert(arguments[0] + arguments[1]);

}

}

add(10);//output 15

add(40,20);//output 60

 

 

10,变量的作用域

(1)全局变量:在函数外面定义的变量,在函数外和函数中都可以访问,如果函数中定义了同名变量,则函数中的变量将覆盖全局变量。

局部变量:在函数中定义的变量,函数外部不可以访问。

(2)注意:在一个函数中定义了一个变量(没有使用var),在该函数被调用之前,这个变量是不存在的,这个变量会在这个函数首次调用的时候被创建,并被赋予全局作用域。

function f(){

    local= 2;

}

alert(local); //local is undefined

f();  

alert(local); 2

(3)函数域始终优先于全局域,所以局部变量a会覆盖与他同名的全局变量。

var a = 1;

function f(){

    alert(a);     // a is undefined

    vara = 2;

    alert(a);     // 2

}

先定义了一个全局变量a,在函数f中首先打印a,但在这个函数中定义了局部变量a,覆盖了全局变量a,但这时局部变量a还没有初始化,所以第一次打印a is undefined,初始化为2以后,在打印,就可以打印出局部变量a的值2。注意,不管局部变量定义在函数的什么位置,只要定义了,在定义之前使用这个局部变量都会是undefined状态。

 

11,特殊函数:

(1)匿名函数:没有名字的函数。

例如:function() { return 2; }

用法:可以将匿名函数作为参数传递给其他函数。这样,接收方函数就能利用所传递的函数来完成某些事情。

可以定义某个匿名函数来执行某些一次性任务。

(2)回调函数:当将函数A传递给函数B,由B来执行A时,A就成了一个回调函数。如果A还是一个无名函数,就称之为匿名回调函数。例如:

function add(a,b){

    returna()+b();

}

var one = function(){return 1;}

var two = function(){return 2;}

//可以直接使用匿名函数来代替one和two ,作为目标函数的参数。

alert(function(){return1;},function(){return 2;})

l  回调函数的优点:

l  它可以在不做命名的情况下传递函数(这意味着可以节省全局变量)。

l  可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)。

l  回调函数也有助于提升性能。(重要)

(3)自调函数:定义函数以后自行调用。例如:

(

    function(name){

    alert(“js”);

}

)(“xiaoqiang”)  //传参数

第一对括号,放置的是一个匿名函数。

第二对括号,作用是立即调用上面定义的函数。

自调函数只需:将匿名函数定义放进一对括号中,然后外面在跟一对括号即可。

(4)内部函数/私有函数:

function a(param){

       functionb(input){

           returninput * 2;

       };

       return"The result is " + b(param);

    }

   

    alert(a(2));      //The result is 4

l  当调用全局函数a ( ) 时,本地函数b ( ) 也会在其内部被调用。由于b ( ) 是本地函数,它在a ( ) 以外的地方是不可见的,所以将b 称之为私有函数。

l  私有函数的优点:

l  有助于确保全局名字空间的纯净性(这意味着命名冲突的机会很小)。

l  私有性 —— 只将一些必要的函数暴露给“外面世界”,并保留属于自己的函数,使它们不为该应用程序的其他部分所用。

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值