百度搜索下拉提示


```javascript

    

搜索


**

## *utils.js*

**

```javascript
function isObject( data ){
    return (typeof data === "object" && data !== null && data.constructor && data.constructor === Object)
}
// 对象合并;
function assign(){
    var target = arguments[0];
    for(var i = 1 ; i < arguments.length ; i ++){
        // console.log(arguments[i]);
        for(var attr in arguments[i]){
            target[attr] = arguments[i][attr];
        }
    }
    return target;
}
function removeCookie( name , options ){
    cookie( name ,"" ,  isObject( options ) ? assign( options , { expires : -1 }) : { path : options, expires : -1  })
}
// cookie操作;
function cookie( name , value , options  ){
    // 此时参数大于一个,value 是一个字符串。 那么我们认为此时我们在设置cookie;
    if( arguments.length > 1 && typeof value === "string"){
        if(!isObject( options )){
            options = {};
        }
        if( typeof options.expires === "number"){
            var d = new Date();
            d.setDate( d.getDate() + options.expires );
        }
        return (document.cookie = [
                name + "=" + value,
                typeof options.expires === "number" ? ";expires=" + d : "",
                typeof options.domain === "string" ? ";domain=" + options.domain : "",
                typeof options.path === "string" ? ";path=" + options.path : "",
        ].join(""));
    }
    var cookie_string = document.cookie;
    var cookie_array  = cookie_string.split("; ");
    for(var i = 0 ; i < cookie_array.length ; i ++){
        if( cookie_array[i].split("=")[0] === name ){
            return cookie_array[i].split("=")[1]
        }
    }
    return "";
}
function toUrlData( obj , url , method){
    if( isObject(obj) ){
        var str = "";
        for(var attr in obj){
            str += "&" + attr + "=" + obj[attr]
        }
        str = str.slice(1);
        // 如果数据发送方式是POST,那么直接返回str就可以了;
        method = method || "";
        if( method.toUpperCase() === "POST"){
            return str;
        }
        url += "?" + str;
        return url;
    }
    return url;
}
//  AJAX 请求发送;
function xhrGet( url , callback , data ) {
    var xhr = null;
    if(typeof XMLHttpRequest === "function"){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    url = toUrlData(data , url);
    xhr.open("GET", url);
    xhr.send();
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4 && /^2\d{2}$/.test( xhr.status )){
            typeof callback === "function" ?  callback( xhr.responseText ) : "";
        }
    }
}

function xhrPost( url , callback , data) {
    var xhr = null;
    if(typeof XMLHttpRequest === "function"){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr.open("POST",url,true);
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    data = toUrlData( data , url , "POST");
    // console.log(data);
    xhr.send(data);
    xhr.onreadystatechange = function(){
        if( xhr.readyState === 4 && /^2\d{2}$/.test( xhr.status )){
            callback( xhr.responseText );
        }
    }
}
// ajax 兼容性良好的封装;
function ajax( options ){
    // 默认参数;
    var _default = {
        type : "GET",
        url : "",
        data : null,
        // 返回的数据类型;
        dataType : "text",
        status : null,
        success : function(){},
        complete : function(){},
        error : function(){}
    }
    // 我们会创建一些默认参数, 如果用户传入了其他数据会对默认参数进行覆盖;
    options = assign( _default , options );
    options.type = options.type.toLowerCase();
    // 如果存在context;
    if( isObject(options.context) ){
        var callback_list = ["success","complete","error"];
        // 如果老版本浏览器更新成for循环;
        callback_list.forEach( function( item ){
            // console.log(options[item]);
            options[item] = options[item].bind( options.context );
        })
    }
    // 1. 创建shr ;
    var xhr = null;
    if(typeof XMLHttpRequest === "function"){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    // 可以简化;
    // 1. 如果请求方式为get,那么我们把数据拼接到url上;
    if(options.type === "get"){
        options.url =  toUrlData( options.data , options.url , options.type)
    }
    // 2. 如果请求方式为post,那么我们把数据拼接到data上;
    if(options.type === "post"){
        options.data =  toUrlData( options.data , options.url , options.type)
    }
    // 2. 根据数据进行方法的调用;
    xhr.open( options.type , options.url , true ) ;
    options.type === "post" ? xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded") : "";
    // 3. 调用send方法;
    xhr.send( options.type=== "get" ? null : options.data );
    // 4. 调用回调函数;
    xhr.onreadystatechange = function(){
        // xhr程序运行结束;
        if( xhr.readyState === 4 ){
            options.complete();
            
            if( /^2\d{2}$/.test(xhr.status) ){
                // 5.传递数据
                // 如果需要转换成json那么我们就返回json,如果不需要原样返回;
                // 如果JSON.parse报错了那么我们要调用错误函数;
                try{
                    var res = options.dataType === "json" ? JSON.parse(xhr.responseText) : xhr.responseText; 
                    options.success(res);
                }catch(e){
                    options.error(e,xhr.status);
                }
            }else{
                options.error("error",xhr.status);
            }
            // 策略模式调用 : 
            if( isObject(options.status) ){
                typeof options.status[xhr.status] === "function" ? options.status[xhr.status]() : "";
            }
        }
    }
}

function jsonp( url , callback , file_name , data ){
    var _default = {}
    _default[ file_name || "callback" ] = "global_fn_name";
    // 防止data为空;
    data = data || {};
    // console.log(_default);
    data = assign(_default , data);
    // 1. 全局函数; 在局部作用域之中声明全局函数;
    window["global_fn_name"]  = function( res ){
        callback(res);
    }
    // 2. 创建script标签 ;
    var script_ele = document.createElement("script");
    // 3. 放入url链接;
    script_ele.src = toUrlData( data , url );
    document.body.appendChild(script_ele);
    script_ele.onload = function(){
        script_ele.remove();
    }
}

// 选择器 : 为了区分jquery所以使用 _
function _( selector ){
    var ele = document.querySelectorAll( selector );
    if( ele === null ){
        return ele;
    }
    if( ele.length === 1){
        return ele[0];
    }
    return [].slice.call(ele);
}
// class 工具

function removeClass( ele , className){
    var reg = new RegExp("\\s?" + className, "g");
    ele.className = ele.className.replace(reg,"");
}

function addClass(ele , className){
    var reg = new RegExp("\\s?" + className, "g");
    if(reg.test(ele.className)){
        return false;
    }
    ele.className += " " + className;
}

你可能感兴趣的:(百度搜索下拉提示)