childNodes在Firefox和Chrome中无法工作,但在IE中可以工作

4

我有一个gridview,其中第3个单元格有一个文本框控件,在onchange事件上调用了javascript函数。

有人能告诉我为什么在IE中可以工作,但在Firefox和Chrome中无法工作吗?

grd.rows[rowindex].cells[3].childNodes[0].value

在IE中它返回正确的值,但在Chrome和Firefox中却不是(在FF和Chrome中返回undefined)?

请还建议我处理这个问题的解决方案。

编辑

alert(grd.rows[ri].cells[3].childNodes[0].value);//IE value=correct value, FF and chrome value=undfined
alert(grd.rows[ri].cells[3].childNodes[1].value);//IE value=undfined, FF and Chrome value= correct value

谢谢

7个回答

4
我认为这是因为IE忽略了只包含换行符和制表符的文本节点。个人而言,我更喜欢它们被忽略,但我希望在不同浏览器之间有一致性。
<p><!-- This comment represents a text node.
    --><em>text</em>
</p>

2

尝试

grd.rows[rowindex].cells[3].childNodes[1].value

为了获得最佳效果,请查看集成开发工具中的表格。

请查看我问题的编辑部分......这个表在集成开发工具中的哪里? - Muhammad Akhtar

2

试一下这个。我遇到了同样的问题,只需将“childNodes”替换为“children”即可解决该问题。

alert(grd.rows[ri].cells[3].children[0].value);

1

@ChaosPandion:

嘿,朋友,不要使用这种类型的检查childNodes。

childNodes的计数是不同的。一些浏览器包括空文本节点,而一些则不包括。在这种操作中,我认为你正在描述的情况下,最好使用父元素的getElementsByTagName()方法。这样,你要查找的每个子元素的数量和索引将是一致的。

或者

只需检查您的浏览器名称。

如果它是IE,则由于忽略空文本节点,其中的childNode比其他浏览器少一个数字。

例如。

var isIE = navigator.appName;
if (isIE == "Microsoft Internet Explorer") {                
    var removeProductID = document.getElementById(obj.childNodes[0].id).getAttribute("abc");
}
else {
    var removeProductID = document.getElementById(obj.childNodes[1].id).getAttribute("abc");
}

希望这能有所帮助。享受编码的乐趣吧。

0
如ChaosPandion所说,IE会忽略空白文本节点。以下代码在各种浏览器中都可以运行:
var cell = grd.rows[rowindex].cells[3];
for (var textbox=cell.firstChild; textbox.nodeType!==1; textbox=textbox.nextSibling);
alert(textbox.value);

然而,你说你正在调用onchange函数。这意味着你正在针对相关文本框的onchange事件进行操作。在这种情况下,你的事件处理程序中的事件参数应该有一个指向文本框的指针。查看target或srcElement属性。例如:

function onChange(e) {
 e = e || window.event;
 var textbox = e.target || e.srcElement;
 alert(textbox.value);
}

0

如果您正在寻找文本,请在非IE浏览器中使用grd.rows[rowindex].cells[3].childNodes[0].data。

获取元素节点的文本值

var oCell = grd.rows[rowindex].cells[3];
alert(oCell.textContent || oCell.innerText)

获取文本节点的文本值(与之前相比不太安全)

var oText = grd.rows[rowindex].cells[3].childNodes[0];
alert(oCell.data || oCell.value)

所有浏览器都实现了DOM-Level-2(有些是3),IE实现了所谓的DOM-Level-0——它们自己对DOM的投影。 - Sergey Ilinsky

0

尝试使用 getElementsByTagName() 而不是 ChildNodes。它将适用于 Firefox、Chrome 和 IE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接