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 是一款广泛使用的 JavaScript 库,它的出现极大地简化了网页的 ...通过学习jQuery API、jQuery UI API以及源码分析,开发者不仅可以提升开发效率,还能编写出更高效、更优雅的JavaScript代码。
通过分析这些代码,你可以深入理解jQuery UI的工作原理,并学会如何在自己的项目中应用。 此外,jQuery UI还支持主题系统,允许开发者自定义组件的外观。书中可能有对应的示例展示如何创建和应用自定义主题。学习这...
总之,通过深入研究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源码...
标题中的“强大的UI功能组件源码”指的就是 jQuery UI 的源代码,这为开发者提供了一个深入理解其工作原理的机会,同时也可以根据项目需求进行定制化开发。源码分析可以帮助开发者优化性能,修复潜在问题,或者添加...
总结起来,jQuery UI 1.7源代码提供了丰富的用户界面解决方案,通过研究源代码,开发者不仅可以理解其工作原理,还可以学会如何自定义组件、创建新主题,甚至扩展新的功能。对于想要提升前端开发技能的工程师来说,...
8. **插件架构**:jQuery UI Messager遵循jQuery插件开发模式,通过链式调用来初始化和配置插件,提供了一种模块化和可复用的代码结构。 9. **API和方法**:插件通常会提供一组API接口和方法,例如`$.messager.show...
3. **调用方法**:对选中的元素调用jQuery UI提供的方法,如`$(selector).tabs()`来创建选项卡。 4. **配置选项**:可以通过参数设置组件的具体行为和外观,如`$(selector).dialog({width: 500, modal: true})`创建...
在"bootstrap&jQueryUI例子"这个压缩包中,可能包含的是结合了这两个框架的示例代码或项目。这些示例通常会展示如何在同一个页面中有效地利用 Bootstrap 的布局和样式,同时引入 jQuery UI 的组件,实现更复杂的用户...
JUERY UI源码,JqueryUI官方源码,绝对好用
接着,通过jQuery的选择器和`.ui()`方法来激活UI组件,例如创建一个对话框: ```javascript $(function() { $("#dialog").dialog(); }); ``` 同时,jQuery UI 提供了许多可定制的选项,如宽度、高度、是否可拖动、...
2. **选择器与方法**:通过jQuery的选择器找到需要操作的DOM元素,然后调用jQuery UI提供的方法,如`$("#dialog").dialog()` 创建一个对话框。 3. **配置参数**:许多jQuery UI的方法接受一个配置对象作为参数,...
这个“最新jQueryUI组件下载”应该指的是版本号为1.10.0的jQuery UI压缩包。 jQuery UI 包含了大量的可交互和视觉上吸引人的元素,它简化了网页开发,让开发者可以快速实现复杂且用户友好的界面设计。以下是一些...
《jQuery UI与主题设计详解》 在Web开发领域,jQuery UI是一个强大且广泛使用的JavaScript库,它基于...通过深入理解和熟练使用jQuery UI,开发者可以更高效地构建富客户端应用,同时保证其视觉效果的专业和一致性。
5. **API和事件**:jQuery UI 提供了详细的API文档,开发者可以通过调用特定方法来启用或配置组件。此外,每个组件都与特定的jQuery事件相关联,如open、close、drag等,这使得在用户与界面交互时可以进行精确控制。...
在“前端项目-jqueryui-touch-punch”这个项目中,包含的文件可能是jQuery UI Touch Punch的源码或示例。通过解压并研究这个项目,你可以了解到如何将这两个工具结合到自己的Web应用中,以提供兼容触摸设备的用户...
图书的源代部分; 还有由于容量的原因, 视频和web实例图片没有上传. 《jQuery全能权威指南:jQuery Core+jQuery Plugin+...、jQuery UI、jQuery Mobile以及大量第三方的插件库和2800多个应用jQuery技术的网页参考。
开发者可以通过查阅文档了解如何配置组件,何时调用方法,以及响应哪些事件。 7. **兼容性**:jQuery UI通常与最新的jQuery版本兼容,但也支持旧版jQuery,确保了广泛的应用场景。不过,随着技术的发展,建议始终...
jQuery UI 的优势在于其灵活性和可扩展性,允许开发者轻松地组合和自定义组件,以满足不同项目的需求。同时,由于它建立在广泛使用的jQuery库之上,拥有庞大的社区支持,遇到问题时能找到丰富的资源和解决方案。总之...
总的来说,JqueryUI的甘特图源码为我们提供了一个学习和实践的平台,通过对源码的研究,我们可以深入了解前端开发中的数据可视化技术,同时也能提高我们使用JqueryUI和其他JavaScript库构建复杂用户界面的能力。...