一些前端笔试总结

1. 循环绑定事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <ul>
        <li>111</li>
        <li>2222222</li>
        <li>33333333333</li>
    </ul>
    <script>
        // 事件绑定中涉及的变量取值为最终的值,下面i最终取oLi.length
        var oUl = document.getElementsByTagName('ul')[0];
        var oLi = oUl.getElementsByTagName('li');
        for(var i=0; i<oLi.length; i++){            
            oLi[i].onclick = function(){
                alert(i);//输出结果无论点击谁都是3,而不是我们想要的0,1,2
            }
        }
    </script>
</body>
</html>
解决方案:
第一种
<script>
    // 加一层闭包,i以函数参数形式传递给内层函数
    var oUl = document.getElementsByTagName('ul')[0];
    var oLi = oUl.getElementsByTagName('li');
    for(var i=0; i<oLi.length; i++){
        (function(val){
            oLi[val].onclick = function(){
                alert(val);//输出结果是0,1,2
            }
        })(i);                        
    }
</script>
第二种
<script>    <pre name="code" class="html">      // 加一层闭包,i传给局部变量
    var oUl = document.getElementsByTagName('ul')[0];
    var oLi = oUl.getElementsByTagName('li');
    for(var i=0; i<oLi.length; i++){
        (function(){
            var val = i;
            oLi[val].onclick = function(){
                alert(val);//输出结果是0,1,2
            }
        })();                        
    }
</script>

 2. bind函数的原生js实现    
 参考 

Function.prototype.bind = function (oThis) {  
    if (typeof this !== "function") {
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(
              this instanceof fNOP && oThis ? this : oThis || window,
              aArgs.concat(Array.prototype.slice.call(arguments))
          );
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
3. 表单有哪些相关标签

form, input, label, select, option, textarea, fieldset, legend, optgroup, button

4. 一个数组['a','a','b','b','b','c','c','c','c'],写一个通用函数,输出其中数量最多的元素名称及次数

function arr_max(arr){
  
  // 先对数组进行排序,将相同元素放在一起
  arr.sort();
  // 设置新数组,存放元素名称和数量
  var result = [{name:arr[0], count:1}];
  // 设置一个变量,始终指向result中正在处理的对象
  var index=0;
  // 遍历目标数组
  for(var i=0, arr_len=arr.length; i<arr_len-1; i++){
    if(arr[i]!=arr[i+1]){
      result.push( {name:arr[i+1], count:1} );
      index++;
    }else{
      result[index].count += 1;
    }
  }
  // 对result数组进行排序,按照元素的count属性大小,降序
  result.sort(function(a, b){
    return b.count - a.count;
  });
  var output = '元素' + result[0].name;
  for(var j=0, result_len = result.length; j<result_len-1; j++){
    if(result[j].count === result[j+1].count){
      output += ',' + result[j+1].name;
    }else{
      break;
    }
  }
  output += '出现次数最多,为' + result[0].count + '次'
  return output;
}

var arr = ['a','a','c','c','d','d','a','c','d'];
arr_max(arr)

5. 两列布局,左边固定320px,右边自适应

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>两列布局</title>
    <style>
        /*设置了高度和背景,便于看出结果*/
        .left{          
            width: 320px;
            height: 600px;
            float: left;
            background-color: green;
            margin-right: -320px;
        }
        .right{          
            width: 100%; 
            float: right;          
        }
        .r-box{
            margin-left: 320px;           
            height: 600px;
            background-color: red;           
        }
    </style>
</head>
<body>
    <div class="left"></div>
    <div class="right">
        <div class="r-box"></div>
    </div>
</body>
</html>

6. HTTP在状态码为302时,会产生两次http请求。

301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:
301 redirect: 301 代表永久性转移(Permanently Moved)。
302 redirect: 302 代表暂时性转移(Temporarily Moved )。302转向可能会有URL规范化及网址劫持的问题。可能被搜索引擎判为可疑转向,甚至认为是作弊。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值