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

firstChild 把我玩了

 
阅读更多
加班两三个小时,就是因为被一个 DWR 的函数给玩了。dwr.util.removeAllRows(ele, options) 这个函数可以把 ele 元素下的所有子元素删除,但允许你添加例外。我试图把一个 <table> 下的一行保留下来。
<table>
	<tr id="row">
		<td>a</td>
	</tr>
	<tr id="row1">
		<td>a</td>
	</tr>
	<tr id="row2">
		<td>a</td>
	</tr>
	<tr id="row3">
		<td>a</td>
	</tr>
</table>

用这样的 JavaScript 代码来做的:
	dwr.util.removeAllRows("tbl", { filter:function(tr) {
		return tr.id != "row";
	}});

照说这样应该就可以了。可结果是 "row" 行还是保留不下来。找到 removeAllRows 的源码来看一下。
dwr.util.removeAllRows = function(ele, options) {
  ele = dwr.util._getElementById(ele, "removeAllRows()");
  if (ele == null) return;
  if (!options) options = {};
  if (!options.filter) options.filter = function() { return true; };
  if (!dwr.util._isHTMLElement(ele, ["table", "tbody", "thead", "tfoot"])) {
    dwr.util._debug("removeAllRows() can only be used with table, tbody, thead and tfoot elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
    return;
  }
  var child = ele.firstChild;
  var next;
  while (child != null) {
    // 注意这个 alert()
    alert(child.innerHTML);
    next = child.nextSibling;
    if (options.filter(child)) {
      ele.removeChild(child);
    }
    child = next;
  }
};

里面的 alert 是我自己为了调试加的。调试的结果出乎我的意料,获取的子元素竟然只有一个,而且是所有的 <tr>!难怪 filter 回调不好使。对于我来说,解决的方法也挺意外。只需要在 <table> 里添加一个 <tbody> 就可以。
<table>
	<tbody id="tbl">
		<tr id="row">
			<td>a</td>
		</tr>
		<tr id="row1">
			<td>a</td>
		</tr>
		<tr id="row2">
			<td>a</td>
		</tr>
		<tr id="row3">
			<td>a</td>
		</tr>
	</tbody>
</table>

removeAllRows 函数里面关键是 ele.firstChild。没想到在没有 tbody 的情况下,竟然返回所有的行。这个行为在 IE 和 Firefox 下是一致的。看来 <table> 天生应该内嵌 <tbody>,只是我不知道。既然这样,为什么 removeAllRows 还允许 table 传进来?我认为这是这个函数的设计问题。
分享到:
评论
4 楼 yangdong 2008-08-13  
没错。所以现在即便别人没加我都加上。

to williamy:
DWR util 里面都是辅助操作DOM得好东西。他们的函数都解决了跨浏览器的问题。而且有些烦人的IE bug也能绕过去。我现在JS必用。没事也会看看里面的代码,很有用。YUI也有辅助函数,可惜没时间看。
3 楼 笨笨狗 2008-08-13  
你不加tbody,浏览器也会给你加上的,如果需要用js操作子元素,你不加的话就是自己给自己找麻烦,何况,这样也不遵循标准,是个坏习惯。
2 楼 williamy 2008-08-12  
原来DWR还能这么用,不过这么用有什么用?徒增烦恼
1 楼 supercrsky 2008-08-11  
tbody一般我也不加。

相关推荐

    firstchild-lastchild

    `firstchild-lastchild-master`这个文件名可能表示一个项目或教程,专注于讲解如何利用`first-child`和`last-child`来控制页面元素的样式。在学习或参考这样的资源时,你可能会学到如何有效地使用这两个选择器,包括...

    解析dom中的children对象数组元素firstChild,lastChild的使用

    本篇将解析在DOM操作中,如何使用`children`、`firstChild`和`lastChild`这几个属性。 ### `children`属性 `children`属性返回一个HTMLCollection对象,它是一个包含所有子元素的动态集合(实时更新)。这个集合只...

    loadanswer

    XmlElement XStuname = (XmlElement)document.DocumentElement.FirstChild;//获取'学生姓名'节点 //richTextBox1 .Text = "学生姓名:" + XStuname.FirstChild.InnerText;//读取'学生姓名'节点的内容 XmlElement ...

    Flash XML 树结构详细操作示意图

    5. `myXML.firstChild.childNodes[1].firstChild.childNodes` 返回 `image` 元素的第一个子元素(`CDATA`)的子节点,由于 `CDATA` 没有子节点,所以为空。 6. `myXML.firstChild.childNodes[1].firstChild....

    Web.xml文件配置JDOM對XML文件操作

    public Element ReaderXml(String fileName,String firstChild){ Element element=null; try{ File xmlFile = new File(fileName); SAXBuilder sAXBuilder=new SAXBuilder(false); Document document=...

    Flash XML 树结构详细操作示意图 Ver2.0

    5. `myXML.firstChild.childNodes[1].firstChild.childNodes` - 获取 `&lt;image&gt;` 元素下的子元素,这里没有子元素,因为图片数据是通过CDATA存储的。 6. `myXML.firstChild.childNodes[1].firstChild.childNodes[0]....

    FLASH加载XML数据分析.pdf

    bookTag = myXML.firstChild.firstChild.childNodes[2].attributes.src; trace(bookTag); } else { trace("error"); } }; myXML.load("booklist.xml"); ``` 这段代码首先创建了一个新的`XML`对象,设置了忽略...

    数据结构中树的各种基本函数

    在树的结构中,每个结点的`firstchild`指针指向它的第一个子结点。示例代码如下: ```cpp treenode* find_first_child(treenode* t) { return t-&gt;firstchild; } ``` 以上就是关于树的基本函数实现的详细介绍。...

    java基于链表实现树结构(算法源码)

    private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList...

    ajax联动查询后绑定控件

    ajax 异步请求数据后返回绑定控件 //处理DOM对象 ... oOption.value = childs[0].firstChild.nodeValue; oOption.text = childs[1].firstChild.nodeValue; objSel_goodsDesc.add(oOption); } }

    树的二叉链表(孩子-兄弟)存储表示.doc

    在该表示中,每个节点包含两个指针:`firstchild` 指向其第一个孩子,`nextsibling` 指向其下一个兄弟节点。这样,通过遍历每个节点的子节点和兄弟节点,可以实现对树的遍历。 `CSTree` 是树节点的定义,它是一个...

    FLASH加载XML数据分析

    bookTag = myXML.firstChild.firstChild.childNodes[2].attributes.src; trace(bookTag); ``` 这将输出第一本书的图片地址"1.jpg"。如果你想要动态地导入这个图片,可以添加`_root.loadMovie(bookTag);`这行代码。 ...

    用二叉树表示树.基本操作程序

    - `firstChild`: 指向该节点的第一个孩子的指针。 - `nextSibling`: 指向该节点的下一个兄弟节点的指针。 ```cpp template class TreeNode { friend class Tree; private: Type data; TreeNode* firstChild, *...

    flash读xml

    - **`myXML.firstChild.childNodes`**:`firstChild`返回XML文档的第一个子节点,`childNodes`则返回该节点的所有子节点。通过这种方式可以获取XML文档中的所有子元素。 - **`nodeValue`**:表示节点的文本值。对于...

    JS应用(文本框输入出现自动提示框和右键菜单)

    = null) searchText.value = table.firstChild.childNodes[keyRows].firstChild.innerText; table.firstChild.childNodes[keyRows].focus(); } ``` #### 4. 右键菜单功能 除了自动提示功能外,项目还实现了自定义...

    C#进程.docx

    firstChild.Start(firstChild.Name); Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc)); secondChild.Name = "线程2"; secondChild.IsBackground = true; secondChild.Start...

    C#中的WebBrowser控制操作

    例如,通过`webBrowser1.Document.GetElementById("元素ID").Parent.Parent.Parent.Parent.FirstChild.FirstChild.Children[1].FirstChild.FirstChild`访问某个特定子节点。 2. **调用JavaScript函数** - 使用`...

    javascript之with的使用(阿里云、淘宝使用代码分析)

    with(insertBefore(createElement("script"), firstChild)) { setAttribute("exparams", "category=&userid=68497352&aplus&yunid=", id = "tb-beacon-aplus", src = (location &gt; "https" ? "//s" : "//a") + "....

    数据结构(C++)上课笔记——树的概念与C++实现(2020-5-18) .doc

    这是树的一种最节省存储空间的表示,每个节点的度为2,包括一个firstChild指针指向第一个子节点,和一个nextSibling指针指向下一个兄弟节点。在这种表示中,任何节点的顺序都是确定的,这使得遍历节点更加方便。 ...

Global site tag (gtag.js) - Google Analytics