`
王牌海盗
  • 浏览: 239130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dojo控件FilteringSelect的使用经历

    博客分类:
  • DOJO
阅读更多

    最近在用dojo做一个项目的前台。版本是1.2.3,期间使用到了FilteringSelect这个下拉菜单控件。这个控件的功能不错,即可以像传统的select标签一样下拉选择,还可以让用户直接输入进行逐字搜索匹配。不过,东西毕竟是老外做的,使用时还是到了一些水土不服的问题,这些问题在网上搜过,但都没什么结果。现在有些问题解决了,有些没有很完美的解决。现在拿出来和大家一起分享和讨论一下。

问题1:FilteringSelect和ComboBox控件中文显示问题

发现FilteringSelect选定选项后,英文可以正常显示在控件中间,但中文有明显的上移,字体上面一小部分被遮盖,下面有较大的空隙。我想应该是dojo的css样式设定问题,于是找到了dijit\themes\dijit.css文件。其中有一段定义ComboBox文本框样式的

.dijitTextBox INPUT,
.dijitComboBox INPUT,
.dijitSpinner INPUT {
	border-left: solid black 1px;	
	display:inline;
	position:static !important;
	border:0 !important;	
	margin:0 !important;
   vertical-align:top!important;

	visibility:visible !important;
	background-color:transparent !important;
	background-image:none !important;
	width:100% !important;

}
 

 其中vertical-align这项默认竟然是top,现改为middle后,中文显示正常。


问题2: 在FilteringSelect中输入文字时,控件默认是按照从第一个字开始匹配的。现想对 可选项根据 输入的字进行包含式模糊查询的功能

 

之前查看了FilteringSelect的API,发现有个queryExpr的属性,根据说明

dojo.data query expression pattern. ${0} will be substituted for the user text. * is used for wildcards. ${0}* means "starts with", *${0}* means "contains", ${0} means "is"

这个*${0}*应该就是我们想要的包含查询了。于是将queryExpr=“ *${0}* ”属性加入到 FilteringSelect得input标签里。但发现这样声明并不起作用,无奈之下,翻了下ComboBox.js的源码,在其中发现了queryExpr属性初始化的位置如下

// labelType: String
//"html" or "text"
labelType: "text",
// queryExpr: String
//	dojo.data query expression pattern.
//	`${0}` will be substituted for the user text.
//	`*` is used for wildcards.
//	`${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"

queryExpr: "${0}*"

// ignoreCase: Boolean
ignoreCase: true,
 

 

无奈下,在代码中直接将queryExpr的初始值改为 "*${0}*" ,问题解决。

 

问题3:在 FilteringSelect输入中文后不像输入英文或数字一样自动进行搜索匹配,只能敲了空格再敲回退键的时候才触发显示提示选项

 

这个问题比较头疼。继续翻ComboBox的源码,找到ComboBox文本框处理按键事件的函数,如下

		_onKeyPress: function(/*Event*/ evt){
			// summary: handles keyboard events
			var key = evt.charOrCode;
			//except for cutting/pasting case - ctrl + x/v
			if(evt.altKey || (evt.ctrlKey && (key != 'x' && key != 'v')) || evt.key == dojo.keys.SHIFT){
				return; // throw out weird key combinations and spurious events
			}
			var doSearch = false;
			var pw = this._popupWidget;
			var dk = dojo.keys;
			if(this._isShowingNow){
				pw.handleKey(key);
			}
			switch(key){
				case dk.PAGE_DOWN:
				case dk.DOWN_ARROW:
					if(!this._isShowingNow||this._prev_key_esc){
						this._arrowPressed();
						doSearch=true;
					}else{
						this._announceOption(pw.getHighlightedOption());
					}
					dojo.stopEvent(evt);
					this._prev_key_backspace = false;
					this._prev_key_esc = false;
					break;

				case dk.PAGE_UP:
				case dk.UP_ARROW:
					if(this._isShowingNow){
						this._announceOption(pw.getHighlightedOption());
					}
					dojo.stopEvent(evt);
					this._prev_key_backspace = false;
					this._prev_key_esc = false;
					break;

				case dk.ENTER:
					// prevent submitting form if user presses enter. Also
					// prevent accepting the value if either Next or Previous
					// are selected
					var highlighted;
					if(this._isShowingNow && 
						(highlighted = pw.getHighlightedOption())
					){
						// only stop event on prev/next
						if(highlighted == pw.nextButton){
							this._nextSearch(1);
							dojo.stopEvent(evt);
							break;
						}else if(highlighted == pw.previousButton){
							this._nextSearch(-1);
							dojo.stopEvent(evt);
							break;
						}
					}else{
						// Update 'value' (ex: KY) according to currently displayed text
						this._setDisplayedValueAttr(this.attr('displayedValue'), true);
					}
					// default case:
					// prevent submit, but allow event to bubble
                                      
                 // 加入按下enter键后触发搜索
                 doSearch = true;

					evt.preventDefault();
					// fall through

                          ...........................................
					}
			if(this.searchTimer){
				clearTimeout(this.searchTimer);
			}
			if(doSearch){
				// need to wait a tad before start search so that the event
				// bubbles through DOM and we have value visible
				setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);
			}
		}
   

