- IE7下,如果HTML元素是JS创建的,那么你采用document.getElementsByName()就得不到节点列表,怎么办?
- getElementsByTagName() 可被用于任何的 HTML 元素,而getElementsByName()却不能,语法只能是document.getElementsByName(),并且好像不是W3C的标准,那么要方便得使用怎么办?
那么看看这个方法吧:
// 取得 指定元素的 子节点列表 // // 子元素可以指定 name // // 子元素可以指定 tagName // function child() { // 取得指定元素的所有子元素中元素名为name的元素集合 (有name取name,无name取id ) this.getChildsByName = function(element, name) { var state = "name"; return this.getChilds(element, name, state); }; // 取得指定元素的所有子元素中tagName为name的元素集合 this.getChildsByTagName = function(element, name) { var state = "tagName"; return this.getChilds(element, name, state); }; // state为"name",取得 指定元素的 name为name子元素 // state为"tagName",取得 指定元素的 tagName为name子元素 this.getChilds = function(element, name, state) { return this.find(element, name, state); //return this.list_elment; // 返回集合 }; // 通用方法 this.find = function(element, name, state) { var a = []; if (null == element) { return a; } var nodes = element.childNodes; // 所有子元素 for ( var i = 0; i < nodes.length; i++) { if (nodes[i].nodeType == 1) { //节点类型为1 var name_id = ""; if (state == "name") { name_id = nodes[i].name == null ? nodes[i].id : nodes[i].name; // 有name取name,无name取id } else if (state == "tagName") { name_id = nodes[i].tagName; } else { alert("请传参数,指定按name或tagName搜索元素!"); return a; } if (name_id == name) { a.push(nodes[i]); // 加入集合 } var bl = nodes[i].hasChildNodes(); // 有无下一层子元素 if (bl) { a=a.concat(this.find(nodes[i], name, state)); // 递归 } } } return a; }; } //上下文单实例 $EC = new child();
如何使用?
$EC.getChildsByName(document,"name"); $EC.getChildsByName(document.getElementById("id"),"name"); $EC.getChildsByTagName(document,"input"); $EC.getChildsByTagName(document.getElementById("id"),"input"); //第一个参数是一个节点元素就行,可以随意获取该节点下的元素
方便不?让你爽到死,又兼容又方便,就是有时候效率会有点折扣。毕竟不能两全。呵呵