`
libo_591
  • 浏览: 40118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过分析jqueryui源码,调用其私有方法

 
阅读更多

jqueryui是一个优秀的组件库,合理利用并封装其代码,可以创造出自己的组件库,使用过程中,避免不了的需要深入其源码,并调用其内部的一些方法,来完成自己的需求。

 

需求场景:

jqueryui的autocomplete功能,为输入框中输入值,则自动进行suggest,但是现在有一个需求,即不让其自动提示,而是通过点击按钮来触发。

解决:

通过参数设置,是肯定不能完成这个功能了。仔细看了其source参数的自定义方式,也不能满足这个需求,进而查看其源码,发现其从输入到发送请求,到最后展现div列表项,经历了ui.autocomplete的如下方法调用

search->_search->source->response->_response->_normalize->_suggest

 

其中respone以后,即为数据返回后,开始创建DIV列表项了,那我们要去从中间开始,连接上这一长串的调用,就要手动调用search或者_search中的一个方法,通过对2个方法的对比,最终决定选择_search方法,其函数如下:

 

_search: function( value ) {

		this.element.addClass( "ui-autocomplete-loading" );

		this.source( { term: value }, this.response );
	}

 

显然,只要调用这个方法,并且把输入框的值,传入函数,那么接下来的动作,就又可以交给组件进行了。

 

接下来就蛋疼了,关于怎么调用这个方法,颇费了一番周折。

先把调用的结果写法列出来,然后再具体分析:

 

if(!settings.auto){
				settings.minLength=1024;
				$.ui.autocomplete.prototype.rqcussearch=function( value ) {
					this._search(value);
				};
				$("#"+$(obj).attr("id")+"_rqautoqueryimg").bind("click",function(event){
					setTimeout(function(){
						inputobj.autocomplete("rqcussearch",inputobj.val());
					},settings.delay);
				});
			}
			inputobj.autocomplete(settings);

 

 

代码大概为,如果传来参数说不使用自动suggest,那么就将autocomplete的提示文字限制放大到1024,接下来,在ui.autocomplete对象上,添加一个自己的方法(后面再说为什么要添加方法,而不是直接调用),然后,给按钮或者图片,绑定一个click事件,点击后,再调用查询方法。这里click事件,使用了setTimeout,稍微做了延迟,也是有其用处的,后面再说。。。

 

(1)$.ui.autocomplete.prototype 是什么东西?

调试中,我试过各种办法去调用,不过都死在无法正确给对象指定this上,那么jqueryui中的组件autocomplete的this,到底是什么?就是$.ui.autocomplete.prototype东西,怎么得出的,还是得看源码中的相关函数,具体位置为如下代码片段:

$.widget( "ui.autocomplete", {

....

_search:function(value){xxxx},

....

});

 

这里是对autocomplete组件的一个声明和定义,而明显的,其是通过$.widget方法来进行的。

 

此方法定义如下:

 

 

$.widget = function( name, base, prototype ) {
	var namespace = name.split( "." )[ 0 ],
		fullName;
	name = name.split( "." )[ 1 ];
	fullName = namespace + "-" + name;

	if ( !prototype ) {
		prototype = base;
		base = $.Widget;
	}

	// create selector for plugin
	$.expr[ ":" ][ fullName ] = function( elem ) {
		return !!$.data( elem, name );
	};

	$[ namespace ] = $[ namespace ] || {};
	$[ namespace ][ name ] = function( options, element ) {
		// allow instantiation without initializing for simple inheritance
		if ( arguments.length ) {
			this._createWidget( options, element );
		}
	};

	var basePrototype = new base();
	// we need to make the options hash a property directly on the new instance
	// otherwise we'll modify the options hash on the prototype that we're
	// inheriting from
//	$.each( basePrototype, function( key, val ) {
//		if ( $.isPlainObject(val) ) {
//			basePrototype[ key ] = $.extend( {}, val );
//		}
//	});
	basePrototype.options = $.extend( true, {}, basePrototype.options );
	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
		namespace: namespace,
		widgetName: name,
		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
		widgetBaseClass: fullName
	}, prototype );

	$.widget.bridge( name, $[ namespace ][ name ] );
};

 

通过阅读,可以知道,他会把传来的组件字符串名,分配到相应的属性上,并定义其方法,原型等

 

我们重点关注其最后一行的$.widget.bridge( name, $[ namespace ][ name ] );函数

 

查看其方法定义如下:

 

 

$.widget.bridge = function( name, object ) {
	$.fn[ name ] = function( options ) {
		var isMethodCall = typeof options === "string",
			args = Array.prototype.slice.call( arguments, 1 ),
			returnValue = this;

		// allow multiple hashes to be passed on init
		options = !isMethodCall && args.length ?
			$.extend.apply( null, [ true, options ].concat(args) ) :
			options;

		// prevent calls to internal methods
		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
			return returnValue;
		}

		if ( isMethodCall ) {
			this.each(function() {
				var instance = $.data( this, name ),
					methodValue = instance && $.isFunction( instance[options] ) ?
						instance[ options ].apply( instance, args ) :
						instance;
				// TODO: add this back in 1.9 and use $.error() (see #5972)
//				if ( !instance ) {
//					throw "cannot call methods on " + name + " prior to initialization; " +
//						"attempted to call method '" + options + "'";
//				}
//				if ( !$.isFunction( instance[options] ) ) {
//					throw "no such method '" + options + "' for " + name + " widget instance";
//				}
//				var methodValue = instance[ options ].apply( instance, args );
				if ( methodValue !== instance && methodValue !== undefined ) {
					returnValue = methodValue;
					return false;
				}
			});
		} else {
			this.each(function() {
				var instance = $.data( this, name );
				if ( instance ) {
					instance.option( options || {} )._init();
				} else {
					$.data( this, name, new object( options, this ) );
				}
			});
		}

		return returnValue;
	};
};

 

 

这个方法,就很明显了,大概意思为当调用组件的入口方法(如:inputobj.autocomplete(settings);)时,所进行的逻辑。比如判断传来的参数是否为方法,是方法则调用,不是则设置属性。

 

方法调用的判断中,有这么一句话,也值得我们关注:

 

 

if ( isMethodCall && options.charAt( 0 ) === "_" ) {

return returnValue;

}

 

什么意思,就是说你要是调用了它以_开头的方法,就直接返回,也就是不允许你对其定义的私有方法进行调用,这也就是,我为什么要给起对象,添加一个rqcussearch方法的原因了。

 

 

看到了以上的分析,我想我们已经对jqueryui的源码,有了初步的,整体的了解,那么以后我们在使用时,遇到了问题,就无往而不利了

分享到:
评论

相关推荐

    jquery api, jquery ui api, jquery源码分析

    **jQuery API** jQuery 是一款广泛使用的 JavaScript 库,它的出现极大地简化了网页的 ...通过学习jQuery API、jQuery UI API以及源码分析,开发者不仅可以提升开发效率,还能编写出更高效、更优雅的JavaScript代码。

    JQUERY UI 开发指南源码

    通过分析这些代码,你可以深入理解jQuery UI的工作原理,并学会如何在自己的项目中应用。 此外,jQuery UI还支持主题系统,允许开发者自定义组件的外观。书中可能有对应的示例展示如何创建和应用自定义主题。学习这...

    JqueryUI 源码

    总之,通过深入研究jQuery UI的源码,开发者不仅可以掌握这个库的工作原理,还能从中学习到优秀的代码组织方式和最佳实践,这将有助于提升前端开发技能,并能更好地利用jQuery UI来构建用户友好的Web应用程序。

    jQuery源码 jQuery源码 jQuery源码

    jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码...

    jquery ui强大的UI功能组件源码

    标题中的“强大的UI功能组件源码”指的就是 jQuery UI 的源代码,这为开发者提供了一个深入理解其工作原理的机会,同时也可以根据项目需求进行定制化开发。源码分析可以帮助开发者优化性能,修复潜在问题,或者添加...

    jquery UI 1.7源代码

    总结起来,jQuery UI 1.7源代码提供了丰富的用户界面解决方案,通过研究源代码,开发者不仅可以理解其工作原理,还可以学会如何自定义组件、创建新主题,甚至扩展新的功能。对于想要提升前端开发技能的工程师来说,...

    jquery ui messager 消息框

    8. **插件架构**:jQuery UI Messager遵循jQuery插件开发模式,通过链式调用来初始化和配置插件,提供了一种模块化和可复用的代码结构。 9. **API和方法**:插件通常会提供一组API接口和方法,例如`$.messager.show...

    JQuery UI 中文帮助文档

    3. **调用方法**:对选中的元素调用jQuery UI提供的方法,如`$(selector).tabs()`来创建选项卡。 4. **配置选项**:可以通过参数设置组件的具体行为和外观,如`$(selector).dialog({width: 500, modal: true})`创建...

    bootstrap&jQueryUI例子

    在"bootstrap&jQueryUI例子"这个压缩包中,可能包含的是结合了这两个框架的示例代码或项目。这些示例通常会展示如何在同一个页面中有效地利用 Bootstrap 的布局和样式,同时引入 jQuery UI 的组件,实现更复杂的用户...

    JqueryUI源码JS

    JUERY UI源码,JqueryUI官方源码,绝对好用

    jQuery UI组件 jQuery UI

    接着,通过jQuery的选择器和`.ui()`方法来激活UI组件,例如创建一个对话框: ```javascript $(function() { $("#dialog").dialog(); }); ``` 同时,jQuery UI 提供了许多可定制的选项,如宽度、高度、是否可拖动、...

    jquery ui

    2. **选择器与方法**:通过jQuery的选择器找到需要操作的DOM元素,然后调用jQuery UI提供的方法,如`$("#dialog").dialog()` 创建一个对话框。 3. **配置参数**:许多jQuery UI的方法接受一个配置对象作为参数,...

    最新jQueryUI组件下载

    这个“最新jQueryUI组件下载”应该指的是版本号为1.10.0的jQuery UI压缩包。 jQuery UI 包含了大量的可交互和视觉上吸引人的元素,它简化了网页开发,让开发者可以快速实现复杂且用户友好的界面设计。以下是一些...

    jquery ui & themes

    《jQuery UI与主题设计详解》 在Web开发领域,jQuery UI是一个强大且广泛使用的JavaScript库,它基于...通过深入理解和熟练使用jQuery UI,开发者可以更高效地构建富客户端应用,同时保证其视觉效果的专业和一致性。

    jquery ui jquery ui

    5. **API和事件**:jQuery UI 提供了详细的API文档,开发者可以通过调用特定方法来启用或配置组件。此外,每个组件都与特定的jQuery事件相关联,如open、close、drag等,这使得在用户与界面交互时可以进行精确控制。...

    前端项目-jqueryui-touch-punch.zip

    在“前端项目-jqueryui-touch-punch”这个项目中,包含的文件可能是jQuery UI Touch Punch的源码或示例。通过解压并研究这个项目,你可以了解到如何将这两个工具结合到自己的Web应用中,以提供兼容触摸设备的用户...

    jQuery全能权威指南:jQuery Core+jQuery Plugin+jQuery UI+jQuery Mobile 源码

    图书的源代部分; 还有由于容量的原因, 视频和web实例图片没有上传. 《jQuery全能权威指南:jQuery Core+jQuery Plugin+...、jQuery UI、jQuery Mobile以及大量第三方的插件库和2800多个应用jQuery技术的网页参考。

    jQueryUI API文档资料

    开发者可以通过查阅文档了解如何配置组件,何时调用方法,以及响应哪些事件。 7. **兼容性**:jQuery UI通常与最新的jQuery版本兼容,但也支持旧版jQuery,确保了广泛的应用场景。不过,随着技术的发展,建议始终...

    一套比较好的jquery UI

    jQuery UI 的优势在于其灵活性和可扩展性,允许开发者轻松地组合和自定义组件,以满足不同项目的需求。同时,由于它建立在广泛使用的jQuery库之上,拥有庞大的社区支持,遇到问题时能找到丰富的资源和解决方案。总之...

    JqueryUI甘特图源码_f5d014bf-c4cb-4a76-b825-cdbbdd0fcfc7.rar

    总的来说,JqueryUI的甘特图源码为我们提供了一个学习和实践的平台,通过对源码的研究,我们可以深入了解前端开发中的数据可视化技术,同时也能提高我们使用JqueryUI和其他JavaScript库构建复杂用户界面的能力。...

Global site tag (gtag.js) - Google Analytics