查了半天资料, 据说这三事件的执行顺序是:
onkeydown -> onkeypress -> onkeyup
===========================
我遇到的情况是, onkeyup的注册的方法执行异步的ajax方法, 这时好像只有onkeyup事件比较满意
在input中, 当按下一个字母键"S"时, onkeydown、onkeypress都会先执行ajax的方法, 之后才给input赋值, 造成查询结果为空.
当用onkeyup事件, 则可以捕获到"上箭头"、"下箭头"按键, 唯独捕获不了"回车键". 尝试了各种办法, 都没法完全解决, 干脆用 onkeydown事件专门处理下回车键吧
============================
代码如下: 后期加的功能, 时间赶, 又不擅长前台, 赶工写的功能, 没有很好的结构去重用代码, 以后有时间可能会整理下, 因此: 垃圾代码仅为实现功能, 见谅.
前台代码:
<td class="infoContent">
<asp:HiddenField ID="hiddenFldApplication" runat="server"/>
<div id='divAffectApplication' class='divAffectApplication' runat="server" style="word-warp:break-word;overflow-x:hidden;overflow-y:scroll;border:inset 2px;width:98%;height:50px;" onclick="inputFocus(this);">
<input type="text" style="margin-left:10px;width:120px;border: none 0px" onkeydown="checkEnterKey(event,'divPopupLayer')" onkeyup="checkKey(event,this,'divPopupLayer');">
</div>
</td>
相关后台代码:
if (aService != "")
{
aService += "<INPUT style='BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; WIDTH: 120px; MARGIN-LEFT: 10px; BORDER-TOP: 0px; BORDER-RIGHT: 0px' class=valid onkeydown=\"checkEnterKey(event,'divPopupLayer')\" onkeyup=\"checkKey(event,this,'divPopupLayer');\">";
//txtAffectServices.Text = aService;
this.divAffectService.InnerHtml = aService;
}
else
{
aApplication += "<INPUT style='BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; WIDTH: 120px; MARGIN-LEFT: 10px; BORDER-TOP: 0px; BORDER-RIGHT: 0px' class=valid onkeydown=\"checkEnterKey(event,'divPopupLayer')\" onkeyup=\"checkKey(event,this,'divPopupLayer');\">";
this.divAffectApplication.InnerHtml = aApplication;
}
//一般处理程序
//handler方法获取Post的请求参数
using System; using System.Collections.Generic; using System.Linq; using System.Web; using SqlDBLib; using CommonLib; using System.Text; namespace WebSite.Common { /// <summary> /// 根据服务表返回特定格式的服务名称(如: Svr(张鹏),Svr(苏铁)) /// </summary> public class ServiceInfoHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest(HttpContext context) { //context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //context.Response.ContentType = "text/plain"; //if ((context.Session["_userRoles"] as List<string>).Count != 0) //{ // if ((context.Session["_userRoles"] as List<string>).Contains("开发负责人") || (context.Session["_userRoles"] as List<string>).Contains("管理员")) // { // List<string> lst = ServiceDB.GetServicePrincipal(); // StringBuilder sb = new StringBuilder(); // foreach (string s in lst) // { // sb.Append(s + ","); // } // context.Response.Write(sb.ToString()); // } // else // { // context.Response.Redirect("~/Default.aspx"); // } //} //else //{ // context.Response.Redirect("~/Default.aspx"); //} context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.ContentType = "text/plain"; if ((context.Session["_userRoles"] as List<string>).Count != 0) { if ((context.Session["_userRoles"] as List<string>).Contains("开发负责人") || (context.Session["_userRoles"] as List<string>).Contains("管理员")) { //获取XMLHttpRequest的Post方式中的Send发送的参数 string inputStr = ""; using (System.IO.Stream stream = context.Request.InputStream) { using (System.IO.StreamReader sr = new System.IO.StreamReader(stream)) { try { inputStr = sr.ReadToEnd(); } catch (Exception ex) { throw ex; } } } if (!string.IsNullOrEmpty(inputStr)) { //List<string> lst = ServiceDB.GetServicePrincipal(inputStr); List<string> lst = ServiceDB.GetSrvAppPrincipal(inputStr); StringBuilder sb = new StringBuilder(); foreach (string s in lst) { sb.Append(s.Replace(")",")<em style=\"display:none;\">") + "</em>,"); } context.Response.Write(sb.ToString()); } } else { context.Response.Redirect("~/Default.aspx"); } } else { context.Response.Redirect("~/Default.aspx"); } } public bool IsReusable { get { return false; } } } }