`
ricoyu
  • 浏览: 10217 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Firefox中的nextSibling

阅读更多
在Firefox中, link2的nextSibling并不是link3, 因为两者之间有一个换行符, 这被认为是一个空格, 所以link2的nextSibling就是这个空格, 即一个text node, IE不存在这个问题。
<a href="link2" id="link2"></a>
<a href="link3" id="link3"></a>
分享到:
评论
10 楼 cxy_lucky 2012-05-23  
借花献佛一下
如果用jQuery的话,也可以扩展
$.fn.extend({
  nextone: function()	{
   	 var elem = this;
   	 var v = elem[0];
	do {
		v = v.nextSibling;
		alert(v);
		} while (v && v.nodeType != 1)
	return $(v);
  }
}
)

9 楼 cxy_lucky 2012-05-23  
用到了,看了一下,博主很逗啊,给出的方法我觉得没问题,赞一个!
8 楼 ricoyu 2011-04-01  
引用
而<a>元素后的Node明显是一个TextNode,其nodeValue是'\n'

我觉得一点都不明显啊! 
好了, 跟你争论IE的这种行为到底是不是bug是没有意义的, 有意义的是如何去处理这个客观存在的问题,
一般人使用nextSibling是不会期望去得到一个换行符的, 所以新版的DOM标准提供了nextElementSibling来跳过
这些空白符和文本节点.
还有, 你的解决方案是.nextElementSibling||.nextSibling,
也就是说你准备通过判断对象的存在性来决定用nextElementSibling或nextSibling, 不过你注意哦,这些新的DOM标准只存在于element node中, 文本节点和注释节点是不支持该属性的. 因为你没有给出demo,
那我就斗胆猜测一下你可能的做法:
//这个function是要取node的下一个兄弟元素节点
function next(node){
  if(node.nextElementSibling){
    return node.nextElementSibling;
  }else{
    return node.nextSibling;
  }
}

好了, 这个函数正确处理了以下场景,即给你link2, 可以得到下一个element节点link3
<a href="link2" id="link2"></a>
<a href="link3" id="link3"></a>
测试代码:
<html>
<head>
<title>W3C DOM tests - childNodes and nextSibling</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
test result:
<div id='display'></div>
<a href="link2" id="link2"></a>
<a href="link3" id="link3"></a>
<script type="text/javascript" >
var display = document.getElementById('display');
function dwr(s){
	display.innerHTML+=s+'<br/>';
}
var link2 = document.getElementById('link2');

function next(node){
  if(node.nextElementSibling){
    return node.nextElementSibling;
  }else{
    return node.nextSibling;
  }
}

var nextEleSibling = next(link2);
dwr('node name: '+nextEleSibling.nodeName +', node value: '+nextEleSibling.nodeValue);

</script>
</body>
</html>

不过, 麻烦的来了, 如果传给这个函数的是一个文本节点, 并且该文本节点的下一个节点是一个注释节点, 如下:
<a href="link2" id="link2"></a>s
<!--This is a comment. Comments are not displayed in the browser-->
<a href="link3" id="link3"></a>
传s这个文本节点给next()
next(link2.nextSibling), 看看你将得到什么?
别说我举的例子很极端, js编程什么情况都有. 有人就是喜欢传一个文本节点给这个函数,咬我啊?
或许你会说:"我才不会写这么撮的next()函数呢!"
那么, 请给出你的方案吧! 估计你还是得判断nodeType, 还是会采用循环.

纯技术讨论, 欢迎指出我的错误!
7 楼 int08h 2011-04-01  
DOM标准明确说了nextSibling返回当前元素的下一个Node,而<a>元素后的Node明显是一个TextNode,其nodeValue是'\n',而IE竟然没有返回一个TextNode,跳过了一个Node,这个如果不称之为BUG的话,还能说是啥……

不要拿IE6很老,当时的标准不全为理由,MSDN上对nextSibling的解释就是"Retrieves a reference to the next child of the parent for the object."。而IE很明显的,直接把\n为nodeValue的TextNode从DOM树中除掉了

nextSibling的问题并不是IE对这个属性的理解有问题,而是涉及到IE对整个DOM树的解析和构建上的问题,这个我还是使认为应该称之为BUG,或者说,不按标准的,我认为就能说是BUG,好比要是IE的Math.pow(2, 2)返回了9,你也会认为这只是对标准的支持程度不同吗?
6 楼 ricoyu 2011-03-31  
int08h 写道
.nextElementSibling || .nextSibling
这是IE的BUG

这不能说是IE的BUG, 只能说IE跟其他浏览器的实现有所不同, IE6不支持XMLHttpRequest对象你能说这是他的bug吗?
IE通过attachEvent而不是标准的addEventListener来添加事件处理器, 这能说它是一个bug吗?
nextElementSibling
firstElementChild
lastElementChild
childElementCount
children
previousElementSibling
最新的浏览器确实已经已经支持如上的DOM标准, IE直到8还是不支持.
你的这种写法不错, 但是对于较老的非IE浏览器, 它就有问题了, 至少Firefox在3.5版本以前还不支持这些新的DOM标准.
而我提供的这个例子就没有问题.
5 楼 ricoyu 2011-03-31  
暴走的酱油瓶 写道
避免这个问题,你可以先find("a")得到一个集合,在集合里遍历,或者判断下个节点的类型。有时浏览器会自动补节点,你那种作法风险很大。

find("a")?这是什么函数? jQuery? 这里只跟大家讨论原生的JavaScript.
我这种做法风险很大? 你指什么? 什么情况下会导致错误?

这个例子很好的解决了这个问题:
function next( elem ) {
  do {
    elem = elem.nextSibling;
  } while ( elem && elem.nodeType != 1 );
    return elem;
}
4 楼 int08h 2011-03-31  
.nextElementSibling || .nextSibling
这是IE的BUG
3 楼 暴走的酱油瓶 2011-03-31  
避免这个问题,你可以先find("a")得到一个集合,在集合里遍历,或者判断下个节点的类型。有时浏览器会自动补节点,你那种作法风险很大。
2 楼 pywepe 2011-03-31  
IE不是标准
1 楼 gwj41 2011-03-31  
这个问题差点导致一个BUG,还好我两个浏览器都测了一下

相关推荐

    javascript中的nextSibling使用陷(da)阱(keng)

    具体来说,在IE浏览器中使用`nextSibling`属性时,它并不会返回元素节点(element nodes)之后的空白文本节点(text nodes),而在如Chrome和Firefox这样的现代浏览器中,`nextSibling`会返回包括空白文本节点在内的...

    js nextSibling属性和previousSibling属性概述及使用注意

    但在Firefox和Safari中,可能需要`nextSibling.nextSibling`来获取实际的`e`元素。 2. `previousSibling`属性 `previousSibling`属性则与`nextSibling`相反,它返回当前节点的前一个同级节点。如果当前节点前面...

    javascript中的previousSibling和nextSibling的正确用法

    但在Firefox中,同一个操作可能会返回一个空白文本节点,然后再是元素节点,这时你可能需要再次调用nextSibling来获取到元素节点。 为了跨浏览器兼容地正确使用nextSibling和previousSibling,你需要根据nodeType...

    javascript DOM 操作.doc

    FireFox 中遍历 DOM 文档:在FireFox中,可以使用与IE中通用的方法来遍历DOM文档。 FireFox 中处理错误:在FireFox中,可以使用parseError对象来输出错误信息,该对象会替换出错的xml文档。 ```javascript if...

    FF火狐下获取一个元素同类型的相邻元素实现代码

    它们在Firefox下可以很好地工作,但请注意,在其他浏览器如Chrome、Safari或IE中,可能需要额外的兼容性处理,因为不同浏览器对DOM API的实现可能存在差异。 总结来说,获取元素同类型的相邻元素在JavaScript中可以...

    js操作XML文件(兼容FF,IE)

    本文将详细探讨如何在JavaScript中操作XML文件,并确保代码在Firefox和IE之间具有良好的兼容性。 1. **创建XML对象**: 在JavaScript中,可以使用`ActiveXObject`(仅适用于IE)或`DOMParser`(通用方法)来创建...

    浅析JavaScript中扫瞄器的兼容问题_.docx

    它是大部分现代浏览器(包括Firefox的新版本)所支持的。 - 兼容性处理:为了在所有浏览器中都能正常工作,可以使用条件语句进行检测,优先尝试`textContent`,如果不存在再使用`innerText`。 ```javascript if ...

    JavaScript获取HTML DOM节点元素的方法的总结

    4. `parentObj.children`:在IE7中与`childNodes`类似,但在Firefox中不受支持,因为它只返回直接的元素子节点。 5. `parentObj.getElementsByTagName(tagName)`:与全局的`document.getElementsByTagName()`类似,...

    最简单的图片轮播代码(修改版)

    在此项目中,开发者已经针对Firefox和IE9浏览器进行了适配,确保在这些浏览器上能正常运行。 【描述】提到的问题在于代码的兼容性。由于不同的浏览器对JavaScript API的支持程度不同,特别是在老版本的Internet ...

    javascript获取网页中指定节点的父节点、子节点的方法小结.docx

    - **特点**: 在不同浏览器中的实现略有差异,如IE7返回的是直接子节点的数组,而在Firefox中则返回包含所有子节点的数组。 - **示例代码**: ```javascript const allChildren = parentObj.childNodes; for (const...

    浅析JavaScript中浏览器的兼容问题

    innerText在IE8之前的浏览器中得到支持,而innerHTML在老版本的Firefox中得到支持。新版本的浏览器则同时支持这两种方式。为了确保跨浏览器兼容性,可以使用以下代码进行能力检测,选择合适的方法来获取或设置文本...

    DOM的基本方法.txt

    Firefox提供了`swapNode()`方法来交换两个节点的位置。但在其他浏览器中可能不支持,可以使用以下通用方法实现: **示例**: ```javascript function swapNode(node1, node2) { const parent = node1.parentNode; ...

    前端笔试面试题目总结.docx

    3. **浏览器兼容性问题**: 在编写JavaScript代码时,开发者需要注意不同浏览器(如IE、Firefox、Chrome等)对某些API或语法的支持程度。例如,`nextSibling`和`nextElementSibling`都是获取元素的下一个兄弟节点,但...

    让innerHTML的脚本也可以运行起来

    默认情况下,IE和Firefox对嵌入到`innerHTML`中的脚本有不同的执行策略。IE有时会忽略这些脚本,而Firefox则有可能需要特定的操作来触发脚本执行。 在IE中,如果`innerHTML`的HTML字符串中包含`&lt;script&gt;`标签,并且...

    一些高性能的Javascript代码.doc

    在IE和Firefox下,这种方法可将效率提升10%-30%,在Firefox中尤为明显。例如: ```javascript // 优化前 for (var i = 0; i ; i++) { var el = document.createElement('p'); el.innerHTML = i; document.body...

    javascript开发中因空格引发的错误

    在Firefox和Internet Explorer(IE)两个浏览器中,对于空格和换行的处理方式不同,导致了相同代码在两者间产生了不同的运行结果。 首先,我们来分析第一段代码。在这段代码中,`&lt;li&gt;` 元素内部包含了换行和缩进: ...

    javascript获取指定节点父节点、子节点的方法.pdf

    4. `parentObj.children`:返回父节点的直接子节点数组,IE7和Firefox上的表现可能不同,不建议单独依赖此属性。 5. `parentObj.getElementsByTagName(tagName)`:在父节点的所有子节点中查找指定类型的子节点,返回...

Global site tag (gtag.js) - Google Analytics