搜了下官网论坛,发现亚洲语言都会有这个问题,上面也没有可借鉴的解决方案,这个问题直接原因应该是中文字都是通过输入法软件进行录入的,控件文本框中无法捕捉到键盘的敲击事件导致无法触发search方法。

我目前一个变通方式就是在捕捉到enter事件后进行search,添加代码如上。用户在输入文字后按enter键进行模糊查询并显示搜索后可选项。

 

最后一个问题不知道有没有更好的解决方法,期待ing。

 

 

0
0
分享到:
评论
1 楼 alanland 2013-07-25  
dojo 的资料好难找,大侠 现在还在 iteye吗?

相关推荐

    dojo控件的使用和入门心得

    ### Dojo控件的使用和入门心得 #### Dojo简介及其优势 Dojo是一个功能强大的JavaScript框架,专门设计用于简化富互联网应用(RIA)的开发。作为一种DHTML Toolkit,Dojo封装了大量的常用功能,旨在提高前端开发...

    DOjo中文使用手册

    DOjo中文使用手册 DOjo中文使用手册是DOjo Toolkit的详细使用手册,涵盖了DOjo的安装、使用、调试等方面的知识点。本手册适合新手和有经验的开发者,旨在提供一个全面的DOjo使用指南。 DOjo安装 DOjo提供了三种...

    Dojo框架使用教程

    本教程将深入探讨Dojo框架的使用,帮助开发者更好地理解和应用这一工具。 首先,从`dojo-release-0.9.0.tar.gz`这个文件名可以看出,这是一个Dojo框架的早期版本,版本号为0.9.0。在学习过程中,了解不同版本间的...

    【ASP.NET编程知识】ASP.Net中英文复合检索文本框实现思路及代码.docx

    文章分为两部分,第一部分介绍了使用Dojo的FilteringSelect组件实现拼音检索功能,第二部分介绍了使用JqueryUI的autocomplete插件实现拼音检索功能。 一、Dojo的FilteringSelect组件实现拼音检索功能 Dojo的...

    dojo dojo实例 dojo例子 dojo资料 dojo项目 dojo实战 dojo模块 dojo编程

    1. **模块系统**:Dojo使用AMD(Asynchronous Module Definition)模块定义协议,允许异步加载模块。`require`和`define`是两个关键函数,`require`用于加载模块,`define`用于定义模块。 2. **dojo/_base**:这是...

    dojo的datagrid使用

    Dojo DataGrid是一个功能丰富的表格控件,它允许用户以表格形式展示大量数据,同时提供排序、筛选、分页等功能。DataGrid可以与各种数据源(如JsonRest、Store等)配合,动态加载和更新数据。 2. **配置DataGrid**...

    在 Spring Web MVC 环境下使用 Dojo

    3. **创建 Dojo 控件**:在JavaScript中,使用 `dojo.require()` 加载所需模块,然后创建 Dojo 控件实例,如 DataGrid,配置其属性和数据源。 4. **Spring MVC 控制器**:创建 Spring MVC 控制器处理前端请求,返回...

    Dojo框架英文使用指南

    这份“Dojo框架英文使用指南”涵盖了Dojo的核心概念、组件以及最佳实践,旨在帮助开发者深入理解和有效地使用这一工具集。 Dojo框架的主要特点包括模块化、高性能、丰富的UI组件、数据绑定以及对异步操作的支持。...

    DOJO 学习笔记 dojo

    在 Dojo 中,使用 `dojo.require` 来声明所需的模块和包,类似于其他编程语言中的导入或使用语句。 `djConfig` 是 Dojo 的全局配置对象,允许你在页面加载前设置 Dojo 的行为。例如,`isDebug` 属性可以设置为 `...

    dojo 1.9 Tutorials(使用说明)

    在使用Dojo时,通常会先加载这个基础模块。 3. **dojo/ready**: 用于在DOM准备就绪或页面完全加载后执行指定的函数,是Dojo中的一个重要概念,确保在执行代码时,DOM已经完全构建完毕。 4. **dojo/store**: 提供了...

    dojo精品中文教程(包一)

    DOJO学习笔记(七)-日期控件DropdownDatePicker和DatePicker DOJO常用的验证函数 Dojo with Adobe AIR Dojo 工具包教程 Dojo 快速安装 Dojo和JSON建立无限级AJAX动态加载的功能模块树 Dojo学习笔记( 模块与...

    精通Dojo by Dojo之父

    Dojo是一个非常强大的、面向对象的、开源的JavaScript工具箱,它为开发富客户端Ajax...学习完本书后,读者不仅能熟悉Dojo框架的使用,还能了解Ajax框架的工作原理,最重要的是,还能随心所欲地开发出自己的RIA应用。

    dojo精品中文教程(全)

    DOJO学习笔记(七)-日期控件DropdownDatePicker和DatePicker DOJO常用的验证函数 Dojo with Adobe AIR Dojo 工具包教程 Dojo 快速安装 Dojo和JSON建立无限级AJAX动态加载的功能模块树 Dojo学习笔记( 模块与...

    dojo精品中文教程(包二)

    DOJO学习笔记(七)-日期控件DropdownDatePicker和DatePicker DOJO常用的验证函数 Dojo with Adobe AIR Dojo 工具包教程 Dojo 快速安装 Dojo和JSON建立无限级AJAX动态加载的功能模块树 Dojo学习笔记( 模块与...

    dojo文档 dojo文档 dojo文档

    dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档

    Dojo 入门 + Dojo 工具包系列 + Dojo 使用技巧 ......

    在使用Dojo进行Ajax通信时,Dojo的`dojo.xhr`模块提供了与服务器端进行异步数据交换的接口。它可以处理各种HTTP请求类型,如GET、POST、PUT和DELETE,支持JSON、XML等多种数据格式,为开发者提供了统一的API。 Dojo...

    麻雀虽小五脏俱全 Dojo自定义控件应用

    【Dojo自定义控件应用】 Dojo是一个强大的JavaScript库,专为构建复杂的DHTML应用程序设计。它通过解决DHTML的遗留问题,如浏览器兼容性、动态内容管理和事件处理,为开发者提供了一套完整的工具集。尽管Dojo的文档...

    dojo中文文档-dojo手册

    通过使用dojo.require和dojo.provide,开发者可以实现代码的模块化,提高代码复用性和可维护性。 Dojo的dojo.query方法类似于jQuery的选择器,用于选取页面中的DOM元素。此外,Dojo还提供了一套强大的DOM操作API,...

    Dojo工具使用说明

    在实际使用中,如需使用日期控件,首先需要引入`dojo.js`,然后通过`dojo.require`加载所需模块。在HTML中,可以使用`dojoType="dropdowndatepicker"`属性创建日期选择器,并通过`dateFormat`、`weekStartsOn`、`...

    dojo js dojo js

    dojo js dojo js dojo js dojo js dojo js dojo js dojo js

Global site tag (gtag.js) - Google Analytics