`

input输入下列提示

阅读更多

今天在项目中遇到一个需求,就是在input输入框中录入数据时(名字),如果敲入了一部分,在数据库中存在已有的姓名的前缀与之匹配,就弹出一个 google页面那种效果的下拉框,把相关的姓名列出来供他选择。可以用箭头上下选择,也可以用鼠标选择。这样可以提高录入的效率。

    输入框的布局如下:

  

  最终的效果如下:





  表单中输入框的html代码为:
<tr><td>发件人</td><td><input type="text" name="sendername" id="sendername" value=""/></td></tr>



为了在输入一些内容时,能够显示出那个选择框,我们要建立一个div,初始时不可见,当需要时就显示出来,并且将它移动到正确的位置。这个div采用的定位为绝对定位,这样就可以在整个页面用left和top来定位了,z-index为99,这样就可以盖住下面的东西。选择框的div为:
<div id="helper" class="gac_m" style="visibility:hidden;" width="100%">
</div>

gac_m的css定义为:
.gac_m {
background:white none repeat scroll 0 0;
border:1px solid black;
cursor:default;
font-size:13px;
line-height:17px;
margin:0;
position:absolute;
z-index:99;
width:100px;
left:10px;
top:10px;
}

当需要显示时,我们需要将id为helper的div移动到正确的位置,这个位置就是input输入框的正下方,left即为input的相对页面左边的位移,top即为input相对页面上边的位移加上input本身的高度。现在的问题是怎么取得一个元素的相对页面的绝对位置,这个可以通过 offsetParent取的父亲结点递归的来算。下面函数getAbsPosition用来取得元素obj的绝对位置,gettable(obj)用来把id为helper的div定位到obj正下方:
function getAbsPosition(obj) {
    var r = {
        left: obj.offsetLeft,
        top : obj.offsetTop
    };
    r.left = obj.offsetLeft;
    r.top  = obj.offsetTop;
    if(obj.offsetParent) {
        var tmp = getAbsPosition(obj.offsetParent);
        r.left += tmp.left;
        r.top  += tmp.top;
    }
    return r;
  }
  function gettable(obj) {
    var pos = getAbsPosition(obj);
    pos.top += obj.offsetHeight;
    document.getElementById('helper').style.top = pos.top + "px";
    document.getElementById('helper').style.left = pos.left + "px";
    document.getElementById('helper').style.width = obj.offsetWidth + "px";
    document.getElementById('helper').style.visibility = '';
  }

现在可以定位并且显示id为helper的div了,下面的问题是当输入框中的内容改变时,采用Ajax去服务器取得数据,然后更新div中的内容,并且显示出来。那么怎么侦测输入框中的内容改变了呢?如果采用onchange事件,只有当输入框失去焦点时才会触发,所以我们只有采用定时器的方式了,每隔一个时间片检查一下输入框的值,如果值改变了,就执行更新过程。下面checkvalue函数就是用来给定时器的函数,用来检查输入框的内容是否改变,getNameResponse是Ajax的回调函数,用来对服务器传回的JSON数据解码并且以一定的方式显示在div中。
function checkvalue() {
    var nowvalue = document.getElementById('sendername').value;
    if(prevalue != nowvalue) {
        Ajax.call('useradv.php?act=getsendername&name='+nowvalue,'',getNameResponse, 'GET', 'JSON');
    }
    prevalue = nowvalue;
    setTimeout(checkvalue,100);
  }
  function getNameResponse(result) {
    var info = result.content;
    var html = '<table width="100%">';
    for(var i = 0;i < info.length; i++) {
        html += '<tr id="tr' + (i+1) +'" onmouseover="choosetr(' + (i+1) +');" onclick="selecttr();">'
               + '<td colspan="2">' + info[i].sendername + '</td></tr>';
    }
    html += '<td align="left"><font color="red">按空格键选择</font></td>'
           +'<td align="right"><a href="#" onclick="document.getElementById(\'helper\').style.visibility=\'hidden\';">'+
           '关闭</a></td></tr></table>';
   
    document.getElementById('helper').innerHTML = html;
    if(info.length > 0) {
        gettable(document.getElementById('sendername'));
    }else{
        document.getElementById('helper').style.visibility ='hidden';
    }
  }

其中tr的className为gca_b表示该行被选中,其CSS定义为:
.gac_b {
background:#3366CC !important;
color:white;
}



下面需要解决的问题是用向上和向下的按键来在选择框中选择,这样就需要检测键盘按键了,可以直接通过document.onkeydown来注册按键检测函数,当按下向上和向下的键时,就上下移动选中的行,函数choosetr(nextid)用来选择第nextid行,当然需要记录nowid为前面选中的行,然后selecttr()是当按了空格键或者用鼠标点击了后模拟选中的动作,用选中的值来填充input。
var nowid = 0;
function selecttr() {
    try
    {
        if(document.getElementById('helper').style.visibility == 'hidden') return;
        document.getElementById('sendername').value =
document.getElementById('tr'+nowid).cells[0].innerHTML;
        setTimeout(function(){

                        document.getElementById('sendername').value

                        =Utils.trim(document.getElementById('sendername').value);},50);     

        falg = false;
        nowid = 0;
        var eles = document.getElementsByName('trname');
        for(var i = 0; i < eles.length; i++) {
            eles[i].className = '';
        }
        document.getElementById('helper').style.visibility ='hidden';
    }
    catch (e)
    {
    }
  }
document.onkeydown = function(e) {
    var keycode;
    try
    {
        keycode = event.keyCode;
    }
    catch (err)
    {
        keycode = e.keyCode;
    }
    if(keycode == 40) {
        //按了向下的键
        choosetr(nowid+1);
    } else if(keycode == 38) {
        //按了向上的键
        choosetr(nowid-1);
    } else if(keycode == 32) {
        selecttr();
    }
  }
  function choosetr(nextid) {
     var len = 0;
     do
     {
        try
        {
            var obj = document.getElementById('tr'+(len+1));
            if(obj) len++; else break;
        }
        catch (e)
        {
            break;
        }
     }while(1);
     if(nextid > len) nextid = 1;
     if(nextid < 1) nextid = len;
     if(nowid >=1 && nowid <= len) {
         document.getElementById('tr' + nowid).className = '';
     }
     document.getElementById('tr' + nextid).className = 'gac_b';
     nowid = nextid;
  }
  setTimeout(checkvalue,100);

这样就可以了,最后需要注意的是有个小问题:浏览器自带的自动历史选择下拉框会与我们做的冲突,解决方法就是设置input的oncomplete="off"。

最后贴一下服务器端的php程序:


elseif ($action == 'getsendername') {
    $name = trim($_GET['name']);
    $rows = array();
    if(strlen($name) > 0) {
        $sql = "select distinct sendername from ".$GLOBALS['ecs']->table('useradv').
               " where sendername like '$name%' and sendername != '$name' limit 0,10";
        $rows = $GLOBALS['db']->getAll($sql);
    }
    include_once(ROOT_PATH . 'includes/cls_json.php');
    $json = new JSON();
    $result = array('error'=>0, 'message'=>'', 'content'=>'');
    $result['content'] = $rows;
    die($json->encode($result));
}

 

分享到:
评论

相关推荐

    CSS3实现动态输入框input框特效.zip

    结合JavaScript,我们可以进一步优化动态效果,比如在输入时实时显示字符数,或者在输入错误时给予用户友好的提示。在实际项目中,这样的特效不仅可以使网页表单更具吸引力,也能有效地提升用户的操作效率和满意度。

    用Python写程序实现摄氏温度与华氏温度的转换

    用Python写程序实现摄氏温度与华氏温度的转换 F=input('请输入华氏温度:'); C=(float(F)-32)/1.8; print('对应的摄氏温度:',C);

    《输入、输出、赋值语句》.ppt

    输入语句的一般格式是:INPUT “提示内容”;变量。例如,输入一个学生数学、语文、英语三门课的成绩,可以写成:INPUT “数学,语文,英语”; a,b,c。 注意:INPUT 语句不但可以给单个变量赋值,还可以给多个...

    只能输入数字的输入框特效代码

    如果用户输入了非数字字符,可以清除输入或者给出提示: ```javascript document.getElementById('numericInput').addEventListener('input', function(e) { var value = e.target.value; if (/^\d*$/.test(value...

    圆柱体积,用java代码

    用java求圆柱体积;import java util Scanner; public class Cylinder{ public static void main String[] args { System out print &quot;Enter the radius and length of ... float length input nextFlo [更多]

    学生管理 数据结构 C语言

    1. 输入学生信息:`Input_struct`函数负责获取用户输入并存储到结构体中。通过循环确保输入的年龄在合理范围内(10-30岁),成绩在0-100分之间。 ```c void Input_struct(ElemType *stu){ // ... (输入逻辑) } ```...

    试题python基础试题(含答案)复习知识点试卷试题.doc

    当程序运行`S=input()`并输入6,随后执行`print(S * 3)`时,将打印出输入值的三次重复,即"666"。 循环结构如`for`用于迭代序列,如在`range(1,10)`中,可以累加所有数字得到总和。在给定的`for`循环中,变量`s`的...

    数据结构c语言 学生成绩管理系统

    - 每个功能都由单独的函数实现,例如`input()`用于输入学生数据,`sort()`用于排序等。 - 函数间通过全局变量`now_no`来记录当前系统中学生数据的数量。 #### 五、小结 通过对上述代码及描述的分析可以看出,这...

    python入门与实践--作业21

    用户输入的字符串可以用`input()`获取。将字符串转换为全小写或全大写,可以使用`lower()`或`upper()`方法。创建一个空列表,遍历字符串,遇到字母就添加到列表中。为了避免重复,可以使用集合来消除重复元素。最后...

    NCT全国青少年编程能力等级测试python一级练习.pdf

    21. 有python程序如下a=int(input())b=int(input())c=input()if c=='+': print(a+b)elif c=='-': print(a-b)elif c=='*': print(a*b)elif c=='/': print(a/b)else:print(“输入错误,请重试”)当程序运行后,小新...

    第一章Python快速入门.pdf

    在命令行中输入`python`即可启动解释器,此时会出现一个&gt;&gt;&gt;提示符,供你输入Python语句并实时执行。例如,打印"Hello World"的命令`print("Hello World")`可以直接在解释器中输入并观察结果。Python源代码文件通常以...

    SAP LSMW手工生产订单作业量批导入.docx

    * 在窗口中输入下列参数:Project:FICOSubproject:MASTER-DATAObject:KB21N。 * 选中 Specify Files 行并双击或按 F8 执行。 步骤 6-8:读取文件数据 * 点击,修改为修改状态,并双击行位置。 * 在 FILE 中,...

    C#、数据库试题

    - 用户输入处理:在C#控制台应用程序中,若需接收用户输入的整数,应使用`int i = int.Parse(Console.ReadLine());`,如选项D所示。 2. WinForms应用 - MDI父窗体设定:在WinForms应用程序中,要使一个窗体成为...

    python基础试题(含答案)图文复习知识点试卷试题.doc

    题目中提到的`random()`是生成随机数的函数,`sqrt()`是计算平方根的函数,而`input()`则是用于接收用户输入的数据。 2. 流程图表达:程序段`for i in range (1,6): print('*')`会打印5个星号`*`,因此对应的流程图...

    Web实现登录注册功能.rar

    HTML元素如input用于收集用户输入,button触发提交事件,可能还包含一些JavaScript验证代码,确保数据格式正确。 - css文件夹:存放样式表,用于美化界面,包括字体、颜色、布局等方面,提高用户体验。 - html...

    C++实验C++入门练习

    8. P60 2_299、P61 2_361 0、实现一个简单的菜单程序,运行时显示“Menu:A(add) D(delete) S(sort)Q(uit),Select one:”,提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入2为A,D,S时,分别提示...

    Matlab期末考试题库(共套卷)-50页.pdf

    * Matlab 命令行提示符 “&gt;&gt;” 表示 Matlab 准备好接受用户的输入命令,而 “│” 标志表示输入提示符,用于提示用户输入命令或表达式。 2. 符号表达式 sin(2*a+t)+m 中独立的符号变量为 t。 * 符号表达式 sin(2*...

    客户服务工程师入职考试题借鉴.pdf

    * 如何调出命令提示符:可以通过按下Windows键+R键,然后输入cmd并回车键来调出命令提示符。 * 如何编辑注册表:可以通过按下Windows键+R键,然后输入regedit并回车键来编辑注册表。 * 万用表的使用:万用表可以用来...

    【精选】最新最全Matlab考试试题库答案解析2023.pdf

    在MATLAB命令窗口中的“&gt;&gt;”标志为MATLAB的命令行提示符,“│”标志为输入提示符。** - **解析:** - `&gt;&gt;`是MATLAB命令窗口中的默认提示符,表示等待用户输入命令。 - “│”通常不是MATLAB的标准提示符,这里...

Global site tag (gtag.js) - Google Analytics