对前天发表的[关于parentElement和parentNode属性的问题]的补充


[原创]

 
 
今天把火狐拿来重新调试了一下,前天发表的[关于parentElement和parentNode属性的问题]的代码,
 
发现用很多用不了,  因为 Firefox 会把无意义的空格和回车也算成一个文本节点。所以 Firefox 要实现的话必须先用 getElementsByTagName 得到某个 TagName 的所有节点。然后在节点数组里面选取就是了,这种方法在 IE 下面也是有效果的,浏览器内置支持的的 firstChild 和 lastChild 基本算是废了,没什么大用处了。

但是如果不知道要取得哪个 TagName 的话怎么办? 其实也很简单,直接遍历节点的 childNodes,然后判断 nodeType,如果是 1 表示是一个 HTML 节点,如果是 3 表示一个文本节点。

 

 (不知道啥时候这么浏览器才能统一啊, 各个浏览器的的竟争可把我们这些WEB开发人员寄害苦了)

 

下面还是放上段我今天做的一段代码:  兼容 火狐和IE   (提供一个兼容的方案吧!)

 

<!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>
    <title>无标题页</title>
    <script type="text/javascript" language="javascript">
       window.onload=initAll;
       function initAll()
       {
         document.getElementById("btnOk").onclick=showpp;
         return false;
       }
       function showpp(evt)
       {
         if(evt)
           {
              var haha=document.getElementById(evt.target.parentNode.id).childNodes;
              var hal=new Array();
              var len=haha.length;
              for(i=0;i<len;i++)
               {
                   if(haha[i].nodeType==1)
                      {
                       
                           hal.push(haha[i]);
                      }
               }
              
              alert(hal.length);
              for(i=0;i<hal.length;i++)
               {
                  alert(hal[i].id);
               }
              //for(i=1;i<len;i++)
                //{
                 // alert(haha[i].nodeType);
               // }
           }
           else
           {
               var haha=document.getElementById(event.srcElement.parentNode.id);
               var len=haha.childNodes.length;
               for(i=0;i<len;i++)
               {
                alert(haha.childNodes[i].tagName);
               }
           }
       }
    </script>
</head>
<body id="body1">
<div id="div3">11111
<div id="div1">22222</div>
<div id="div2">333333</div>
<input type="button" value="点击看看" id="btnOk" />444444444
</div>
</body>
</html>

 

 

***

1. 在这里如果if(evt) 相当于 if(evt!=0)  呵呵!这几天在C语言里学到的.

if(evt) 表示如果evt 存在(则为火狐浏览器),那么执行相应的代码.
    否则(为IE浏览器)执行另外一段代码, 这样就很好的兼容了两种浏览器.

 

2. 还有一点要补充的是火狐不支持parentElement属性,因为那天用的是IE,所以没测出 parentElement和parentNode的区别,   所以以后要统一使用parentNode属性.

 

3. 补充一点数组的知识.

 

Array 对象

提供对创建任何数据类型的数组的支持。

arrayObj = new Array()
arrayObj = new Array([size])

arrayObj = new Array([element0[, element1[, ...[, elementN]]]])

参数

arrayObj

必选项。要赋值为 Array 对象的变量名。

size

可选项。可选项数组的大小。由于数组的下标是从零开始,创建的元素的下标将从零到 size -1。

element0,...,elementN

可选项。要放到数组中的元素。这将创建具有 n + 1 个元素的长度为 n + 1 的数组。使用该语法时必须有一个以上元素。

说明

创建数组后,能够用 [ ] 符号访问数组单个元素,例如:

var my_array = new Array();
for (i = 0; i < 10; i++)
   {
   my_array[i] = i;
   }
x = my_array[4];

由于 Microsoft JScript 中的数组的下标是从零开始的,前面例子中最后一条语句访问数组的第五个元素。该元素中保存的值是 4。

如果只向 Array 的构造函数传递了一个参数,而该参数是数字,则它必须是无符号32位整数(大约40亿)。该值成为数组的大小。如果该值为数值,但小于0或不为整数,发生运行时错误。

如果传递给 Array 构造函数的是单个值并且不是数值,设置 length 属性为1,而且唯一的元素值成为单个的传入的参数。

请注意 JScript 数组为解析数组,也就是尽管可以分配多个元素给一个数组,但实际上只有包含数据的元素才存在。这减少了数组使用的内存数量。

   

push 方法

将新元素添加到一个数组中,并返回数组的新长度值。

arrayObj.push([item1 [item2 [. . . [itemN ]]]])

参数

arrayObj

必选项。一个 Array 对象。

item, item2,. . . itemN

可选项。该 Array 的新元素。

说明

push 方法将以新元素出现的顺序添加这些元素。如果参数之一为数组,那么该数组将作为单个元素添加到数组中。如果要合并两个或多个数组中的元素,请使用 concat 方法。

 

 

posted on 2008-05-07 11:10  鱼跃于渊  阅读(424)  评论(0编辑  收藏  举报

导航