Opera还真恶心,光标放text的第一个位置了,只要使用Range对象来重置光标位置了.正在调试中js更改了这里
function getEmail(e,v)
{
e=e||event;
if(e.keyCode==27||e.keyCode==13||e.keyCode==38||e.keyCode==40)//为自定义的快捷键时退出
return;
var vs=v.split(","); //========
v=vs[vs.length-1];//========
//下面的没变
}function setTxt(v)
{
v=v.replace("<","<").replace(">",">");
email.value=email.value.substr(0,email.value.lastIndexOf(",")+1)+v+",";//====================
if(/opera/gi.test(navigator.userAgent))
{
//Opera的话会把"变为",只好替换回来了.
email.value=email.value.replace(/"/gi,"\"");
//Opera还真恶心,光标放text的第一个位置了,只要使用Range对象来重置光标位置了
emial.select();
//var r=email.createRange();
// r.move(email.value.length);
}
addr.style.display="none";
}
function getEmail(e,v)
{
e=e||event;
if(e.keyCode==27||e.keyCode==13||e.keyCode==38||e.keyCode==40)//为自定义的快捷键时退出
return;
var vs=v.split(","); //========
v=vs[vs.length-1];//========
//下面的没变
}function setTxt(v)
{
v=v.replace("<","<").replace(">",">");
email.value=email.value.substr(0,email.value.lastIndexOf(",")+1)+v+",";//====================
if(/opera/gi.test(navigator.userAgent))
{
//Opera的话会把"变为",只好替换回来了.
email.value=email.value.replace(/"/gi,"\"");
//Opera还真恶心,光标放text的第一个位置了,只要使用Range对象来重置光标位置了
emial.select();
//var r=email.createRange();
// r.move(email.value.length);
}
addr.style.display="none";
}
我是用textarea来接受地址,如果用回车建选择的话,那么就会出现换行咯,而这个又是我不希望出现的
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312" />
<title>1</title>
<style type="text/css">
.focus{background-color:#AFDBFF}
div{color:blue}
body{font-size:10pt}
</style>
</head>
<body>
<script type="text/javascript">
//我想数据量应该不是很大(300条以上时可以考虑用ajax),这样把这里改为你的服务器生成下面格式的js数组
var link=[["张三","[email protected]"],["王五","[email protected]"],["赵六","[email protected]"],["小张","[email protected]"]
,["小李","[email protected]"],["张龙","[email protected]"],["赵虎","[email protected]"]];
var ts=null;
var addr,email;
window.onload=function()
{
addr=document.getElementById("addr");
email=document.getElementById("email");
var point=getDivPosition(email);
addr.style.left=point.x+"px";
addr.style.top=point.y+"px";
}
function getDivPosition(o)
{
var point=new Object();
point.x=o.offsetLeft;
point.y=o.offsetTop+o.offsetHeight;
while(o=o.offsetParent)
{
point.x+=o.offsetLeft;
point.y+=o.offsetTop;
}
return point;
}
function getEmail(e,v)
{
e=e||event;
if(e.keyCode==27||e.keyCode==13||e.keyCode==38||e.keyCode==40)//为自定义的快捷键时退出
return;
var vs=v.split(","); //========
v=vs[vs.length-1];//========
if(v!="")
{
if(/^ +$/g.test(v))//输入空格,输出所有地址原来的代码:(/^ +$/g.test(v))
{
//displayAll();
}
else if(/^[a-bA-Z0-9]+$/gi.test(v))//按email搜索
{
if(ts!=null)
clearTimeout(ts);
ts=setTimeout("displaySearch(1,'"+v.replace(/'/g,'\'')+"')",500);//延时500ms查询
}
else if(/^[\u4E00-\u9FFF]+$/gi.test(v))//输入汉字,按姓名搜索
{
if(ts!=null)
clearTimeout(ts);
ts=setTimeout("displaySearch(0,'"+v.replace(/'/g,'\'')+"')",500);//延时500ms查询
}
}
}
function displaySearch(type,v)
{
var First=true;
var data="";
for(var i=0;i<link.length;i++)
{
if(link[i][type].indexOf(v)==0)
{
if(First)
{
First=false;
data+='<div onclick="setTxt(this.innerHTML)" class="focus">"'+link[i][0]+'"<'+link[i][1]+'></div>';
}
else
data+='<div onclick="setTxt(this.innerHTML)">"'+link[i][0]+'"<'+link[i][1]+'></div>';
}
}
addr.innerHTML=data;
addr.style.display="";
}
function displayAll()
{
var data="";
for(var i=0;i<link.length;i++)
{
if(i==0)
data+='<div onclick="setTxt(this.innerHTML)" class="focus">"'+link[i][0]+'"<'+link[i][1]+'></div>';
else
data+='<div onclick="setTxt(this.innerHTML)">"'+link[i][0]+'"<'+link[i][1]+'></div>';
}
addr.innerHTML=data;
addr.style.display="";
}
function setTxt(v)
{
v=v.replace("<","<").replace(">",">");
email.value=email.value.substr(0,email.value.lastIndexOf(",")+1)+v+",";//====================
if(/opera/gi.test(navigator.userAgent))
{
//Opera的话会把"变为",只好替换回来了.
email.value=email.value.replace(/"/gi,"\"");
//Opera还真恶心,光标放text的第一个位置了,只要使用Range对象来重置光标位置了
emial.select();
//var r=email.createRange();
// r.move(email.value.length);
}
addr.style.display="none"; }
document.onkeydown=function(e)
{
e=e||event;
if(e.keyCode==27)//esc键
addr.style.display="none";
else
{
if(addr.style.display!="none")
{
var divs=addr.getElementsByTagName("div");
for(var i=0;i<divs.length;i++)
{
if(divs[i].className=="focus")
{
if(e.keyCode==38)//向上键
{
var preDiv=divs[i-1];
if(preDiv!=null)
{
divs[i].className="";
preDiv.className="focus";
return;
}
}
else if(e.keyCode==40)//向下键
{
var nextDiv=divs[i+1];
if(nextDiv!=null)
{
divs[i].className="";
nextDiv.className="focus";
return;
}
}
else if(e.keyCode==13)//enter键
{
setTxt(divs[i].innerHTML);
return;
}
}
} //end for
}
}
}//end document.onkeydown
</script>
<br>
<form name="form1" method="post" action="">
<table width="498" border="0">
<tr>
<td width="136">Email: </td>
<td width="352"><textarea name="email" id="email" tabindex="1" onKeyUp="getEmail(event,this.value)" autocomplete="off" style="width:400;overflow:visible;word-break:break-all"></textarea></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table>
<div id="addr" style="display:none;position:absolute; background-color:#eeeeee"></div>
</form>
</body>
</html>
{
/// 上面代码一样
addr.focus();//=====================使addr获得焦点,这样按enter键就不会有换行了
}
function displayAll()
{
/// 上面代码一样
addr.focus();//=====================使addr获得焦点,这样按enter键就不会有换行了
}
function setTxt(v)
{
/// 上面代码一样
setTimeout('email.focus();',10);//用setTimeout使email 1ms后获得焦点,如果直接email.focus()的话会有换行,时间至少为1ms,有个时间差
}
{//======
addr.innerHTML=data;
addr.style.display="";
addr.focus();
}//======