热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用ExtJs4.2实现验证码

2019独角兽企业重金招聘Python工程师标准在一个项目中要生成验证码,用ExtJs4.2实现。最常见的验证码就是一个输入框和一个验证码图片。第一个感觉就是用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在一个项目中要生成验证码,用ExtJs 4.2实现。最常见的验证码就是一个输入框和一个验证码图片。
第一个感觉就是用Ext.container.Container将textfield和img放进去。所以,有了以下的代码:
实现方式一:
保存为VerificationCode.js

// 验证码控件
Ext.define('fms.ux.VerificationCode', {extend : 'Ext.container.Container',alias : 'widget.verificationcode',codeUrl : Ext.BLANK_IMAGE_URL,fieldLabel : '',tabIndex : 0,border:0,layout : {type : 'hbox'},initComponent : function() {var me = this;me.image = Ext.create(Ext.Img, {id : 'verifycode_img',style : "cursor:pointer ",src : me.codeUrl,margin : '0 0 0 5',listeners : {click : me.loadCodeImg,element : "el",scope : me}});me.items = [{xtype : 'textfield',id : 'verifycode_input',fieldLabel : me.fieldLabel,border : 0,tabIndex : me.tabIndex}, me.image]me.callParent();},loadCodeImg : function() {// 如果浏览器发现url不变,就认为图片没有改变,就会使用缓存中的图片,// 而不是重新向服务器请求,所以需要加一个参数,改变url.this.image.setSrc(this.codeUrl + '?time='+ new Date().getTime());}});
调用方法:

Ext.create('fms.ux.VerificationCode', {fieldLabel : '验证码',codeUrl : 'verificationCode.fms',x : iWidth - 500,y : iHeight - 240,tabIndex : 3,width : 300
});
运行看下效果,感觉在Chrome下貌似尺寸有点不对。正好在网上也看到了一个例子,所以有了以下的方式:
实现方式二:
修改部分后实现如下:
验证码实现代码如下: 保存为VerifyCode.js  

//验证码控件
Ext.define('fms.ux.VerifyCode', {extend : 'Ext.form.field.Text',alias : 'widget.verifycode',inputTyle : 'codefield',codeUrl : Ext.BLANK_IMAGE_URL,isLoader : true,onRender : function(ct, position) {this.callParent(arguments);this.codeEl = this.bodyEl.createChild({tag : 'img',src : Ext.BLANK_IMAGE_URL,style : 'width:75px; height:22px; vertical-align:top; cursor:pointer; margin-left:5px;'});// this.codeEl.addCls('x-form-verifycode');this.codeEl.on('click', this.loadCodeImg, this);if (this.isLoader) {this.loadCodeImg();}},alignErrorIcon : function() {this.errorIcon.alignTo(this.codeEl, 'tl-tr', [2, 0]);},// 如果浏览器发现url不变,就认为图片没有改变,就会使用缓存中的图片,// 而不是重新向服务器请求,所以需要加一个参数,改变urlloadCodeImg : function() {this.codeEl.set({src : this.codeUrl + '?id=' + Math.random()});},listeners : {'boxready' : function(me, width, height, eOpts) {var inputElWidth = me.getWidth() - me.labelWidth- me.codeEl.dom.width - 12;me.inputEl.setWidth(inputElWidth);}}
});
其中codeUrl是生成验证码的后台链接。
调用代码如下:

Ext.create('fms.ux.VerifyCode', {fieldLabel : '验证码',name : 'verifycode',id : 'verifycode',isLoader : true,blankText : '验证码不能为空',codeUrl : 'verificationCode.fms',tabIndex : 3,width : 300
});

效果有是有了,但是呢,在测试的时候发现了些小问题:就是在改变浏览器宽度和高度的时候渲染会不正确。
在知道有第二种实现方式的情况下,真的不想再回到第一种实现方式了(这里不是说哪种好,就是有点犯贱了....)。然后,突然想到了Ext.form.field.File,因为觉得把那个button改成图片不就可以了,所以有了下面一种方式:
实现方式三:
验证码实现代码保存为:VerifyCode.js

Ext.define('fms.ux.VerifyCode', {extend : 'Ext.form.field.Trigger',alias : ['widget.verifycodefield', 'widget.verifycode'],// 图片的URL地址codeImgUrl : Ext.BLANK_IMAGE_URL,// 图片和输入框之间的距离imgMargin : 5,// 图片的宽度imgWidth : 75,// 图片的高度imgHeight : 23,// 点击图片的时候是否清空输入框clearOnClick : true,// 临时的FieldBody样式extraFieldBodyCls : Ext.baseCSSPrefix + 'form-file-wrap',componentLayout : 'triggerfield',childEls : ['imageWrap'],onRender : function() {var me = this, id = me.id, inputEl;me.callParent(arguments);inputEl = me.inputEl;// name goes on the fileInput, not the text inputinputEl.dom.name = '';// 将imgConfig对象拷贝给前一个参数,并覆盖me.image = new Ext.Img(Ext.apply({renderTo : id + '-imageWrap',ownerCt : me,ownerLayout : me.componentLayout,id : id + '-img',ui : me.ui,src : me.codeImgUrl,disabled : me.disabled,width : me.imgWidth,height : me.imgHeight,style : me.getImgMarginProp() + me.imgMargin + 'px;cursor:pointer;',inputName : me.getName(),listeners : {scope : me,click : {element : 'el',fn : me.onImgClick}}}, me.imgConfig));// me.browseButtonWrap.dom.style.width =// (me.browseButtonWrap.dom.lastChild.offsetWidth +// me.button.getEl().getMargin('lr')) + 'px';me.imageWrap.dom.style.width = (me.imgWidth + me.image.getEl().getMargin('lr'))+ 'px';if (Ext.isIE) {me.image.getEl().repaint();}},/*** Gets the markup to be inserted into the subTplMarkup.*/getTriggerMarkup : function() {return '';},onImgClick : function() {// 重新定义图片地址this.image.setSrc(this.codeImgUrl + '?time=' + new Date().getTime());this.reset();},getImgMarginProp : function() {return 'margin-left:';},setValue : Ext.emptyFn,reset : function() {var me = this, clear = me.clearOnClick;if (me.rendered) {if (clear) {me.inputEl.dom.value = '';}}}});
调用代码: 

Ext.create('fms.ux.VerifyCode', {fieldLabel : '验证码',name : 'verifycode',id : 'verifycode',blankText : '验证码不能为空',codeImgUrl : 'verificationCode.fms',tabIndex : 3,x : iWidth - 500,y : iHeight - 240,width : 300
});
好了,到这里就差不多了。测试,是没有发现什么大的问题(可能没有测试仔细...有发现问题又改呗!)。
效果图如下:




转:https://my.oschina.net/guanzhenxing/blog/167543



推荐阅读
  • PyQt 如何创建自定义QWidget
    这篇文章主要介绍了PyQt如何创建自定义QWidget,帮助大家更好的理解和学习使用pyqt,感 ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • 以下不是python文件读写方法的是Python 文件I/O
    Python文件IO本章只讲述所有基本的IO函数,更多函数请参考Python标准文档。打印到屏幕最简单的输出方法是用print语句,你可以给它传递 ... [详细]
  • 用户管理_用户管理的小项目
      之前学习链表数据结构的时候,写过(相信很多人都做过)dos窗口版的学生管理系统,通过输入数字来实现CURD学生的信息,顶多就是把数据写入文件来存储数据 ... [详细]
  • 本文整理了Java中com.google.gwt.user.client.ui.RootPanel.detachOnWindowClose方法的一些代码示例,展示了 ... [详细]
  • 运行以下代码fromtensorflow.python.clientimportdevice_libprint(device_lib.list_local_devices()) ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • lora物联网开发教程(物联网lora特点)
    长距离星型架构,由于长距离连接性,从而减少了电池寿命。这个协议采用了阿罗哈法。在一个网状网络或者一个异步网络中,例如蜂窝网,结点必须频繁的被唤醒,来同步网络和检查消息。这种同步,大 ... [详细]
  • HSE8MHz。配置前将所有RCC重置为初始值RCC_DeInit();*这里选择外部晶振(HSE)作为时钟源,因此首先打开外部晶振*RC ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法了。这一新特性对以往的操作方法使用没有任何影响,你也可以用 ... [详细]
  • 如何用js 实现依赖注入的思想,后端框架思想搬到前端来
    如何用js实现依赖注入的思想,后端框架思想搬到前端来-大家在做些页面的时候,很多都是用ajax实现的,在显示的时候有很多表单提交的add或者update操作,显然这样很烦,突然想到 ... [详细]
  • 下载完成之后解压提取jl1.0.0.1.jar这里写图片描述将jl1.0.0.1.jar拷贝到项目中,并添加到Library这里写图片描述4.源代码Tip:由于工程名 ... [详细]
  • 上次我们总结了React代码构建后的webpack模块组织关系,今天来介绍一下Babel编译JSX生成目标代码的一些规则,并且写一个简单的解析器,模拟整个生成的过程。我们还是拿最简 ... [详细]
  • C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t ... [详细]
author-avatar
哲亚Zoe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有