- 浏览: 140510 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
puyancheng1988:
哥们儿,我用的jfreechart在linux服务器上生成的图 ...
JFreeChart图表 -
soujava:
...
Linux下Oracle自动备份脚本 -
skylikeblue:
...
基于JAVA实现的手机收发短消息系统
/** * 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 */ var Prototype = { Version: '@@VERSION@@' } /** * 创建一种类型,注意其属性 create 是一个方法,返回一个构造函数。 * 一般使用如下 * var X = Class.create(); 返回一个类型,类似于 java 的一个Class实例。 * 要使用 X 类型,需继续用 new X()来获取一个实例,如同 java 的 Class.newInstance()方法。 * * 返回的构造函数会执行名为 initialize 的方法, initialize 是 Ruby 对象的构造器方法名字。 * 此时initialize方法还没有定义,其后的代码中创建新类型时会建立相应的同名方法。 * * 如果一定要从java上去理解。你可以理解为用Class.create()创建一个继承java.lang.Class类的类。当然java不允许这样做,因为Class类是final的 * */ var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } /** * 创建一个对象,从变量名来思考,本意也许是定义一个抽象类,以后创建新对象都 extend 它。 * 但从其后代码的应用来看, Abstract 更多是为了保持命名空间清晰的考虑。 * 也就是说,我们可以给 Abstract 这个对象实例添加新的对象定义。 * * 从java去理解,就是动态给一个对象创建内部类。 */ var Abstract = new Object(); /** * 获取参数对象的所有属性和方法,有点象多重继承。但是这种继承是动态获得的。 * 如: * var a = new ObjectA(), b = new ObjectB(); * var c = a.extend(b); * 此时 c 对象同时拥有 a 和 b 对象的属性和方法。但是与多重继承不同的是,c instanceof ObjectB 将返回false。 */ Object.prototype.extend = function(object) { for (property in object) { this[property] = object[property]; } return this; } /** * 这个方法很有趣,它封装一个javascript函数对象,返回一个新函数对象,新函数对象的主体和原对象相同,但是bind()方法参数将被用作当前对象的对象。 * 也就是说新函数中的 this 引用被改变为参数提供的对象。 * 比如: * <input type="text" id="aaa" value="aaa"> * <input type="text" id="bbb" value="bbb"> * ................. * <script> * var aaa = document.getElementById("aaa"); * var bbb = document.getElementById("bbb"); * aaa.showValue = function() {alert(this.value);} * aaa.showValue2 = aaa.showValue.bind(bbb); * </script> * 那么,调用aaa.showValue 将返回"aaa", 但调用aaa.showValue2 将返回"bbb"。 * * apply 是ie5.5后才出现的新方法(Netscape好像很早就支持了)。 * 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp * 还有一个 call 方法,应用起来和 apply 类似。可以一起研究下。 */ Function.prototype.bind = function(object) { var method = this; return function() { method.apply(object, arguments); } } /** * 和bind一样,不过这个方法一般用做html控件对象的事件处理。所以要传递event对象 * 注意这时候,用到了 Function.call。它与 Function.apply 的不同好像仅仅是对参数形式的定义。 * 如同 java 两个过载的方法。 */ Function.prototype.bindAsEventListener = function(object) { var method = this; return function(event) { method.call(object, event || window.event); } } /** * 将整数形式RGB颜色值转换为HEX形式 */ Number.prototype.toColorPart = function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; } /** * 典型 Ruby 风格的函数,将参数中的方法逐个调用,返回第一个成功执行的方法的返回值 */ var Try = { these: function() { var returnValue; for (var i = 0; i < arguments.length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) {} } return returnValue; } } /*--------------------------------------------------------------------------*/ /** * 一个设计精巧的定时执行器 * 首先由 Class.create() 创建一个 PeriodicalExecuter 类型, * 然后用对象直接量的语法形式设置原型。 * * 需要特别说明的是 rgisterCallback 方法,它调用上面定义的函数原型方法bind, 并传递自己为参数。 * 之所以这样做,是因为 setTimeout 默认总以 window 对象为当前对象,也就是说,如果 registerCallback 方法定义如下的话: * registerCallback: function() { * setTimeout(this.onTimerEvent, this.frequency * 1000); * } * 那么,this.onTimeoutEvent 方法执行失败,因为它无法访问 this.currentlyExecuting 属性。 * 而使用了bind以后,该方法才能正确的找到this,也就是PeriodicalExecuter的当前实例。 */ var PeriodicalExecuter = Class.create(); PeriodicalExecuter.prototype = { initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.callback(); } finally { this.currentlyExecuting = false; } } this.registerCallback(); } } /*--------------------------------------------------------------------------*/ /** * 这个函数就 Ruby 了。我觉得它的作用主要有两个 * 1. 大概是 document.getElementById(id) 的最简化调用。 * 比如:$("aaa") 将返回上 aaa 对象 * 2. 得到对象数组 * 比如: $("aaa","bbb") 返回一个包括id为"aaa"和"bbb"两个input控件对象的数组。 */ function $() { var elements = new Array(); for (var i = 0; i < arguments.length; i++) { var element = arguments[i]; if (typeof element == 'string') element = document.getElementById(element); if (arguments.length == 1) return element; elements.push(element); } return elements; } /** * 定义 Ajax 对象, 静态方法 getTransport 方法返回一个 XMLHttp 对象 */ var Ajax = { getTransport: function() { return Try.these( function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')}, function() {return new XMLHttpRequest()} ) || false; }, emptyFunction: function() {} } /** * 我以为此时的Ajax对象起到命名空间的作用。 * Ajax.Base 声明为一个基础对象类型 * 注意 Ajax.Base 并没有使用 Class.create() 的方式来创建,我想是因为作者并不希望 Ajax.Base 被库使用者实例化。 * 作者在其他对象类型的声明中,将会继承于它。 * 就好像 java 中的私有抽象类 */ Ajax.Base = function() {}; Ajax.Base.prototype = { /** * extend (见prototype.js中的定义) 的用法真是让人耳目一新 * options 首先设置默认属性,然后再 extend 参数对象,那么参数对象中也有同名的属性,那么就覆盖默认属性值。 * 想想如果我写这样的实现,应该类似如下: setOptions: function(options) { this.options.methed = options.methed? options.methed : 'post'; .......... } 我想很多时候,java 限制了 js 的创意。 */ setOptions: function(options) { this.options = { method: 'post', asynchronous: true, parameters: '' }.extend(options || {}); } } /** * Ajax.Request 封装 XmlHttp */ Ajax.Request = Class.create(); /** * 定义四种事件(状态), 参考http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp */ Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; /** * */ Ajax.Request.prototype = (new Ajax.Base()).extend({ initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); try { if (this.options.method == 'get') url += '?' + this.options.parameters + '&_='; /** * 此处好像强制使用了异步方式,而不是依照 this.options.asynchronous 的值 */ this.transport.open(this.options.method, url, true); /** * 这里提供了 XmlHttp 传输过程中每个步骤的回调函数 */ if (this.options.asynchronous) { this.transport.onreadystatechange = this.onStateChange.bind(this); setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); } this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version); if (this.options.method == 'post') { this.transport.setRequestHeader('Connection', 'close'); this.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); } this.transport.send(this.options.method == 'post' ? this.options.parameters + '&_=' : null); } catch (e) { } }, onStateChange: function() { var readyState = this.transport.readyState; /** * 如果不是 Loading 状态,就调用回调函数 */ if (readyState != 1) this.respondToReadyState(this.transport.readyState); }, /** * 回调函数定义在 this.options 属性中,比如: var option = { onLoaded : function(req) {...}; ...... } new Ajax.Request(url, option); */ respondToReadyState: function(readyState) { var event = Ajax.Request.Events[readyState]; (this.options['on' + event] || Ajax.emptyFunction)(this.transport); } }); /** * Ajax.Updater 用于绑定一个html元素与 XmlHttp调用的返回值。类似与 buffalo 的 bind。 * 如果 options 中有 insertion(from dom.js) 对象的话, insertion 能提供更多的插入控制。 */ Ajax.Updater = Class.create(); Ajax.Updater.prototype = (new Ajax.Base()).extend({ initialize: function(container, url, options) { this.container = $(container); this.setOptions(options); if (this.options.asynchronous) { this.onComplete = this.options.onComplete; this.options.onComplete = this.updateContent.bind(this); } this.request = new Ajax.Request(url, this.options); if (!this.options.asynchronous) this.updateContent(); }, updateContent: function() { if (this.options.insertion) { new this.options.insertion(this.container, this.request.transport.responseText); } else { this.container.innerHTML = this.request.transport.responseText; } if (this.onComplete) { setTimeout((function() {this.onComplete(this.request)}).bind(this), 10); } } }); /** * 针对 页面元素对象 的工具类,提供一些简单静态方法 */ var Field = { /** * 清除参数引用对象的值 */ clear: function() { for (var i = 0; i < arguments.length; i++) $(arguments[i]).value = ''; }, /** * 使参数引用对象获取焦点 */ focus: function(element) { $(element).focus(); }, /** * 判断参数引用对象值是否为空,如为空,返回false, 反之true */ present: function() { for (var i = 0; i < arguments.length; i++) if ($(arguments[i]).value == '') return false; return true; }, /** * 使选中参数引用对象 */ select: function(element) { $(element).select(); }, /** * 使参数引用对象处于可编辑状态 */ activate: function(element) { $(element).focus(); $(element).select(); } } /*--------------------------------------------------------------------------*/ /** * 表单工具类 */ var Form = { /** * 将表单元素序列化后的值组合成 QueryString 的形式 */ serialize: function(form) { var elements = Form.getElements($(form)); var queryComponents = new Array(); for (var i = 0; i < elements.length; i++) { var queryComponent = Form.Element.serialize(elements[i]); if (queryComponent) queryComponents.push(queryComponent); } return queryComponents.join('&'); }, /** * 得到表单的所有元素对象 */ getElements: function(form) { form = $(form); var elements = new Array(); for (tagName in Form.Element.Serializers) { var tagElements = form.getElementsByTagName(tagName); for (var j = 0; j < tagElements.length; j++) elements.push(tagElements[j]); } return elements; }, /** * 将指定表单的元素置于不可用状态 */ disable: function(form) { var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.blur(); element.disable = 'true'; } }, /** * 使表单的第一个非 hidden 类型而且处于可用状态的元素获得焦点 */ focusFirstElement: function(form) { form = $(form); var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; if (element.type != 'hidden' && !element.disabled) { Field.activate(element); break; } } }, /* * 重置表单 */ reset: function(form) { $(form).reset(); } } /** * 表单元素工具类 */ Form.Element = { /** * 返回表单元素的值先序列化再进行 URL 编码后的值 */ serialize: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) return encodeURIComponent(parameter[0]) + '=' + encodeURIComponent(parameter[1]); }, /** * 返回表单元素序列化后的值 */ getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) return parameter[1]; } } /** * prototype 的所谓序列化其实就是将表单的名字和值组合成一个数组 */ Form.Element.Serializers = { input: function(element) { switch (element.type.toLowerCase()) { case 'hidden': case 'password': case 'text': return Form.Element.Serializers.textarea(element); case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element); } return false; }, inputSelector: function(element) { if (element.checked) return [element.name, element.value]; }, textarea: function(element) { return [element.name, element.value]; }, /** * 看样子,也不支持多选框(select-multiple) */ select: function(element) { var index = element.selectedIndex; var value = element.options[index].value || element.options[index].text; return [element.name, (index >= 0) ? value : '']; } } /*--------------------------------------------------------------------------*/ /** * Form.Element.getValue 也许会经常用到,所以做了一个快捷引用 */ var $F = Form.Element.getValue; /*--------------------------------------------------------------------------*/ /** * Abstract.TimedObserver 也没有用 Class.create() 来创建,和Ajax.Base 意图应该一样 * Abstract.TimedObserver 顾名思义,是套用Observer设计模式来跟踪指定表单元素, * 当表单元素的值发生变化的时候,就执行回调函数 * * 我想 Observer 与注册onchange事件相似,不同点在于 onchange 事件是在元素失去焦点的时候才激发。 * 同样的与 onpropertychange 事件也相似,不过它只关注表单元素的值的变化,而且提供timeout的控制。 * * 除此之外,Observer 的好处大概就在与更面向对象,另外可以动态的更换回调函数,这就比注册事件要灵活一些。 * Observer 应该可以胜任动态数据校验,或者多个关联下拉选项列表的连动等等 * */ Abstract.TimedObserver = function() {} /** * 这个设计和 PeriodicalExecuter 一样,bind 方法是实现的核心 */ Abstract.TimedObserver.prototype = { initialize: function(element, frequency, callback) { this.frequency = frequency; this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); this.registerCallback(); }, registerCallback: function() { setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } this.registerCallback(); } } /** * Form.Element.Observer 和 Form.Observer 其实是一样的 * 注意 Form.Observer 并不是用来跟踪整个表单的,我想大概只是为了减少书写(这是Ruby的一个设计原则) */ Form.Element.Observer = Class.create(); Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({ getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(); Form.Observer.prototype = (new Abstract.TimedObserver()).extend({ getValue: function() { return Form.serialize(this.element); } }); /** * 根据 class attribute 的名字得到对象数组,支持 multiple class * */ document.getElementsByClassName = function(className) { var children = document.getElementsByTagName('*') || document.all; var elements = new Array(); for (var i = 0; i < children.length; i++) { var child = children[i]; var classNames = child.className.split(' '); for (var j = 0; j < classNames.length; j++) { if (classNames[j] == className) { elements.push(child); break; } } } return elements; } /*--------------------------------------------------------------------------*/ /** * Element 就象一个 java 的工具类,主要用来 隐藏/显示/销除 对象,以及获取对象的简单属性。 * */ var Element = { toggle: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); element.style.display = (element.style.display == 'none' ? '' : 'none'); } }, hide: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); element.style.display = 'none'; } }, show: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); element.style.display = ''; } }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); }, getHeight: function(element) { element = $(element); return element.offsetHeight; } } /** * 为 Element.toggle 做了一个符号连接,大概是兼容性的考虑 */ var Toggle = new Object(); Toggle.display = Element.toggle; /*--------------------------------------------------------------------------*/ /** * 动态插入内容的实现,MS的Jscript实现中对象有一个 insertAdjacentHTML 方法(http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertadjacenthtml.asp) * 这里算是一个对象形式的封装。 */ Abstract.Insertion = function(adjacency) { this.adjacency = adjacency; } Abstract.Insertion.prototype = { initialize: function(element, content) { this.element = $(element); this.content = content; if (this.adjacency && this.element.insertAdjacentHTML) { this.element.insertAdjacentHTML(this.adjacency, this.content); } else { /** * gecko 不支持 insertAdjacentHTML 方法,但可以用如下代码代替 */ this.range = this.element.ownerDocument.createRange(); /** * 如果定义了 initializeRange 方法,则实行,这里相当与定义了一个抽象的 initializeRange 方法 */ if (this.initializeRange) this.initializeRange(); this.fragment = this.range.createContextualFragment(this.content); /** * insertContent 也是一个抽象方法,子类必须实现 */ this.insertContent(); } } } /** * prototype 加深了我的体会,就是写js 如何去遵循 Don't Repeat Yourself (DRY) 原则 * 上文中 Abstract.Insertion 算是一个抽象类,定义了名为 initializeRange 的一个抽象方法 * var Insertion = new Object() 建立一个命名空间 * Insertion.Before|Top|Bottom|After 就象是四个java中的四个静态内部类,而它们分别继承于Abstract.Insertion,并实现了initializeRange方法。 */ var Insertion = new Object(); Insertion.Before = Class.create(); Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({ initializeRange: function() { this.range.setStartBefore(this.element); }, /** * 将内容插入到指定节点的前面, 与指定节点同级 */ insertContent: function() { this.element.parentNode.insertBefore(this.fragment, this.element); } }); Insertion.Top = Class.create(); Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({ initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, /** * 将内容插入到指定节点的第一个子节点前,于是内容变为该节点的第一个子节点 */ insertContent: function() { this.element.insertBefore(this.fragment, this.element.firstChild); } }); Insertion.Bottom = Class.create(); Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({ initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(this.element); }, /** * 将内容插入到指定节点的最后,于是内容变为该节点的最后一个子节点 */ insertContent: function() { this.element.appendChild(this.fragment); } }); Insertion.After = Class.create(); Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({ initializeRange: function() { this.range.setStartAfter(this.element); }, /** * 将内容插入到指定节点的后面, 与指定节点同级 */ insertContent: function() { this.element.parentNode.insertBefore(this.fragment, this.element.nextSibling); } }); /* 这是包含错误的原版本 if (!Function.prototype.apply) { // Based on code from http://www.youngpup.net/ Function.prototype.apply = function(object, parameters) { var parameterStrings = new Array(); if (!object) object = window; if (!parameters) parameters = new Array(); for (var i = 0; i < parameters.length; i++) parameterStrings[i] = 'x[' + i + ']'; //Error 1 object.__apply__ = this; var result = eval('obj.__apply__(' + //Error 2 parameterStrings[i].join(', ') + ')'); object.__apply__ = null; return result; } } */ if (!Function.prototype.apply) { Function.prototype.apply = function(object, parameters) { var parameterStrings = new Array(); if (!object) object = window; if (!parameters) parameters = new Array(); for (var i = 0; i < parameters.length; i++) parameterStrings[i] = 'parameters[' + i + ']'; object.__apply__ = this; var result = eval('object.__apply__(' + parameterStrings.join(', ') + ')'); object.__apply__ = null; return result; } } Effect 的一个子类
Effect.Blink = Class.create(); Effect.Blink.prototype = { initialize: function(element, frequency) { this.element = $(element); this.frequency = frequency?frequency:1000; this.element.effect_blink = this; this.blink(); }, blink: function() { if (this.timer) clearTimeout(this.timer); try { this.element.style.visibility = this.element.style.visibility == 'hidden'?'visible':'hidden'; } catch (e) {} this.timer = setTimeout(this.blink.bind(this), this.frequency); } };
发表评论
-
使用JQuery 简化Ajax 开发
2008-10-07 10:20 618jQuery 是什么? jQuery 由 John ... -
DTree的BUG解决方法
2008-12-25 15:33 984dtree.js的BUG当dtree条目的URL包括空格时,浏 ... -
JS常用正规表达式
2009-08-07 09:39 1172^ 匹配一个输入或一行 ... -
身份证验证算法
2008-03-05 16:29 789公民身份号码是特征组合码,由十七位数字本体码和一位数字校验 ... -
ajax缓存解决办法
2008-03-06 14:03 707有三种办法: 1、加个随机数 xmlHttp.open(&q ... -
基础的prototype.js常用函数及其用法
2008-03-06 15:49 672prototype.js 常用函数 : Element.t ... -
javascript replace方法与正则表达式
2008-03-13 17:52 674replace方法的语法是:str ... -
网页Tab选项卡实现
2008-06-28 19:58 779<style type="text/css&q ... -
网页中LRC歌词同步显示
2008-06-30 13:11 1074<html><head> < ... -
dojo之djConfig详解
2008-06-30 15:55 758djConfig是dojo内置的一个全局设置对象,其作用是可以 ... -
dojo验证函数
2008-06-30 16:04 804dojo提供了几乎全方位的验证函数,在使用下面的方法之前,要通 ... -
常用正则表达式
2008-06-30 16:19 666下面给出一些常用正则表达式: 1、 非负整数:”^d+$” ... -
dojo对象方法
2008-06-30 17:00 750这里所说的基础对象和 ... -
dojo之ValidationTextbox
2008-06-30 17:04 889功能强大的文本框:dijit.form.ValidationT ... -
dojo之IO和BrowserIO
2008-06-30 17:48 741模块:dojo.io.IO dojo.io.bind 处理请求 ... -
JavaScript中创建对象
2008-08-19 09:04 652注意以下两点:1、在对象的方法内调用其他方法时,别忘记了要加t ... -
AJAX实践DWR篇
2008-08-19 09:06 839DWR(Direct Web Remoting)是一个WEB远 ... -
FckEditor V2.6 fckconfig.js中文注释
2008-08-22 16:14 841FckEditor V2.6 fckconfig.js中文注释 ... -
FCKeditor使用详解
2008-08-22 16:36 747首先,FCKEDITOR的性能是非常好的,用户只需很少的时间 ... -
JS组件dtree轻松实现树型菜单
2008-09-19 14:19 1093这几天写个网站,用了一个JavaScript写的树型菜单,有网 ...
相关推荐
2. **安装与引用**:说明如何在项目中引入Prototype库,包括通过CDN或本地文件的方式。 3. **核心功能**:介绍Prototype的核心函数和对象,如`$`(选择元素)、`$$`(选择多个元素)、`Element`、`Event`、`Ajax`等...
这个压缩包包含的是Prototype的1.6.0版本,其中包括中文和英文的API文档以及源码,对于理解和使用Prototype框架具有极高的价值。 首先,Prototype-v1.6.0.chm文件是一个帮助文档,通常以Microsoft的CHM(Compiled ...
"Really easy field validation with Prototype 1.5.3 中文扩展版"是一个针对Prototype JavaScript库的前端验证插件,旨在简化网页表单的数据验证过程。这个工具以其简单易用和强大的功能著称,并且提供了对多语言的...
Jquery是继prototype之后又一个优秀的Javascrīpt框架。它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用户能更方便地处理...
6D Architect 3.02.04.zip,This is NDI prototype tool for initialization.
\初级篇 第1章 Qt初步实践 卢传富 建立了第一个较简单的Qt应用程序,在GUI用户界面中显示一行中文。 2 \ 第2章 对话框 \——QDialog 卢传富介绍了Qt的对话框类QDialog,实现了一个自定义的登录对话框,举例说明了...
- Underscore.js 是一个为JavaScript语言提供的实用工具集,其灵感来源于Ruby语言和Prototype.js库。 - 与jQuery不同的是,Underscore不扩展任何JavaScript内置对象,比如Array或Function。 - Underscore被认为是...
3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.3.1. 初始化web配置 3.4.3.2. Request作用域 3.4.3.3. Session作用域 3.4.3.4. global session作用域 3.4.3.5. 作用域bean与依赖 3.4.4. 自定义作用域 3.5. 定制bean...
4.7.3. FileSystemResource 说明 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和...
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它...
《Thingking in Java》(第一版中文)是这样描述设计模式的:他在由 Gamma, Helm 和 Johnson Vlissides 简称 Gang of Four(四人 帮),缩写 GoF 编著的《Design Patterns》一书中被定义成一个“里程碑”。事实上,那本书...
- **中文乱码问题**:解决客户端与服务器间字符集不一致导致的问题。 - **自定义参数绑定实现日期转换**:通过自定义Converter或Formatter实现复杂类型的转换。 #### SSM集成 **4.1 整合分析** SSM框架整合主要...
3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean ...
[编辑本段]文档中文翻译 http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html [编辑本段]效果演示 * Classic Form Demo http://demo.swfupload.org/formsdemo ; * Features Demo ...
4.7.3. FileSystemResource 说明 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和...
3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean ...
如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion...