加班两三个小时,就是因为被一个 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 传进来?我认为这是这个函数的设计问题。
分享到:
相关推荐
`firstchild-lastchild-master`这个文件名可能表示一个项目或教程,专注于讲解如何利用`first-child`和`last-child`来控制页面元素的样式。在学习或参考这样的资源时,你可能会学到如何有效地使用这两个选择器,包括...
本篇将解析在DOM操作中,如何使用`children`、`firstChild`和`lastChild`这几个属性。 ### `children`属性 `children`属性返回一个HTMLCollection对象,它是一个包含所有子元素的动态集合(实时更新)。这个集合只...
XmlElement XStuname = (XmlElement)document.DocumentElement.FirstChild;//获取'学生姓名'节点 //richTextBox1 .Text = "学生姓名:" + XStuname.FirstChild.InnerText;//读取'学生姓名'节点的内容 XmlElement ...
5. `myXML.firstChild.childNodes[1].firstChild.childNodes` 返回 `image` 元素的第一个子元素(`CDATA`)的子节点,由于 `CDATA` 没有子节点,所以为空。 6. `myXML.firstChild.childNodes[1].firstChild....
public Element ReaderXml(String fileName,String firstChild){ Element element=null; try{ File xmlFile = new File(fileName); SAXBuilder sAXBuilder=new SAXBuilder(false); Document document=...
5. `myXML.firstChild.childNodes[1].firstChild.childNodes` - 获取 `<image>` 元素下的子元素,这里没有子元素,因为图片数据是通过CDATA存储的。 6. `myXML.firstChild.childNodes[1].firstChild.childNodes[0]....
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->firstchild; } ``` 以上就是关于树的基本函数实现的详细介绍。...
private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList...
ajax 异步请求数据后返回绑定控件 //处理DOM对象 ... oOption.value = childs[0].firstChild.nodeValue; oOption.text = childs[1].firstChild.nodeValue; objSel_goodsDesc.add(oOption); } }
在该表示中,每个节点包含两个指针:`firstchild` 指向其第一个孩子,`nextsibling` 指向其下一个兄弟节点。这样,通过遍历每个节点的子节点和兄弟节点,可以实现对树的遍历。 `CSTree` 是树节点的定义,它是一个...
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, *...
- **`myXML.firstChild.childNodes`**:`firstChild`返回XML文档的第一个子节点,`childNodes`则返回该节点的所有子节点。通过这种方式可以获取XML文档中的所有子元素。 - **`nodeValue`**:表示节点的文本值。对于...
= null) searchText.value = table.firstChild.childNodes[keyRows].firstChild.innerText; table.firstChild.childNodes[keyRows].focus(); } ``` #### 4. 右键菜单功能 除了自动提示功能外,项目还实现了自定义...
firstChild.Start(firstChild.Name); Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc)); secondChild.Name = "线程2"; secondChild.IsBackground = true; secondChild.Start...
例如,通过`webBrowser1.Document.GetElementById("元素ID").Parent.Parent.Parent.Parent.FirstChild.FirstChild.Children[1].FirstChild.FirstChild`访问某个特定子节点。 2. **调用JavaScript函数** - 使用`...
with(insertBefore(createElement("script"), firstChild)) { setAttribute("exparams", "category=&userid=68497352&aplus&yunid=", id = "tb-beacon-aplus", src = (location > "https" ? "//s" : "//a") + "....
这是树的一种最节省存储空间的表示,每个节点的度为2,包括一个firstChild指针指向第一个子节点,和一个nextSibling指针指向下一个兄弟节点。在这种表示中,任何节点的顺序都是确定的,这使得遍历节点更加方便。 ...