0

0

php+ajax 仿google 下拉框代码二

php中文网

php中文网

发布时间:2016-06-08 17:30:08

|

1179人浏览过

|

来源于php中文网

原创

CREATE TABLE `suggest` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `keyword` varchar(50) NOT NULL,
  `num` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=gb2312 AUTO_INCREMENT=59 ;

/*
    ****************************
    *** http://www.hansir.cn ***
    ****************************
*/
String.prototype.ltrim = function(){
    return this.replace(/^s*(.+?)$/,'$1');
}
//这里引用prototype的五个方法
function $(){return document.getElementById(arguments[0]);}
Object.extend = function(destination, source){
    for(property in source) destination[property] = source[property];
    return destination;
}
function $A(iterable) {
    var results = [];
    for (var i = 0; i     return results;
}
Function.prototype.bindAsEventListener = function(object) {
    var __method = this;
    return function(event) {
        return __method.call(object, event || window.event);
    }
}
Function.prototype.bind = function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
        return __method.apply(object, args.concat($A(arguments)));
    }
}
var hansir = {
    url: 'http://www.hansir.cn'
}
hansir.AjAx = function(){this.initialize.apply(this, arguments);}
hansir.AjAx.prototype = {
    initialize: function(complete, method, url){
        this.complete = complete;
        this.method      = method || 'post';
        this.url      = url;
        if (this.method == 'get') this.url += (this.url.match(/?/) ? '&' : '?');
    },
    xmlHttp: function(){
        var xmlHttp;
        if(window.XMLHttpRequest) xmlHttp = new XMLHttpRequest();
        else if(window.ActiveXObject)
            try{
                xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
            }catch(errr){
                xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
            }
        return xmlHttp;
  },
  request: function(parameters){
    var xmlHttp = this.xmlHttp();
    var send_val = null;
    this.method=='get' ? this.url += parameters : send_val = parameters;
    xmlHttp.open(this.method, this.url, true);
    xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
    xmlHttp.onreadystatechange = this.ready_handler.bind(this, xmlHttp);
    xmlHttp.send(send_val);
  },
  ready_handler: function(xmlHttp){
    if(xmlHttp.readyState == 4){
        if(this.success(xmlHttp)){
            this.complete.load_data(xmlHttp);
        }
    }
  },
  success: function(xmlHttp){return xmlHttp.status == 0 || xmlHttp.status >= 200 && xmlHttp.status }
hansir.TextSuggest = function(){this.initialize.apply(this, arguments);}
hansir.TextSuggest.prototype = {
    initialize: function(){},
    add_suggest: function(inp, url, method, defer, defer2){
        var inp = $(inp);
        inp.defer = defer || null;
        inp.defer2 = defer2 || 200;
        var sw = inp.offsetWidth, sh = inp.offsetHeight;
        inp.suggest_list = this.create_list(sw, sh);
        inp.suggest_list.par = inp;
        inp.xmlHttp = new hansir.AjAx(inp.suggest_list, method, url);
        Object.extend(inp, {
                requesting : false,
               last_result : true,
            previous_value : null,
                last_value : null,
                        kt : null,
                        rt : null,
            load_event: function(){
                if(this.addEventListener){
                    this.addEventListener('input', this.keyup_handler.bindAsEventListener(this),false);
                }else if(this.attachEvent){
                    this.attachEvent('onkeyup', this.keyup_handler.bindAsEventListener(this));
                }
            },
            keyup_handler:function(e){
                var intKey;
                window.event ? intKey = event.keyCode : intKey = e.which;
                if(intKey == 38 || intKey == 40 || intKey == 13 || intKey == 37) return;
                if(this.requesting) return;
                var val = this.value.ltrim();
                this.last_value = val;
                if(val == this.previous_value) return;
                if(val==''){
                    this.previous_value = '';
                    this.last_value='';
                    this.suggest_list.hidden();
                    this.suggest_list.clear_data();
                    return;
                }
                if(new RegExp('^'+this.last_result,'i').test(val)) return;
                this.last_result = true;
                this.previous_value = val;
                if(this.kt) clearTimeout(this.kt);
                this.defer?this.kt = setTimeout(this.send_request.bind(this), this.defer):this.send_request();
            },
            onblur: function(){
                setTimeout(this.suggest_list.hidden.bind(this.suggest_list), 100);
            },
            onkeydown: function(e){ // 上下、回车键事件
                if(!this.suggest_list.rows.length) return;
                var intKey;
                window.event ? intKey = event.keyCode : intKey = e.which;
                switch(intKey){
                    case 38:
                        if(this.suggest_list.style.visibility=='hidden'){
                            this.suggest_list.visible();
                            return;
                        }
                        var val = this.suggest_list.select_index(1);
                        val?this.value=val : this.value = this.last_value;
                        break;
                    case  40:
                        if(this.suggest_list.style.visibility=='hidden'){
                            this.suggest_list.visible();
                            return;
                        }
                        var val=this.suggest_list.select_index(0);
                        val?this.value=val : this.value = this.last_value;
                        break;
                    case 13:
                        if(this.suggest_list.cur_tr!=-1){
                            this.suggest_list.hidden();
                            break;
                        }
                    case 39:
                        this.suggest_list.hidden();
                        this.keyup_handler('o');
                }
            },
            send_request: function(){ // 请求数据
                this.requesting = true;
                var val = this.value;
                var parameters = 'keyword=' + val.ltrim();
                this.xmlHttp.request(parameters);
                this.start_hidden_time();
            },
            start_hidden_time: function(){
                if(this.rt) clearTimeout(this.rt);
                this.rt = setTimeout(this.list_hidden.bind(this), this.defer2);
            },
            list_hidden: function(){
                if(this.requesting) this.suggest_list.hidden();
            }
        });
        inp.load_event();
    },
    create_list: function(w, h){ //创建列表
        var table  = document.createElement('table');
        table.cellSpacing = 0;
        document.body.appendChild(table);
        table.className = 'tab_suggest';
        table.style.width = w + 'px';
        table.parh = h-1;
       
        Object.extend(table,{
            cur_tr: -1,
            set_pos: function(){ // 下垃框位置
                var x=0, y=0, inp = this.par;
                while(inp != null){x += inp.offsetLeft;y += inp.offsetTop;inp = inp.offsetParent;}
                inp = null;
                table.style.left = x + 'px';
                table.style.top = y+this.parh+ 'px';
            },
            add: function(str, num){
                var n=0;
                this.rows.length ? n=this.rows.length : n = 0;
                var tr = this.insertRow(n);
                var th = document.createElement('th');
                var td = document.createElement('td');
                th.innerHTML = str, td.innerHTML = num;
                tr.appendChild(th), tr.appendChild(td);
                tr.num = this.rows.length-1;
                tr.par = this;
                tr.onmouseover = function(){
                    var par = this.par;
                    if(par.cur_tr!=-1 && par.cur_tr!=this.num){
                        par.rows[par.cur_tr].className='';
                        this.className = 'cur';
                        par.cur_tr = this.num;
                    }else{
                        this.className = 'cur';
                        par.cur_tr = this.num;
                    }
                }
                tr.onclick = function(){
                    var par = this.par.par;
                    par.value = this.cells[0].innerHTML;
                }
                tr = null, th = null, td = null;
            },
            load_data: function(xmlHttp){ // 加载列表
                var inp = this.par;
                if(inp.previous_value != inp.value){
                    inp.requesting = false;
                    this.clear_data();
                    inp.keyup_handler('o');
                    return;
                }
                var arr = xmlHttp.responseText;
                if(arr.ltrim() == 'null'){
                    inp.last_result = inp.value;
                    inp.requesting = false;
                    inp.suggest_list.hidden();
                    this.clear_data();
                    return;
                }
                var cur_data = eval(arr);
                this.clear_data();
                for(var i=0; i                 this.cur_tr = -1;
                this.visible();
                inp.requesting = false;
            },
            clear_data: function(){while(this.rows.length)this.deleteRow(this.rows[0])}, // 清空列表
            select_index: function(n){ // 移动选项
                if(n){
                    if(this.cur_tr==0){
                        this.rows[0].className = '';
                        this.cur_tr = -1;
                        return false;
                    }else{
                        this.cur_tr==-1?this.cur_tr=this.rows.length : this.rows[this.cur_tr].className = '';
                        this.cur_tr = this.cur_tr-1;
                        this.rows[this.cur_tr].className = 'cur';
                        return this.rows[this.cur_tr].cells[0].innerHTML;
                    }
                }else{
                    if(this.cur_tr == (this.rows.length-1)){
                        this.rows[this.cur_tr].className= '';
                        this.cur_tr = -1;
                        return false;
                    }else{
                        if(this.cur_tr!=-1)this.rows[this.cur_tr].className = '';
                        this.cur_tr = this.cur_tr+1;
                        this.rows[this.cur_tr].className = 'cur';
                        return this.rows[this.cur_tr].cells[0].innerHTML;
                    }
                }
            },
            hidden: function(){this.style.visibility = 'hidden';}, // 隐
            visible: function(){this.set_pos(); this.style.visibility = 'visible';} // 显
        });
        return table;
    }
}

 

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载

 

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JavaScript高级框架设计视频教程
JavaScript高级框架设计视频教程

共22课时 | 3.6万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号