美文网首页
【手撕代码1】ajax,数组去重,jsonp,hover,事件委

【手撕代码1】ajax,数组去重,jsonp,hover,事件委

作者: 一包 | 来源:发表于2019-04-03 16:59 被阅读0次

1. 原生js写Ajax(兼容ie)

  • xhr.readyStatus == 0 尚未调用 open 方法
  • xhr.readyStatus == 1 已调用 open 但还未发送请求(未调用 send)
  • xhr.readyStatus == 2 已发送请求(已调用 send)
  • xhr.readyStatus == 3 已接收到请求返回的数据
//创建一个Ajax对象
function ajaxGet(url,fnSucee,fnFaild){
    var xhr=null;
    //创建一个Ajax对象
    if(Window.XMLHttpRequest){
        //非ie6
        xhr=new XMLHttpRequest();
    }else{
        //ie6
        xhr=new ActiveXObject("Microsoft.XMLHTTP");
    }
    //连接到服务器,true异步
    xhr.open("GET",url,true);
    xhr.send();
    
    xhr.onreadystatechange=function(){
        //readyState--浏览器和服务器之间进行到哪一步了
        if(xhr.readySate==4){//读取完成
            if(xhr.status==200){
               fnSucee(xhr.responseText); 
            }else{
                 if(fnFaild){   //判断是否传入失败是的函数,即用户是否关心失败时的结果
               fnFaild(oAjax.responseText);  //对失败的原因做出处理
             }
            }
            
        }
    }
}
//创建一个Ajax对象
function ajaxPost(url,fnSucee,fnFaild){
    var xhr=null;
    //创建一个Ajax对象
    if(Window.XMLHttpRequest){
        //非ie6
        xhr=new XMLHttpRequest();
    }else{
        //ie6
        xhr=new ActiveXObject("Microsoft.XMLHTTP");
    }
    //连接到服务器,true异步
    xhr.open("POST",url,true);
    //设置头信息
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send(data);
    
    
    
    xhr.onreadystatechange=function(){
        //readyState--浏览器和服务器之间进行到哪一步了
        if(xhr.readySate==4){//读取完成
            if(xhr.status>==200&&xhr.status<300||xhr.status==304){
               fnSucee(xhr.responseText); 
            }else{
                 if(fnFaild){   //判断是否传入失败是的函数,即用户是否关心失败时的结果
               fnFaild(oAjax.responseText);  //对失败的原因做出处理
             }
            }
            
        }
    }
}

2. 遍历一个对象的属性(for..in)


for(var key in obj){
    if(obj.hasOwnProperty==true){
        console.log(obj[key]);
    }
}

3. 数组去重

遍历对象用for in 遍历数组用for of

ES5:

function unique(arr){
    var newarr=[];
    for(var item of arr){
      if(newarr.indexOf(item)==-1){
      newarr.push(item);
    }
    return newarr;
}

ES6:

  • 基本思路:ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

  • Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。

  • 任何类似数组的对象可以用扩展运算符转换为真正的数组。

function unique(arr){
    let x = new Set(arr);
    return [...x];
}

4. 手写jsonp

https://blog.csdn.net/hkwBest/article/details/81484304

假设访问的url

 http://www.baidu.com/person.js

接口的代码

handle({name: 'tom', age: 20})
<script type="text/javascript">
    function handleRes(data){
        console.log(data.name + 'is' + data.age + 'years old');
    }
</script>
<script type="text/javascript" src="http://www.baidu.com/person.js?callback=handle"></script>
//这个callback本身也是可配置的。

jq ajax

$.ajax({
        url: 'xxxxx',   //一个跨域的url
        type: 'get',
        dataType: 'jsonp',   //设置服务器返回的数据类型
        jsonp: 'onJsonPLoad',  //这个值用来配置前面提过的callback,它会拼接到url的后面
        jsonpCallback: 'handleRes',  //用来设置回调函数名称
        success: function (res){   //这里的success回调就相当于之前写到的handleRes方法。
            console.log(res);
        }
    })

5. js实现hover效果

function hover(ele,over,out){
    ele.addEventListener("mouseover",over,false);
    ele.addEventListener('mouseout',out,false);
}

hover(document.querySelector('#dd'),function(){
    console.log('over');
},function(){
    console.log('out');
});

6. js实现事件委托

  • event对象:ie是window.event
  • target对象:标准event.target,ie是window.event.srcElement
  • target.nodeName.toLowerCase=="li"获取的nodeName是大写

鼠标移到每个li触发改变颜色的事件

var oUl = document.getElementById('ul');
var aLi = oUl.getElementsByTagName('li');

oUl.onmouseover=function(ev){
    var ev=ev||window.event;
    var target=ev.target||ev.srcElement;
    
    if(target.nodeName.toLowerCase=="li"){
        target.style.background = 'red';
    }
}
oUl.onmouseout = function(ev) {
    var ev = ev || window.event;
    var target = ev.target|| ev.srcElement;
   
    if(target.nodeName.toLowerCase() == 'li'){
       target.style.background = ' ';
    }
}

7. js实现,点击一个列表时,输出对应的索引

  • let实现
<body>
    <ul>
        <li>1</li>
        <li>2</li>
    </ul>
    <script>
        var list=document.querySelectorAll(li);
        for(let i=0;i<list.length;i++){
            list[i].addEventListener("click",function(){
            console.log(i);
                
            },false)
        }
    </script>
</body>
  • 闭包实现
<body>
    <ul>
        <li>1</li>
        <li>2</li>
    </ul>
    <script>
        var list=document.querySelectorAll(li);
        for(let i=0;i<list.length;i++){
            (function(i){
                list[i].addEventListener("click",function(){
                console.log(i);
                },false)
             })(i);
        }
    </script>
</body>
  • 事件委托实现
var ul=document.getElementsByTagName(ul)[0];
var list=document.querySelectorAll(ul li);

ul.addEventListener("click",function(ev){
    var ev=ev||window.event;
    var target=ev.target||ev.srcElement;
    
    if(target.nodeName.toLowerCase=="li"){
        console.log([].indexOf.call(list,target));
    }
    
},false);

相关文章

网友评论

      本文标题:【手撕代码1】ajax,数组去重,jsonp,hover,事件委

      本文链接:https://www.haomeiwen.com/subject/esizbqtx.html