function make(tag, attributes, children) {
    var root = document.createElement(tag);
    if(arguments.length == 2 && attributes.constructor != Object) {
      children = attributes;
      attributes = null;
    }
    if(attributes) {
      for(var name in attributes) root.setAttribute(name, attributes[name]);
    }
    if(children) {
      if(children.constructor == String) {
        root.appendChild(document.createTextNode(children));
      } else if(children.constructor == Array) {
        for(var i = 0; i < children.length; i++) {
          if(children[i].constructor == String) children[i] = document.createTextNode(children[i]);
          root.appendChild(children[i]);
        }
      } else {
        root.appendChild(children);
      }
    }
    return root;
  }
  function maker(tag) {
    return function(attributes, children) {
      if (arguments.length == 1) return make(tag, attributes);
      else return make(tag, attributes, children)
    }
  }上边这个函数这么调用就没问题:
  window.onload = function() {
    var p = maker("p"), b = maker("b"), u = maker("u");
    var myRoot = p({align : "center"}, b(u("Good!")));
    document.body.appendChild(myRoot);
  };像下边这样,ie8以下的浏览器就不行了
  window.onload = function() {
    var table = maker("table"), tr = maker("tr"), td = maker("td");
    var myRoot = table({border : 1}, [tr([td("11"), td("21"), td("31"), td("41")]),
                                      tr([td("12"), td("22"), td("32"), td("42")]),
                                      tr([td("13"), td("23"), td("33"), td("43")]),
                                      tr([td("14"), td("24"), td("34"), td("44")])]);
   document.body.appendChild(myRoot);
  };基本上主流浏览器都测试过,这个毛病只有ie8以下出现,请高手赐教!

