用jquery-ui Autocomplete一步一步实现输入自动补全

用jquery-ui Autocomplete一步一步实现输入自动补全

首先看一下效果,如下图:



接下来看一下实现步骤:

第一步:下载jquery-ui,地址:http://jqueryui.com/autocomplete/


第二步:在页面引用,如下图:

图中红框内的为与Autocomplete相关的,其中,1,4是以上给出的地址中可以下载,注意把对应的图片

放置在正确的目录,3是jquery库,5是关键字高亮要用到的,jquery-ui默认不支持html,如果需要高亮关

键字,需要引用5。


页面需要自动补全的输入框:

<input type="text" id="searchContent">

2的内容如下:(自定义样式,可根据自己需求,进行修改)

/* highlight results */
.ui-autocomplete span.hl_results {
    background-color: #ffff66;
}

/* loading - the AJAX indicator */
.ui-autocomplete-loading {
    background: white url('/css/images/ui-anim_basic_16x16.gif') right center no-repeat;
}

/* scroll results */
.ui-autocomplete {
    max-height: 250px;
    overflow-y: auto;
    /* prevent horizontal scrollbar */
    overflow-x: hidden;
    /* add padding for vertical scrollbar */
    padding-right: 5px;
}

.ui-autocomplete li {
    font-size: 16px;
}

/* IE 6 doesn't support max-height
* we use height instead, but this forces the menu to always be this tall
*/
* html .ui-autocomplete {
    height: 250px;
}

5的内容如下:

/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

6的内容如下:

$(function() {
	var cache = {};
    $("#searchContent").autocomplete({
        source:function(request, response) {
			var term = request.term;
			if (term in cache) {
				response(cache[term]);
				return;
			}
			$.ajax({
				type : "POST",
				url : "autoComplete.action",
				data : "term=" + request.term,
				dataType : "json",
				success : function(data) {
					// 解析为js对象
					var result = JSON.parse(data);
					response(result);
				},
				error : function() {
					alert("错误");
				}
			});

		},
        minLength: 1,
        /*
         * 选中后的处理
         * select: function(event, ui) {
            var url = ui.item.id;
            if(url != '#') {
                location.href = '/blog/' + url;
            }
        },*/

        html: true, // optional (jquery.ui.autocomplete.html.js required)
	    // optional (if other layers overlap autocomplete list)
        open: function(event, ui) {
            $(".ui-autocomplete").css("z-index", 1000);
        }
    });

});
}

后台传送的JSON数据格式:

[
    {
        "id": "mysql-in-a-nutshell",
        "value": "MySQL in a Nutshell",
        "label": "<span class=\"hl_results\">MySQL</span> in a Nutshell"
    },
    {
        "id": "how-to-use-php-improved-mysqli-extension-and-why-you-should",
        "value": "How to Use PHP Improved MySQLi extension (and Why You Should)",
        "label": "How to Use PHP Improved <span class=\"hl_results\">MySQL</span>i extension (and Why You Should)"
    },
    {
        "id": "is-it-time-to-remove-mysql-in-favor-of-mariadb-in-production-servers",
        "value": "Is it time to Remove MySQL in favor of MariaDB in Production Servers?",
        "label": "Is it time to Remove <span class=\"hl_results\">MySQL</span> in favor of MariaDB in Production Servers?"
    }
]

java后台(Struts2):

Struts配置:

<action name="autoComplete" class="GoodsAction" method="autoComplete">
			<result type="json">
				<param name="root">result</param>
			</result>
		</action>

Action(这里采用lucene搜索方式):

private String term;
private String result; 

public String autoComplete() {
		List<AutoBean> abs = new ArrayList<AutoBean>();
		if (!term.trim().equals("")) {
			// 索引目录
			String filepath = ServletActionContext.getServletContext().getRealPath("/index");
			LuceneSearch<Goods> searcher = new AutocompleteQuery(new File(filepath));
			List<Goods> goods = searcher.search(term.trim(), "mixName");
			int size = goods.size();
			int min = (size > 10) ? 10 : size;  //设置最大显示条目为10
			if (goods != null && size > 0) {
				for (int i = 0; i < min; i++) {
					Goods g = goods.get(i);
					AutoBean ab = new AutoBean();
					ab.setId(g.getNeedName());
					ab.setValue(g.getNeedName());
					ab.setLabel(g.getName());
					abs.add(ab);
				}
				JSON json = JSONSerializer.toJSON(abs);
				this.result = json.toString();
				return SUCCESS;
			}
		}
		return SUCCESS;
	}

以上省略了部分代码,主要是传递的json数据需要有id,value,Label属性,label中可以加入html进行高亮,value

是选中后在输入框输入的值,所以需要设置原值,不能加入html。


关键字高亮可以使用lucene的Highlighter来实现。这里不再赘述,有问题可以留言。。。

这里在需要高亮的字上加上以下标签:

<spanclass="hl_results"> 关键字</span>


参考网址:http://www.pontikis.net/blog/jquery-ui-autocomplete-step-by-step



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据引用,autocomplete是element-ui的一个组件,用于处理模糊匹配的需求。用户可以输入一个单词,自动匹配到相关的内容。你可以在element-ui的官方网站上找到相关介绍和基本原理。 根据引用,在autocomplete的querySearch方法中可以实现以下内容: - 使用if-else判断是否希望在用户未输入内容时进行匹配。如果只希望在用户输入内容后才开始匹配,那么只需要保留if内的内容。 - 在cb()函数中输出返回的结果。具体返回的结果可以根据你的匹配方法决定,一般情况下根据用户输入的字符返回匹配到的结果。但也可以根据需求进行自定义匹配。 - 实现原理是根据之前定义的list中的label和name字段进行处理。可以根据用户输入时按照name字段进行匹配,并返回label字段。这样可以实现中英文匹配的情况。需要注意的是,匹配结果中的value字段才在页面上展示。如果你的list中没有value字段,页面上将不展示内容。这也使得前端可以实现自定义展示。 根据引用,后端匹配不需要获取字典。你只需要将前端输入的字符传给后端,等待后端匹配完成后将结果返回给你,然后你再将结果返回到页面即可。querySearch和cb是固定格式,前者表示输入的字段,后者是一个方法,表示输出的结果。 综上所述,element-ui的autocomplete组件可以实现缓存,具体实现方式根据你的需求和匹配方法的不同而定。123 #### 引用[.reference_title] - *1* *2* *3* [【element】el-autocomplete的常见用法](https://blog.csdn.net/qq_41443611/article/details/124320151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值