`
ldsjdy
  • 浏览: 151624 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JavaScript-输入提示效果

阅读更多
参考cssrain.cn上的一个demo,做了些修改,支持连续输入

[img]
http://dl.iteye.com/upload/attachment/435112/ee8f1c67-04e4-3a2c-b71f-692d12ff66e4.png
[/img]

<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>自动提示</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <script type = "text/javascript">

    //update 2010-07-06
    //增加可以连续输入多个,中间用逗号分开
    /***********************************************
     * Global variables
     ***********************************************/
    var maxResults = 10;	// max # of results to display
    var ignoreKeys = "";        //设置忽略的关键字
    var sMultiply =false;       //是否可以连续输入

    /***********************************************
     * Prototype for populating data
     ***********************************************/
    function get_data() {}

    /***********************************************
     * Find search keys in data set
     ***********************************************/
    function suggest(keywords,key,inputID,dataID,multiply)
    {
        var results = document.getElementById("results");
        sMultiply = multiply;
        var theinput=null;
        if(sMultiply){
            //keywords =keywords.toString();
            //将input的内容用split截取成数组,最多返回1000个
            theinput =keywords.split(",", 1000);
            //当输入为多个时只需要匹配最后一
            if(theinput.length>=1){

                keywords =theinput[theinput.length-1];
            }
        }else{
            keywords =keywords.toString();
        }
        if(keywords != "")
        {
            //获得数据
            var terms = get_data(dataID); // sort? -- data should be alphabetical for best results

            var ul = document.createElement("ul");
            var li;
            var a;

            if ((key.keyCode == '40' || key.keyCode == '38' || key.keyCode == '13'))
            {
                navigate(key.keyCode,theinput,inputID);
            }
            else
            {
                var kIndex = -1;

                for(var i = 0; i < terms.length; i++)
                {
                    kIndex = terms[i].activity.toLowerCase().indexOf(keywords.toLowerCase());

                    if(kIndex == 0)
                    {
                        li = document.createElement("li");

                        // setup the link to populate the search box
                        a = document.createElement("a");
                        a.href = "javascript://";

                        a.setAttribute("rel",terms[i].val);
                        a.setAttribute("rev", getRank(terms[i].activity.toLowerCase(), keywords.toLowerCase()));

                        //if(!document.all) a.setAttribute("onclick","populate(this,theinput);");
                        //else
                        //鼠标点击选中li进行提交
                        a.onclick = function() { populate(this,theinput,inputID); }

                        a.appendChild(document.createTextNode(""));

                        if(keywords.length == 1)
                        {
                            var kws = terms[i].activity.toLowerCase().split(" ");
                            var firstWord = 0;

                            for(var j = 0; j < kws.length; j++)
                            {
                                //	if(kws[j].toLowerCase().charAt(0) == keywords.toLowerCase()) {

                                ul.appendChild(li);

                                if(j != 0) {
                                    kIndex = terms[i].activity.toLowerCase().indexOf(" " + keywords.toLowerCase());
                                    kIndex++;
                                }

                                break;
                                //	}
                            }
                        }
                        else if(keywords.length > 1) {
                            ul.appendChild(li);
                        }
                        else continue;


                        var before = terms[i].activity.substring(0,kIndex);
                        var after = terms[i].activity.substring(keywords.length + kIndex, terms[i].activity.length);

                        //a.innerHTML = before + "<strong>" + keywords.toLowerCase() + "</strong>" + after;
                        var middle = terms[i].activity.substring(kIndex,keywords.length+kIndex);
                        a.innerHTML = before + "<strong>" +middle + "</strong>" + after;
                        li.appendChild(a);

                    }
                }

                if(results.hasChildNodes()) results.removeChild(results.firstChild);

                // position the list of suggestions
                var s = document.getElementById(inputID);
                var xy = findPos(s);

                results.style.left = xy[0] + "px";
                results.style.top = xy[1] + s.offsetHeight + "px";
                results.style.width = s.offsetWidth + "px";

                // if there are some results, show them
                if(ul.hasChildNodes()) {
                    results.appendChild(filterResults(ul));

                    if(results.firstChild.childNodes.length == 1) results.firstChild.firstChild.getElementsByTagName("a")[0].className = "hover";

                }

            }
        }
        else
        {
            if(results.hasChildNodes()) results.removeChild(results.firstChild);
        }
    }

    /***********************************************
     * Rank results - used for sorting result sets
     * 0 if entire row starts with kw
     * 0 < i < 1 if any word in row starts with kw (1k char max)
     * i > 1 if row contains kw anywhere else
     ***********************************************/
    function getRank(activity, keywords)
    {
        var ret = -1;
        var kIndex = activity.indexOf(keywords);

        ret = (activity.charAt(kIndex - 1) == " ") ? kIndex : (200*kIndex);

        return ret;
    }

    /***********************************************
     * Sort the result suggestion sets
     ***********************************************/
    function filterResults(s)
    {
        var sorted = new Array();

        for(var i = 0; i < s.childNodes.length; i++)
        {
            sorted.push(s.childNodes[i]);
        }

        var ul = document.createElement("ul");
        var lis = sorted.sort(sortIndex);

        for(var j = 0; j < lis.length; j++)
        {
            if(j < maxResults) ul.appendChild(lis[j]);
            else break;
        }

        return ul;

    }

    function sortIndex(a,b)
    {
        // wow thats ugly -- need logic around grouped items getting out of order
        return (a.getElementsByTagName("a")[0].rev - b.getElementsByTagName("a")[0].rev);
    }


    /***********************************************
     * Navigate using up/down and submit with 'Enter'
     ***********************************************/
    function navigate(key,theinput,inputID)
    {
        var results = document.getElementById("results");
        var keyIndex = document.getElementById("keyIndex");

        var i = keyIndex.value;

        if(i == "" || !i) i = -1;
        else i = parseFloat(i);

        var ul = results.childNodes[0];

        if(ul)
        {
            if(key == '40') // DOWN
            {
                i++;
                if(i > ul.childNodes.length-1) i = ul.childNodes.length-1;

                keyIndex.value = i;

                try {
                    ul.childNodes[i].getElementsByTagName("a")[0].className = "hover";
                    ul.childNodes[i-1].getElementsByTagName("a")[0].className = "";
                }
                catch(e) {}
            }
            else if(key == '38') // UP
            {
                i--;
                if(i <= 0) i = 0;

                keyIndex.value = i;

                try {
                    ul.childNodes[i].getElementsByTagName("a")[0].className = "hover";
                    ul.childNodes[i+1].getElementsByTagName("a")[0].className = "";
                }
                catch(e) {}
            }
            else if(key == '13' || key == '9') // ENTER/TAB -- POPULATE
            {
                if(i == -1) i = 0;
                populate(ul.childNodes[i].getElementsByTagName("a")[0],theinput,inputID);
            }
            else return;
        }
    }

    /***********************************************
     * Allow for using tab onkeydown
     ***********************************************/
    function tabfix(keywords, key)
    {
        if(key.keyCode == '9') {
            navigate(key.keyCode);
            return false;
        }
        else return true;
    }

    /***********************************************
     * Populate hidden fields via onclick on 'Enter'
     ***********************************************/
    function populate(a,theinput,inputID)
    {
        var ul = document.getElementById("results").childNodes[0];
        var inputold="";
        var inputObj =document.getElementById(inputID);
        var pick;
        try {
            if(theinput != null){
                pick = a.innerHTML.replace("<strong>","").replace("</strong>","")+",";

                // IE6 converts HTML elements to uppercase -- could be done with RegExp
                if(document.all) pick = a.innerHTML.replace("<STRONG>","").replace("</STRONG>","")+",";

                if(theinput.length>=1){
                    //多项输入时要用到
                    //重新将当前输入值前的值添加到input标签里
                    for(var i=0; i<theinput.length-1;i++){
                        inputold=inputold+theinput[i]+",";
                        //alert("the input:"+i+theinput[i]);
                        // alert("the input old:"+inputold);
                    }

                }
                //添加新配置的值
                inputObj.value=inputold+pick;
                //alert("jdl");
                //alert("inputlength:"+theinput.length);
                //document.getElementById("s").value = pick;
            }else{
                pick = a.innerHTML.replace("<strong>","").replace("</strong>","");

                // IE6 converts HTML elements to uppercase -- could be done with RegExp
                if(document.all) pick = a.innerHTML.replace("<STRONG>","").replace("</STRONG>","");
                inputObj.value=pick;
            }
        }
        catch(e) {}


        clearSuggest();
    }

    /***********************************************
     * Find an elements position on the screen
     ***********************************************/
    function findPos(obj)
    {
        var curleft = curtop = 0;
        if (obj.offsetParent) {
            curleft = obj.offsetLeft
            curtop = obj.offsetTop
            while (obj = obj.offsetParent) {
                curleft += obj.offsetLeft
                curtop += obj.offsetTop
            }
        }
        return [curleft,curtop];
    }

    /***********************************************
     * Helper to preserve onclick on suggestions
     ***********************************************/
    function clearSuggest()
    {
        // need a timeout so the onclick event is captured before results are hidden
        setTimeout("hideSuggest()",200);  //time setѡ  ʱ
    }

    /***********************************************
     * Hide the suggestions list and remove from DOM
     ***********************************************/
    function hideSuggest()
    {
        var results = document.getElementById("results");
        if(results.hasChildNodes()) results.removeChild(results.firstChild);

        document.getElementById("keyIndex").value = "-1"; // reset the suggestions index
    }

    // get list values;
    function getListvalues(listID)
    {
        var options = this.getOptions(listID);
        var values = new Array();
        //alert("options length:"+options.length);
        for (var i = 0; i < options.length; i++)
        {
            var flag = true;
            for(var j=0; j<values.length; j++){
                if(values[j] == options[i].innerText){
                    flag = false;
                    break;
                }
            }

            if(flag){
                values.push(options[i].innerText);
            }
        }
        // alert("values length"+values.length);
        return values;

    }


    function get_data(dataID )
    {
        var terms = new Array();
        // var values2 = getListvalues("fromLocation_ces");
       //获取其它控件的值放入数组中
      /* var values2 = getListvalues(dataID);
        for(var i=0;i<values2.length;i++){
            terms.push({val:1,activity:values2[i]});
        } */


        //alert("from location list values size:"+values2.length);
        //  alert("values2[0]"+values2[0]);
        var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

       for(var i=0;i<months.length;i++){
            terms.push({val:1,activity:months[i]});
        }
        return terms;

    }
</script>

    <style type = "text/css">

.nodisplay {
	display: none;
}

label {
	float: left;
	font: normal 12px Arial;
	width: 80px;
}

#s {
	width: 300px;
}

#results {
	position: absolute;
	top: 0;
	left: 0;
	width: 300px;
}

#results ul {
	border: 1px solid #bfbfbf;
	margin: 0;
	padding: 0;
	list-style: none;
	width: 100%;
}

#results ul li {
  text-align:left;
}

#results ul li a {
	display: block;
	color: #444;
	background: #fff;
	font: normal 12px arial;
	text-decoration: none;
	padding: 1px 4px 2px 6px;
}

* html #results ul li a {
	width: 100%;
}

#results ul li a strong {
	color: red;
}

#results ul li a:hover, #results ul li a.hover {
	background: #0056f4;
	color: #fff;
}

#results ul li a:hover strong, #results ul li a.hover strong {
	color: #fff;
}

</style>

  </head>
  <body>

      <!--参数设置为true 可以多选,中间用[,]隔开-->

      <input id="fromRetailGroup" type="text" onkeyup="suggest(this.value,event,this.id,'fromAndToRetailGroupList',false);" onkeydown="return tabfix(this.value,event);" onblur="clearSuggest();"  style="width:170px"/>

      <!--结果显示区域-->
		<p class="nodisplay">
			<label>kIndex</label>
			<input class="nodisplayd" type="text" id="keyIndex" />
		</p>
		<p class="nodisplay">
			<label>rev</label>
			<input class="nodisplayd" type="text" id="sortIndex" />
		</p>

		<div id="results"></div>
  
  </body>
</html>



  • 大小: 1.1 KB
分享到:
评论

相关推荐

    javascript经典特效---文本判断效果.rar

    这个效果通常用于检测用户输入的文本,比如验证表单、实现智能提示或者进行关键词匹配等。 在JavaScript中,文本判断通常涉及到字符串操作和正则表达式。字符串操作允许我们获取、修改和比较文本内容,例如`...

    JavaScript-学习笔记.pdf

    JavaScript是一种广泛应用于网页编程的语言,它是基于对象和事件驱动的脚本语言,常用于增强网页的交互性、动态效果和数据处理能力。在学习JavaScript时,我们通常会从以下几个重要知识点入手: 1. JavaScript的...

    JavaScript-Web素材实例

    - "带阴影的可拖动的浮动层.htm"展示了如何创建有阴影效果且可拖动的浮动窗口,常用于提示信息或设置面板。 - "JS模拟键盘密码输入器.htm"可能是一个用JavaScript模拟的软键盘,用于在输入密码时增加安全性,防止...

    50-javascript-programs

    通过实现特定的程序功能,如倒计时加载网页、确认删除提示以及文字跑马灯效果等,程序员可以学习到如何对网页元素进行动态控制,以及如何通过JavaScript增加用户交互的趣味性和网站的可用性。 ### 6. 时间格式转换 ...

    前端项目-JavaScript-autoComplete.zip

    3. **CSS样式**:一个.css文件可能用于定义自动完成组件的外观,包括输入框、提示列表的样式,以及选中项的高亮效果等。 4. **示例或测试**:可能包含一个index.html文件,用于展示如何使用这个自动完成组件,并...

    Javascript实现文本框输入提示

    Javascript实现的网页文本框输入提示 实现原理: 文本框输入内容后,搜索字符串数组,将匹配内容写入DIV以下拉列表形式展现,并支持方向键选择,效果类似搜索网站的输入提示。 友情提示: 较为粗糙的实现方法,...

    javascript智能提示框小例子

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态效果。在这个"javascript智能提示框小例子"中,我们将会探讨如何使用JavaScript创建自定义的提示框,以提供比浏览器默认...

    javascript经典特效---查看输入框内容.rar

    这里的`type="text"`定义了这是一个文本输入框,`id="myInput"`则为该输入框分配了一个唯一的标识符,`placeholder`属性用于在输入框内显示提示信息。 二、JavaScript获取输入框内容 1. `value`属性 JavaScript可以...

    使用JavaScript增强交互效果

    - **弹窗操作**:`alert()`、`prompt()`和`confirm()`分别用于显示提示消息、获取用户输入和确认操作。 - 示例代码: ```javascript alert("Hello, World!"); var name = prompt("What is your name?", "Your ...

    超强JavaScript效果[超强JavaScript效果]

    2. **鼠标悬停提示**:类似于163登录后的提示效果,这通常通过`title`属性或自定义JavaScript事件实现,当鼠标悬停在元素上时显示额外信息。 3. **文字省略号显示**:当文本内容超过指定宽度时,使用CSS的`text-...

    JavaScript实现文本框提示

    &lt;title&gt;JavaScript 实现效果 * { margin: 0px; padding: 0px; font-size: 12px; } input { width: 100px; height: 20px; border: 1px solid #ccc; } &lt;script language="javascript"&gt; function ...

    javascript提示类

    JavaScript提示类是网页交互中常用的一种功能,它用于向用户显示信息、确认操作或获取用户输入。在JavaScript中,有三种基本的内置提示对话框:`alert()`、`prompt()`和`confirm()`,它们都是window对象的方法。 1....

    javascript经典特效---在网页中运行代码.rar

    - **弹框提示**:使用`alert()`、`prompt()`或`confirm()`函数向用户显示信息、获取输入或确认操作。 - **表单验证**:在用户提交表单前,使用JavaScript进行前端验证,提高用户体验。 - **AJAX异步通信**:通过...

    javascript犀利的效果100个

    5. **表单验证**:JavaScript可以对用户输入进行实时验证,如检查邮箱格式、长度限制、非空验证等,提高用户体验。 6. **拖放功能**:HTML5引入了拖放API,JavaScript可以利用它创建可拖放的元素,实现更丰富的用户...

    javascript经典效果

    3. **输入提示(Prompt)**:`prompt()`函数允许开发者向用户请求输入,返回用户的输入值,可以用于简单的表单填写或获取用户反馈。 4. **DOM操作**:JavaScript可以通过Document Object Model (DOM)来操作网页元素...

    用javascript来验证的错误提示

    总结,用JavaScript进行错误提示不仅涉及基本的验证逻辑,还包括了DOM操作、CSS样式、动画效果等多方面的技术。通过合理的错误处理和良好的用户体验设计,我们可以创建出既美观又实用的错误提示系统。同时,考虑无...

    ASP.NET+Sqlserver 2008+JS智能提示框输入

    这个项目“ASP.NET+Sqlserver 2008+JS智能提示框输入”就是一个典型的示例,它结合了多种技术来实现一个功能,即在用户输入时提供智能提示。下面我们将详细探讨这些技术及其在项目中的应用。 首先,ASP.NET是微软...

    输入提示

    为了实现类似百度的输入提示效果,还需要考虑性能优化,如限制请求频率、缓存最近的查询结果,以及在用户输入过程中对请求进行节流和防抖处理,以减少不必要的网络请求。 总的来说,模拟百度提示是一个结合了前端...

    javascript用户注册提示效果的简单实例

    【JavaScript用户注册提示效果实现详解】 在Web开发中,用户注册界面通常需要提供实时的反馈,以指导用户正确填写信息。这个简单的JavaScript实例展示了如何在用户注册表单中实现这样的提示效果。通过JavaScript,...

    Ajax google效果 输入提示

    **Ajax Google效果输入提示**是一种常见的前端开发技术,它用于实现类似于Google搜索框的实时建议功能。这个技术的核心是利用Ajax(异步JavaScript和XML)来实现页面无刷新的数据交互,提升用户体验。在这个场景中,...

Global site tag (gtag.js) - Google Analytics