[js]remove whitespace for firefox

IE和FF的whitespace处理是不一样的,IE会忽略dom中的whitespace,而ff不会,所以以下代码在IE和FF下执行效果是不一样的:


 1 < div  id ="container" >
 2      < div  id ="main" >
 3          < div  id ="sub1" >
 4             hello sub 1.
 5          </ div >
 6          < div  id ="sub2" >
 7             hello sub 2.
 8          </ div >
 9      </ div >
10 </ div >
11 ExpandedBlockStart.gifContractedBlock.gif < script  type ="text/javascript" >
12ExpandedSubBlockStart.gifContractedSubBlock.gif    function test(){
13        alert( $('container').firstChild.firstChild.nextSibling.id );
14    }

15    test();
16
</ script >


为了使两个浏览器运行效果一样,要把所有dom中的whitespace节点去掉,可以这样写:

 

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
 2*
 3*remove whitespace for the dom, so that document.documentElement.firstChild.nextSibling.firstChild can work. 
 4*
 5*/

 6 ExpandedBlockStart.gifContractedBlock.gif_rdc.cleanWhitespace  =   function ( element )  {
 7    // If no element is provided, do the whole HTML document
 8    element = element || document;
 9    
10ExpandedSubBlockStart.gifContractedSubBlock.gif    for (var i = 0; i < element.childNodes.length; i++{
11        var node = element.childNodes[i];
12        if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
13            element.removeChild(node);
14    }

15    
16    for (var i = 0; i < element.childNodes.length; i++)
17        _rdc.cleanWhitespace( element.childNodes[i] );
18}

 

 然后,在dom trace之前调用一下,递归地把document下面所有whitespace去掉:

 1 < div  id ="container" >
 2      < div  id ="main" >
 3          < div  id ="sub1" >
 4             hello sub 1.
 5          </ div >
 6          < div  id ="sub2" >
 7             hello sub 2.
 8          </ div >
 9      </ div >
10 </ div >
11 ExpandedBlockStart.gifContractedBlock.gif < script  type ="text/javascript" >
12ExpandedSubBlockStart.gifContractedSubBlock.gif    function test(){
13        _rdc.cleanWhitespace();
14        alert( $('container').firstChild.firstChild.nextSibling.id );
15    }

16    test();
17
</ script >

 

 

 两个浏览器执行的效果就一样了。

 

 更新:

此方法可能效率会低一点,因为要遍历所有dom节点。所以建议写类似几个方法:

 

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
 2    *
 3    * get the previous element ignore whitespace
 4    *
 5    */

 6 ExpandedBlockStart.gifContractedBlock.gif    _rdc.prev  =   function ( elem )  {
 7ExpandedSubBlockStart.gifContractedSubBlock.gif        do {
 8            elem = elem.previousSibling;
 9        }
 while ( elem && elem.nodeType != 1 );
10        
11        return elem;
12    }

13
14 ExpandedBlockStart.gifContractedBlock.gif     /**/ /*
15    *
16    * get the next element ignore whitespace
17    *
18    */

19 ExpandedBlockStart.gifContractedBlock.gif    _rdc.next  =   function ( elem )  {
20ExpandedSubBlockStart.gifContractedSubBlock.gif        do {
21            elem = elem.nextSibling;
22        }
 while ( elem && elem.nodeType != 1 );
23        
24        return elem;
25    }

26
27 ExpandedBlockStart.gifContractedBlock.gif     /**/ /*
28    *
29    * get the first child element ignore whitespace
30    *
31    */
    
32 ExpandedBlockStart.gifContractedBlock.gif    _rdc.first  =   function ( elem )  {
33        elem = elem.firstChild;
34        return elem && elem.nodeType != 1 ? _rdc.next ( elem ) : elem;
35    }

36     
37 ExpandedBlockStart.gifContractedBlock.gif     /**/ /*
38    *
39    * get the last child element ignore whitespace
40    *
41    */
    
42 ExpandedBlockStart.gifContractedBlock.gif    _rdc.last  =   function ( elem )  {
43        elem = elem.lastChild;
44        return elem && elem.nodeType != 1 ? _rdc.prev ( elem ) : elem;
45    }

46
47 ExpandedBlockStart.gifContractedBlock.gif     /**/ /*
48    *
49    * get the parent element ignore whitespace
50    *
51    */
    
52 ExpandedBlockStart.gifContractedBlock.gif    _rdc.parent  =   function ( elem, num )  {
53        num = num || 1;
54        for ( var i = 0; i < num; i++ )
55            if ( elem != null ) 
56                elem = elem.parentNode;
57        return elem;
58    }

 

 使用方法:

1 alert( _rdc.next( _rdc.first( _rdc.first(  $( ' container ' ) ) ) ).id );


 

转载于:https://www.cnblogs.com/jinweijie/archive/2008/12/15/1355480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值