解决方案 »

  1.   

    貌似和我以前遇到类似的问题。
    有些属性 对对ie8一下 不起作用。。
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        
    <script language="JavaScript">
        function make(tag, attributes, children) {
            var root = document.createElement(tag);
            if (arguments.length == 2 && attributes.constructor != Object) {
                children = attributes;
                attributes = null;
            }
            if (attributes) {
                for (var name in attributes) root.setAttribute(name, attributes[name]);
            }
            if (children) {
                if (children.constructor == String) {
                    root.appendChild(document.createTextNode(children));
                } else if (children.constructor == Array) {
                    for (var i = 0; i < children.length; i++) {
                        if (children[i].constructor == String) children[i] = document.createTextNode(children[i]);
                        root.appendChild(children[i]);
                    }
                } else {
                    root.appendChild(children);
                }
            }
            return root;
        }
        function maker(tag) {
            return function (attributes, children) {
                if (arguments.length == 1) return make(tag, attributes);
                else return make(tag, attributes, children)
            }
        }
        window.onload = function () {
            alert("dsadsad");
            var table = maker("table"), tr = maker("tr"), td = maker("td");
            var myRoot = table({ border: 1 }, [tr([td("11"), td("21"), td("31"), td("41")]),
      tr([td("12"), td("22"), td("32"), td("42")]),
      tr([td("13"), td("23"), td("33"), td("43")]),
      tr([td("14"), td("24"), td("34"), td("44")])]);
            document.getElementById("aaa").appendChild(myRoot);
            alert(document.getElementById("aaa").innerHTML);//确定里面有内容,但是IE7就是不显示    };
    </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <div id="aaa" style="background-color:Red"></div>
        </div>
        </form>
    </body>
    </html>
      

  2.   

    浏览器兼容问题,须 + tbody,如下:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    </HEAD> <BODY>
    <a id="aaa" href="a.html">hello</a>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var tbl = document.createElement("table");
    var tby = document.createElement("tbody"); //----------
    var row = document.createElement("tr");
    var col = document.createElement("td");
    col.innerHTML = "asdf";
    row.appendChild(col);
    tby.appendChild(row);//-----------
    tbl.appendChild(tby); 
    document.body.appendChild(tbl);
    //-->
    </SCRIPT>
    </BODY>
    </HTML>
      

  3.   

    添加tbody就ok了:
    window.onload = function() {
      var table = maker("table"), tbody = maker("tbody"), tr = maker("tr"), td = maker("td");
      var myRoot = table({border : 1}, tbody([tr([td("11"), td("21"), td("31"), td("41")]),
      tr([td("12"), td("22"), td("32"), td("42")]),
      tr([td("13"), td("23"), td("33"), td("43")]),
      tr([td("14"), td("24"), td("34"), td("44")])]));
      document.body.appendChild(myRoot);
      };
      

  4.   


    KAO,还可以这样建表格!
      

  5.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test</title>
    <script type="text/javascript">
      <!-- <![CDATA[
      window.onerror = function(msg, url, line) {
        alert(url +
              "\n____________________________________________________________" +
              "\n\nLine:" + line +
             "\nError:" + msg);
        return true;
      };  function make(tag, attributes, children) {
        var root = document.createElement(tag);
        if(arguments.length == 2 && attributes.constructor != Object) {
          children = attributes;
          attributes = null;
        }
        if(attributes) {
          for(var name in attributes) root.setAttribute(name, attributes[name]);
        }
        if(children) {
          if(children.constructor == String) {
            root.appendChild(document.createTextNode(children));
          } else if(children.constructor == Array) {
            for(var i = 0; i < children.length; i++) {
              if(children[i].constructor == String) children[i] = document.createTextNode(children[i]);
              root.appendChild(children[i]);
            }
          } else {
            root.appendChild(children);
          }
        }
        return root;
      }
      function maker(tag) {
        return function(attributes, children) {
          if (arguments.length == 1) return make(tag, attributes);
          else return make(tag, attributes, children)
        }
      }  window.onload = function() {
        var table = maker("table"), tbody = maker("tbody"), tr = maker("tr"), td = maker("td");
        var myRoot = table({border : 1}, tbody([tr([td("11"), td("21"), td("31"), td("41")]),
                                                tr([td("12"), td("22"), td("32"), td("42")]),
                                                tr([td("13"), td("23"), td("33"), td("43")]),
                                                tr([td("14"), td("24"), td("34"), td("44")])]));
       document.body.appendChild(myRoot);
      };
      // ]]> -->
    </script>
    </head>
     
    <body></body>
    </html>
    加了tbody果然好了,IE5.5/6/7/8、FF、Safari、Opera、Chrome、Netscape测试全过,请问楼上的高手这是为什么呢?
      

  6.   

    同上,加了tbody果然好了,IE5.5/6/7/8、FF、Safari、Opera、Chrome、Netscape测试全过,请高手这是为什么呢?
      

  7.   

    因为table必须包含thead与tbody两个子元素,而thead与tbody包含tr元素,tr包含TD元素。而平时我们写的时候忽略了thead与tbody,但浏览器解析的时候会自动添加上这两个元素,可惜,javaScript不会帮我们自动添加上。
      

  8.   

    转自我的blog:http://blog.sina.com.cn/s/blog_680a81e10100jrw9.html/* Nodes.js: Document Node Operation.
     * Version: 1.0.
     *
     * This module defines a single global symbol named "Nodes".
     * It is composed of several classes, and have constructors.
     *
     * Copyright (C) By Mr.lonely
     */  try {
        var Nodes;    if(!Nodes) Nodes = {};
        else if(typeof Nodes != "object") throw new Error("\"Nodes\" already exists, but the type it is not an object.");
        if(Nodes.getTags) throw new Error("Attribute repeat, \"Nodes.getTags\" already exist.");
        if(Nodes.version) throw new Error("Attribute repeat, \"Nodes.version\" already exist.");    (function() {
          var _tags = {name : [], text : [], count : 0};      function _getTags(root) {
            if(!root) root = document;
            if(typeof root == "string") root = document.getElementById(root);
            if(root.nodeType == 3) _tags.text.push(root.nodeValue);
            if(root.nodeType == 1) {_tags.name.push(root.nodeName); _tags.count++;}
            var children = root.childNodes;
            for(var i = 0; i < children.length; i++) _getTags(children[i]);
          }
          _getTags.prototype.toString = function () {return _tags.name.join(" ")};
          _getTags.prototype.valueOf = function () {return _tags.count};
          _getTags.prototype.text = function () {return _tags.text.join(" ")};      Nodes.getTags = _getTags;
          Nodes.version = function() {return "1.0"};
        })()
      } catch(e) {
        alert(e.message);
      }
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>阿尔伯特·爱因斯坦</title>
    <script type="text/javascript" src="Nodes.js"></script>
    <script type="text/javascript">
      <!-- <![CDATA[
      window.onload = function() {
        var myTags = new Nodes.getTags("myTable");
        alert(myTags);
        alert(myTags + 0);
        alert(myTags.text());
      }
      // ]]> -->
    </script>
    <style>
    div {
       width:800px; height:auto; margin:10px; border:none; padding:0px;
       color:#000000; font-family:Arial; font-size:14px; font-weight:normal; font-style:normal; line-height:25px;
    }img {
       float:left; margin-right:10px; border:solid #CCCCCC 1px; padding:5px;
    }
    </style>
    </head><body>
    <h1>阿尔伯特·爱因斯坦</h1>
    <a name="Introduction"></a>
    <div>
    <img src="Example3/5327ce163f263828972b4317.jpg" width="160" height="200" />
    <p>爱因斯坦是德裔美国物理学家(拥有瑞士国籍),思想家及哲学家,犹太人,现代物理学的开创者和奠基人,相对论——“质能关系”的提出者,“决定论量子力学诠释”的捍卫者(振动的粒子)——不掷骰子的上帝。 1999年12月26日,爱因斯坦被美国《时代周刊》评选为“世纪伟人”。</p>
    </div>
    <div>
    <table id="myTable" width="100%" height="210" border="1" cellpadding="3" cellspacing="0" bordercolordark="#CCCCCC">
      <tr>
        <td width="10%" height="30" align="left" valign="middle">中文名:</td>
        <td width="40%" height="30" align="right" valign="middle">阿尔伯特·爱因斯坦</td>
        <td width="10%" height="30" align="left" valign="middle">职业:</td>
        <td width="40%" height="30" align="right" valign="middle">物理学家,哲学家</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">外文名:</td>
        <td width="40%" height="30" align="right" valign="middle">Albert Einstein</td>
        <td width="10%" height="30" align="left" valign="middle">毕业院校:</td>
        <td width="40%" height="30" align="right" valign="middle">苏黎世联邦理工学院</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">国籍:</td>
        <td width="40%" height="30" align="right" valign="middle">美国,瑞士</td>
        <td width="10%" height="30" align="left" valign="middle" rowspan="3">主要成就:</td>
        <td width="40%" height="30" align="right" valign="middle" rowspan="3">提出相对论及质能方程<br />解释光电效应<br />推动量子力学的发展</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">民族:</td>
        <td width="40%" height="30" align="right" valign="middle">犹太族</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">出生地:</td>
        <td width="40%" height="30" align="right" valign="middle">德国乌尔姆市</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">出生日期:</td>
        <td width="40%" height="30" align="right" valign="middle">1879年3月14日</td>
        <td width="10%" height="30" align="left" valign="middle" rowspan="2">代表作品:</td>
        <td width="40%" height="30" align="right" valign="middle" rowspan="2">《论动体的电动力学》<br />《广义相对论的基础》</td>
      </tr>
      <tr>
        <td width="10%" height="30" align="left" valign="middle">逝世日期:</td>
        <td width="40%" height="30" align="right" valign="middle">1955年4月18日</td>
      </tr>
    </table>
    </div>
    </body>
    </html>谢谢楼上的高手,叫我想起了我以前的例子,上边就是我以前曾做过的一个例子,刚开始用Nodes.getTags.valueOf()方法返回标签的数量和我数出来的数量死活对不上,后来用Nodes.getTags.toSrting()方法返回了下标签列表,发现含有tbody,即使是html文档的表格中没有tbody标签,浏览器也会自动的加上。哎!没想到HTML虽然简单,但有这么多细节...以后我多注意了!