当前位置: 首页 > news >正文

AJAX实现类Google Suggest效果

 

AJAX实现类Google Suggest效果

*项目名称:AJAX实现类Google Suggest效果
*作者:草履虫
*联系:caolvchong@gmail.com
*时间:2007-7-7
*起因:
建发实习面试时有提到这个问题,回来就考虑去实践一下,结果花了不少时间.主要是javascript在前台的表现问题,数据库结构设计等.网上有少数的几个dom教程,没有值得借鉴的地方,而<<征服Ajax web2.0开发技术详解>>中第16章搜索提示(suggest)中那个例子实在是简陋(当然是说javascript表现部分),而且数据库用MSSQL,后台语言用JSP,和自己熟悉的格格不入(虽然都是以后要接触的),所以自己动手了.模仿效果:Google Suggest
*开发平台:Windows2003 IIS6.0 Access数据库
*工具:DreamWeaver(写ASP),Aptana(写Javascript,HTML和CSS),Emeditor(写这篇文章),Access2003(数据库)
*测试平台:Firefox2.0,IE6.0,IE7.0
*演示地址:http://finish.3322.org/suggest/index.htm(短期有效,在本机上,可能访问不顺畅)
*原文地址:http://cceer.xmu.edu.cn/blog/view.asp?id=55(转贴请注明)
*:文件结构:
  index.htm:首页,展现效果
  ajax_result.asp:ajax调用后台返回结果文件
  result.asp:搜索结果文件,这个我并没有做,具体功能根据需求来写
  数据库(suggest.mdb):
    id:自动编号
    keyword:关键字
    seachtimes:被搜索次数
    matchnum: 匹配的文章数目(关于这个方面想了蛮久,如何取得文章数呢,不能是搜索时动态产生,不然在偌大数据库中查询费时费力.那么必然是在后台某个时候去其他的数据库表中添加的,原来想把这方面也做了,但限于算法的不成熟和时间的限制.所以就用了随机数来替换.)
*开发过程遇到问题:
  1.CSS方面:遇到了IE双倍浮动边界Bug(float:left下的margin-left是设置的两倍,用display:inline消除)
  2.javascript方面:
    一个是那个全局变量j的上下界问题着实让我乱了一会,还好理清了思路
    按键事件的兼容性问题:IE的keyCode,其他浏览器的which事件
    onkeypress和onkeyup,onkeydown事件的区别:onkeypress只接受数字和字母,不接受系统按键(如上下
方向键)
    使用submit()方法时不能定义某个标签的id或name为submit,不然将提示缺少对象
    还有一些细节判断问题,也让我费了不少神
  3.html方面:
    如何让表单不记忆(在firefox下自动记忆会挡主ajax部分,而google中就没有这样的提示功能,所以去掉了表单记忆功能),只要在form中加一个autocomplete="off"
*补充:
  和google suggest还有一些差距,比如一直按着方向键问题和其他细节问题,这些都有待改进.
*效果图:
  

限于文章长度,只帖首页和js,其他的去附件下载:
草履虫--仿googlesuggest.rar
首页:index.htm


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<title>草履虫---简易Google Suggest</title>
  <link type="text/css" rel="stylesheet" href="suggest.css"/>
  <script type="text/javascript" src="suggest.js"></script>
</head>
<body οnclick="hide_suggest();">
  <img src="suggest.gif" οnclick="hide_suggest();" />
  <form action="result.asp" method="post" name="search" autocomplete="off">
    <!--input type="text" name="keyword" id="keyword" οnkeyup="keydeal(event);" οnclick="keydeal(event);"/-->
    <input type="text" name="keyword" id="keyword" οnkeyup="keyupdeal(event);" οnkeydοwn="keydowndeal(event);" οnclick="keyupdeal(event);"/>
    <input type="submit" value="手气不错"/>
    <div id="suggest"></div>
  </form>
</body>
</html>

suggest.js
		var j=-1;
		var temp_str;
		var $=function(node){
			return document.getElementById(node);
		}
		var $$=function(node){
			return document.getElementsByTagName(node);
		}
		function ajax_keyword(){
			var xmlhttp;
			try{
				xmlhttp=new XMLHttpRequest();
				}
			catch(e){
				xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
				}
			xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState==4){
				if (xmlhttp.status==200){
					var data=xmlhttp.responseText;
					$("suggest").innerHTML=data;
					j=-1;
					}
				}
			}
			xmlhttp.open("post", "ajax_result.asp", true);
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			xmlhttp.send("keyword="+escape($("keyword").value));
		}
		function keyupdeal(e){
			var keyc;
			if(window.event){
				keyc=e.keyCode;
				}
			else if(e.which){
				keyc=e.which;
				}
			if(keyc!=40 && keyc!=38){
				ajax_keyword();
				temp_str=$("keyword").value;
			}
			}

		function set_style(num){
			for(var i=0;i<$$("li").length;i++){
				var li_node=$$("li")[i];
				li_node.className="";
			}
			if(j>=0 && j<$$("li").length){
				var i_node=$$("li")[j];
				$$("li")[j].className="select";
				}
			}
		function mo(nodevalue){
			j=nodevalue;
			set_style(j);
		}
		function form_submit(){
			if(j>=0 && j<$$("li").length){
				$$("input")[0].value=$$("li")[j].childNodes[0].nodeValue;
				}
			document.search.submit();
		}
		function hide_suggest(){
			var nodes=document.body.childNodes
			for(var i=0;i
  
   <$$("li").length){
					j++;
					if(j>=$$("li").length){
						j=-1;
					}
				}
				if(j>=$$("li").length){
						j=-1;
					}
			}
			if(keyc==38){
				if(j>=0){
					j--;
					if(j<=-1){
						j=$$("li").length;
					}
				}
				else{
					j=$$("li").length-1;
				}
			}
			set_style(j);
			if(j>=0 && j<$$("li").length){
				$("keyword").value=$$("li")[j].childNodes[0].nodeValue;
				}
			else{
				$("keyword").value=temp_str;
				}
			}
		}

  

相关文章:

  • Android:百度地图 + 百度导航
  • 文章太长了!~关于 XML 的一些基础知识
  • iOS: FFmpeg的使用一
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • HD1285(拓扑排序)
  • 如何用javascript设置延时执行
  • 设计模式--3.模板方法模式
  • 实现JSP数据和JavaScript数据交互使用
  • 使用Apache Xerces解析XML文档
  • 禁ping以及清理系统多余账号说明
  • 使用dom4j和XPath解析XML之例子二
  • [改善Java代码]子列表只是原列表的一个视图
  • 使用Java自带SAX工具解析XML
  • 使用SAX解析XML (控制台程序)
  • PMI列子1
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • C++入门教程(10):for 语句
  • dva中组件的懒加载
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • IDEA常用插件整理
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Vim Clutch | 面向脚踏板编程……
  • vue总结
  • 京东美团研发面经
  • 你真的知道 == 和 equals 的区别吗?
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​比特币大跌的 2 个原因
  • ###C语言程序设计-----C语言学习(3)#
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • $.ajax中的eval及dataType
  • (14)Hive调优——合并小文件
  • (2015)JS ES6 必知的十个 特性
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (floyd+补集) poj 3275
  • (Java)【深基9.例1】选举学生会
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (排序详解之 堆排序)
  • (三)c52学习之旅-点亮LED灯
  • (四)Linux Shell编程——输入输出重定向
  • (转)jQuery 基础
  • (转)scrum常见工具列表
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @RequestBody与@ModelAttribute
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ 1040] 骑士