• 面试题:动态生成表格


    题目要求

    1) 任意输入行数或列数, 生成对应表格;
    2) 行数, 列数必须为正整数类型, 否则提示非法;(这里我用正则限制1-100, 避免网友测试输入过大值造成浏览器假死)
    3) 在生成表格的单元格中随机填入1到15之间的随机数, 并给每个单元格设置随机背景颜色;
    4) 点击任意单元格, 将其数和背景颜色输出显示;
    5) 效率要求:100*100生成表格时间小于3秒;
    6) 代码中要用到事件代理机制;
    7) 设计一种简单机制, 使单元格数小于255*255*255时, 颜色不重复
    8) 要求符合w3c验证, 兼容IE, Firefox, chrome等浏览器

    参照大牛写出的代码

      1 <!DOCTYPE html>
      2 <html lang="en">
      3     <head>
      4         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      5         <title>Demos</title>
      6         <style>
      7             body {font-weight:bold; font-family:"微软雅黑";}
      8             label {margin-right:2px;}
      9             input[type="text"] {width:50px; height:20px; border: 2px solid #ccc;}
     10             input[type="submit"] {width:70px; height:30px; background:#000; border-radius:5px; color:#fff; font-size:14px; font-family:"微软雅黑";}
     11             table {clear:both; border:1px solid #000;}
     12             td {color:#FFF;cursor:pointer;text-align:center;border:1px solid #000;padding:5px;}
     13             #msg {margin: 5px 0; line-height:25px;}
     14             #msg span {height:25px; line-height:25px;}
     15             #msg em {width:25px;height:25px;display:inline-block;margin-right:5px;}
     16         </style>
     17     </head>
     18     <body>
     19     <label>行数</label><input type="text" name="row" id="row">
     20     <label>列数</label><input type="text" name="col" id="col">
     21     <input type="submit" value="生成表格" id="btn">
     22     <div id="msg"></div>
     23     <script type="text/javascript">
     24     function createTable(){
     25         this.oTable = null;
     26         this.bgColor = 0;
     27     }
     28     createTable.prototype = {
     29         init: function(row,col){ //生成表格函数
     30             var inner = "";
     31             var oFrag = document.createDocumentFragment(); //文档片段
     32             var oBody = document.body;
     33             var oTemp = document.createElement("div");
     34             var aRow = [];
     35             var aCol = [];
     36             for(var i=0; i< row; i++) {
     37                 aCol.length = 0;
     38                 for(var j=0; j<col; j++) {
     39                     aCol.push('<td style="background:'+this.getRanColor()+'">'+this.randomRange(1,15)+'</td>');
     40                 }
     41                 aRow.push("<tr>"+aCol.join("")+"</tr>");
     42             }
     43             oTemp.innerHTML = "<table><tbody>"+aRow.join("")+"</tbody></table>"; //div中包裹table
     44             while(oTemp.firstChild) //将oTemp的DOM赋予oFrag,会删除oTemp中的DOM元素
     45                 oFrag.appendChild(oTemp.firstChild);
     46             this.oTable && oBody.removeChild(this.oTable);
     47             oBody.appendChild(oFrag);
     48             this.oTable = oBody.lastChild;
     49         },
     50         randomRange : function(lower, upper){
     51             return Math.floor(Math.random()*(upper-lower+1)+lower);
     52         },
     53         getRanColor : function(){ //生成随机背景颜色
     54             var str = this.randomRange(0,0xF0F0F0).toString(16);
     55             if(str.length < 6)
     56                 str = "0" + str;
     57             return "#"+(this.bgColor.toString().replace("#","").toString(10)===str.toString(10) ? str+100000 : str);
     58         }
     59     }
     60     window.onload = function(){
     61         var oTab = new createTable();
     62         var row = document.getElementById("row");
     63         var col = document.getElementById("col");
     64         var btn = document.getElementById("btn");
     65         var msg = document.getElementById("msg");
     66         btn.onclick = function(){
     67             var inputRow = row.value;
     68             var inputCol = col.value;
     69             
     70             //正则表达式判断输入
     71             var reg = /^((?!0)d{1,2}|100)$/;  //疑点1:正则表达式
     72             if(!reg.test(inputRow)) {
     73                 alert("请输入0-100之间的整数");
     74                 inputRow.select();
     75                 return false;
     76             }
     77             if(!reg.test(inputCol)) {
     78                 alert("请输入0-100之间的整数");
     79                 inputCol.select();
     80                 return false;
     81             }
     82             //隐藏信息区域
     83             msg.style.display = "none";
     84             
     85             oTab.oTable && (oTab.oTable.onclick = null);
     86             
     87             oTab.init(inputRow,inputCol);
     88             
     89             //事件代理机制
     90             oTab.oTable.onclick = function(e) {
     91                 e = e || event;
     92                 var oTarget = e.target || e.srcElement;
     93                 if(oTarget.tagName.toUpperCase() == "TD") {
     94                     msg.style.dispaly = "block";
     95                     msg.innerHTML = "<span >您选择的区域数字是:"+oTarget.innerHTML +',颜色为:<em style="background:'+oTarget.style.backgroundColor+'">'+'</em>'
     96                         +oTarget.style.backgroundColor+"</span>";
     97                     
     98                 }
     99             }
    100         }
    101     }
    102     </script>
    103     </body>
    104 </html>
    demo

    执行结果

    几点注意

    1. 事件代理:

    http://www.cnblogs.com/rubylouvre/archive/2009/08/09/1542174.html

    2. 文档片段与innerHTML的使用

    3. 正则表达式判断输入的数字

  • 相关阅读:
    工作流资源模式
    工作流资源模式
    工作流资源模式
    工作流资源模式
    工作流模式-工作流资源模式43种
    pmbok中文第六版官方在线版(班主任推荐)
    PMP项目管理知识体系指南(PMBOK指南)第六版,无水印、无密码、带目录、高清
    五、行为型模式
    四、结构型模式
    一、UML
  • 原文地址:https://www.cnblogs.com/borage/p/4333184.html
Copyright © 2020-2023  润新知