`
codesoul
  • 浏览: 7208 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用Ext Form自动绑定Html中的Form元素

阅读更多
在做EXT开发中,尽能的是使用上EXT的所有功能,不然就浪费了那500K的身材了,EXT的主要功能之一的FORM组件,验证功能很强大,而且样式也挺好看的。但在使用EXT的form布局来设计表单时,难以直观的看到页面的排板模形,特别是对于习惯了使用<table>来排板<input>等元素的程序员来说,更是难以接受。为了满足习惯性可观的设计表面排板,可以在页面加载完后(Ext.onReady),将EXT的FORM元素自动绑定相应的html form元素,这样则在页面设计时直接使用html中form元素,而不必再关心到EXT排板。

//把ext 对象绑定在Html Form元素时的ext属性中 
Ext.override(Ext.Component, { 
initComponent :function(){ 
  this.on('render', function(){ 
   if(this.el) 
    Ext.getDom(this.el).ext = this; 
   if(this.hiddenField)//Combo 
    Ext.getDom(this.hiddenField).ext = this; 
  }) 
} 
});  
­
//获取验证信息 
// 将EXT的验证属性写成JSONString格式,保护在val属性中
$getValid = function(el){ 
var valid = "{}"; 
    if(Ext.getDom(el).attributes['val']) 
     valid = Ext.getDom(el).attributes['val'].nodeValue; 
    return valid; 
} 
//自动绑定Html中的Form元素 
$blindFormField = function(){ 
var objArray = Ext.DomQuery.select("input[type=submit]");   
    Ext.each(objArray, function(obj) { 
        var btn = new Ext.Button({   
            text : obj.value,   
            applyTo : obj,   
            handler : obj.onclick,   
            type : obj.type   
        });   
        btn.getEl().replace(Ext.get(obj));   
    });   
    var objArray = Ext.DomQuery.select("input[type=reset]");   
    Ext.each(objArray, function(obj) {   
        var btn = new Ext.Button({   
            text : obj.value,   
            applyTo : obj,   
            handler : obj.onclick,   
            type : obj.type   
        });   
        btn.getEl().replace(Ext.get(obj));   
    });   
    var objArray = Ext.DomQuery.select("input[type=button]");   
    Ext.each(objArray, function(obj) {   
        var btn = new Ext.Button({   
            text : obj.value,   
            applyTo : obj,   
            handler : obj.onclick,   
            type : obj.type   
        });   
        btn.getEl().replace(Ext.get(obj));   
    });   
    /**   
     * text and textarea and password and file   
     */   
    var objArray = Ext.DomQuery.select("input[type=text]");   
    Ext.each(objArray, function(obj) { 
     if(Ext.getDom(obj).ext) return;   
        var txtField = new Ext.form.TextField( 
         Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) 
        ); 
         
    });   
    var objArray = Ext.DomQuery.select("input[type=password]");   
    Ext.each(objArray, function(obj) {   
     
        var txtField = new Ext.form.CustomTextField( 
         Ext.apply({applyTo:obj,inputType:'password'},eval('('+$getValid(obj)+')')) 
        ) 
    });   
     
    var objArray = Ext.DomQuery.select("input[type=file]");   
     Ext.each(objArray, function(obj) {   
    });   
    var objArray = Ext.DomQuery.select("textarea");   
    Ext.each(objArray, function(obj) {   
        var txtArea = new Ext.form.TextArea( 
         Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) 
        );   
    });   
    /**   
     * checkbox and radio   
     */   
    var objArray = Ext.DomQuery.select("input[type=checkbox]");   
    Ext.each(objArray, function(obj) {   
        var checkbox = new Ext.form.Checkbox( 
         Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) 
        );   
    });   
    var objArray = Ext.DomQuery.select("input[type=radio]");   
    Ext.each(objArray, function(obj) {   
        var radio = new Ext.form.Radio( 
         Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) 
        );   
    });   
    /**   
     * select or comboBox   
     */   
    var objArray = Ext.DomQuery.select("select"); 
    Ext.each(objArray, function(obj, index) { 
        var select = new Ext.form.ComboBox( 
         Ext.apply({transform:obj,triggerAction:'all', forceSelection : true, cls:obj.className},eval('('+$getValid(obj)+')')) 
        ); 
       
    }); 
     
    /** 
     * number 
     */ 
    var objArray = Ext.DomQuery.select("input[type=number]");   
    Ext.each(objArray, function(obj) { 
     
     var dateField = new Ext.form.CustomNumberField( 
   Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) 
  ); 
    }); 
     
    /** 
     * 日期类型 
     */ 
    var objArray = Ext.DomQuery.select("input[type=date]");   
    Ext.each(objArray, function(obj) { 
      var dateField = new Ext.form.CustomDateField( 
      Ext.apply({applyTo:obj,format:'Y-m-d',cls:obj.className},eval('('+$getValid(obj)+')')) 
     ); 
   
    }); 
     
     /** 
     * email类型 
     */ 
    var objArray = Ext.DomQuery.select("input[type=email]");   
    Ext.each(objArray, function(obj) { 
      var emailField = new Ext.form.TextField( 
       Ext.apply({applyTo:obj,vtype:'email'},eval('('+$getValid(obj)+')')) 
      ); 
    }); 
     
    /** 
     * 自定义类型 
     */ 
    var objArray = Ext.DomQuery.select("input[type=custom]");   
    Ext.each(objArray, function(obj) { 
     var m_width =  $(obj).width()+7; 
      var houseinfoField =  new Ext.form.HouseInfoArea( 
       Ext.apply({applyTo:obj,cls:obj.className},eval('('+obj.val+')')) 
      ) 
    }); 
}

//验证输入的合法性
$validEl = function(el){
         if(typeof(el) == "string") el = document.getElementById(el); 	
	if(el.ext)
		return el.ext.validate();
	return true;
}

//验证form下所有元素输入的合法性,返回true为合法,false为不合法 
$valid2form = function(form){ 
var valid = true; 
var thefrm = form; 
if(typeof(form) == "string") var thefrm = document.getElementById(form); 
for (i = 0; i < thefrm.elements.length; i++){ 
  var e = thefrm.elements[i]; 
  if(!e.name) continue; 
  if(!$validEl(e)){ 
   valid = false; 
  } 
} 
return valid; 
} 
Ext.onReady(function() { 
setTimeout($blindFormField, 0); 
}) 

//HTML 中的使用代码
<form id='myform' action='action.do' onsubmit='' 
<table>
	<tr>
		<td> 字符串:</td> <td><input type='text' id='string' name='string' val='{allowBlank:false}'/></td>
		<td> 数字类型:</td> <td><input type='number' id='number' name='number' val='{allowBlank:false}'/></td>
	</tr>
	<tr>
		<td> Email:</td> <td><input type='email' id='email' name='email' val='{allowBlank:false}'/></td>
		<td> 日期类型:</td> <td><input type='date' id='date' name='date' val='{allowBlank:false}'/></td>
	</tr>
	<tr>
		<td> Select:</td> 
			<td>
				<select name='select'>
					<option value=1>option1</option>
					<option value=2>option2</option>
					<option value=3>option3</option>
				</select>
			</td>
		<td> 自定义类型:</td> <td><input type='custom' id='custom' name='custom' val='{allowBlank:false}'/></td>
	</tr>
<table>
</form>
­

如果在页面中存在有两个name一样的情况下,以上代码在IE上执行后,第二个name将无法的元素将不被绑定,原因是在IE下面有个bug,如果某个节点的name跟你要取得节点的名字一样,这样会得到name=youid的那个节点
<input type='text' id='username_id' name='username'/>
<input type='text' id='username' name='username_temp'/>
这样执行alert(document.getElementById('username').id)的结果是username_id而不是username
解决这个BUG的方法一般情况有两种:­
方法一:尽量避免在页面中出现name与id属性相同的对象
方法二:利用JavaScript的特点,重写document.getElementById

//IE_BUG_PATCH.js
if (/msie/i.test(navigator.userAgent)){ //根据userAgent确定用户使用IE浏览器   
document.nativeGetElementById = document.getElementById; 
document.getElementById = function(id){ 
  var elem = document.nativeGetElementById(id); 
  if(elem){     
   //确定id相同 
   if(elem.attributes['id'].value == id){ 
    return elem; 
   }else{                   
   //如果没有ID相同的,那么就遍历所有元素的集合找到id相同的元素 
    for(var i=1;i<document.all[id].length;i++) { 
     if(document.all[id][i].attributes['id'].value == id){ 
      return document.all[id][i]; 
     } 
    } 
   } 
  } 
  return elem; 
}; 
};
分享到:
评论
6 楼 heroyanglei 2014-01-21  
楼主 ,不过我就是想知道你使用了很多的eval(),这个函数的返回值是对象还是什么?会影响性能吗?
5 楼 vickypig 2009-11-24  
radio这个好像有点问题?
而且在里面加上这个提示的东西也会出错!Ext.form.Field.prototype.msgTarget='under';
4 楼 peteronline 2009-11-23  
好像变的更复杂了。
3 楼 vickypig 2009-11-13  
之前的问题解决了。我是使用
new Ext.form.NumberField和new Ext.form.DateField
new Ext.form.HouseInfoArea这个没有遇到过。
现在用了这个form之后,好像样式不行
2 楼 vickypig 2009-11-13  
<p>您好。我用了你的绑定,在数字和日期那边出现了bug。 <br>可否发一个正确的版本给我,我的邮箱是:vicky_yaoxj@163.com <br>或者可以加我qq:32963797 <br><br>里面是不是只用到ext啊。有没有用到jquery啊</p>
<p><br><br></p>
<p> 
</p>
<table style="" border="0" cellspacing="1" width="100%"><tbody>
<tr height="20">
<td width="20%">错误信息:</td>
<td width="80%">缺少对象</td>
</tr>
<tr height="20">
<td width="20%">错误Url:</td>
<td width="80%">js/form.js</td>
</tr>
<tr height="20">
<td width="20%">错误行:</td>
<td width="80%">110</td>
</tr>
</tbody></table>
<table style="" border="0" width="100%" align="center"><tbody>
<tr>
<td width="10">106:</td>
<td>* number </td>
</tr>
<tr>
<td width="10">107:</td>
<td>*/ </td>
</tr>
<tr>
<td width="10">108:</td>
<td>var objArray = Ext.DomQuery.select("input[type=number]"); </td>
</tr>
<tr>
<td width="10">109:</td>
<td>Ext.each(objArray, function(obj) { </td>
</tr>
<tr>
<td width="10">110:</td>
<td>var dateField = new Ext.form.CustomNumberField( </td>
</tr>
<tr>
<td width="10">111:</td>
<td>Ext.apply({applyTo:obj},eval('('+$getValid(obj)+')')) </td>
</tr>
<tr>
<td width="10">112:</td>
<td>); </td>
</tr>
<tr>
<td width="10">113:</td>
<td>}); </td>
</tr>
<tr>
<td width="10">114:</td>
<td> </td>
</tr>
<tr>
<td width="10">115:</td>
<td>/** </td>
</tr>
<tr>
<td width="10">116:</td>
<td>* 日期类型 </td>
</tr>
<tr>
<td width="10">117:</td>
<td>*/ </td>
</tr>
</tbody></table>
1 楼 xiang 2009-05-11  
那可以加个校验是否有同名对象的方法啊!!!!

相关推荐

    Ext2.0 form使用实例的例程

    在这个“Ext2.0 form使用实例的例程”中,我们将深入探讨Ext 2.0的表单(form)组件及其应用。 表单在任何应用程序中都扮演着至关重要的角色,用于收集和验证用户输入的数据。Ext 2.0的表单组件提供了一整套完整的...

    Ext 添加功能form表单实例

    - `layout`: 使用了`"form"`布局,这是Ext中专门为表单设计的布局方式。 - `labelWidth`: 统一设置了所有字段标签的宽度。 - `autoScroll`: 设置为`true`,当表单内容超出容器时自动显示滚动条。 #### 字段配置 ...

    ext form gridpanel

    "Ext Form GridPanel"是Ext JS库中的一个重要组件,它结合了表格(Grid)和表单(Form)的功能,提供了一种强大而灵活的方式来显示和编辑数据。在Web应用程序开发中,这种组件常用于数据录入和展示,尤其适用于处理...

    EXT dojochina文本框示例Ext.form.TextField.rar

    在压缩包中的`Ext.form.TextField`文件夹,很可能是包含了一个或者多个HTML、JavaScript和CSS文件的示例项目,展示了如何在实际应用中使用`Ext.form.TextField`组件。这些文件通常会包含一个或者多个示例,演示了...

    EXT异步提交FORM表单

    ### EXT异步提交FORM表单知识点详解 #### 一、EXT异步提交FORM表单概述 在现代Web应用开发中,异步提交表单是一种常见的技术手段,它能够提升用户体验,减少页面刷新带来的数据丢失风险,并能有效提高系统的响应...

    ext 2.0 form demo

    在这个"EXT 2.0 form demo"中,我们将深入探讨EXT在构建动态、交互式表单方面的强大功能。 一、EXT 2.0的核心特性 1. 组件化:EXT 2.0的核心是组件模型,允许开发者将UI元素(如按钮、表格、表单)视为独立的可...

    EXT中文手册 Grid Form

    - XTemplate是EXT中用于数据渲染的一种模板引擎,可以将数据动态地插入到HTML中。 - **DataView** - DataView组件用于展示非表格形式的数据集合,如列表、卡片等。 - **其它新组件** - EXT2引入了许多新组件,如...

    ext控件form相关配置

    本文将深入探讨Ext JS中的`Form`控件及其相关配置,帮助开发者更好地理解和掌握如何高效地使用这些控件。 #### 二、Ext JS Form控件概述 Ext JS的`Form`控件提供了一套丰富的API用于创建、管理和验证Web表单。该...

    Ext Column+Form布局画复杂页面

    4. 在右侧列中使用Form Panel来创建表单。Form Panel可以包含多个FieldSet,每个FieldSet代表表单的一个部分。 5. 配置Form Panel的layout为Form Layout,这样表单字段会按照预设方式进行排列。 6. 将Grid Panel中的...

    Ext.form.field.ComboBox结合Java、JSON实现AutoComplete

    `Ext.form.field.ComboBox`是Ext JS框架中一个强大的组件,它提供了下拉列表的功能,可以用于创建选择框或者搜索框,具有自动补全特性。这个组件允许用户通过输入部分文本来筛选下拉列表中的选项,提高数据输入的...

    使用Ext的Grid,Form,Dialog来实现分页列表,创建,修改,删除功能

    7. **事件处理和数据交互**:在Ext中,事件处理是通过绑定函数到特定组件的事件来实现的。例如,`addForm.applyIfToFields`用于设置表单字段的宽度,`addForm.render`将表单渲染到指定的DOM元素中。服务器端处理后的...

    EXT帮助文档(中文EXT3.0 API,中文EXT2.2 API)

    2. **数据绑定**:EXT提供了强大的数据绑定机制,使得数据和界面的更新可以自动同步,简化了数据驱动的应用程序开发。 3. **布局管理**:EXT提供了多种布局模式,如fit、border、form、table等,方便开发者根据需求...

    EXT3.0中文API文档

    EXT3.0中文API文档是针对EXT JavaScript库的版本3.0所编写的详细参考资料,主要面向前端开发者,特别是那些在Web应用中使用EXT3.0框架进行开发的专业人士。EXT是一个强大的用户界面库,提供了丰富的组件和功能,用于...

    ext 3.3 中文 chm

    EXT 3.3 中包含了许多关键组件和功能,如表格、树形视图、图表、菜单、按钮、表单元素等,这些组件可以用来创建复杂的用户界面。EXT 3.3 提供了高度可定制化和丰富的API,使得开发者可以根据需求调整组件的样式和...

    ext 3.0中文API

    EXT 3.0的布局管理器也是一个关键特性,它能自动管理组件的尺寸和位置,包括Fit布局、Form布局、Table布局等,使得开发者可以轻松构建响应式和自适应的界面。此外,EXT的表单组件如TextField、ComboBox和DateField等...

    Ext 中文帮助文档

    3. **数据绑定**:Ext的数据绑定机制允许视图组件与数据源直接关联,数据变化时视图会自动更新,反之亦然,实现了数据驱动的开发模式。 4. **Store与Model**:Store是数据容器,可以存储和管理大量的数据记录。...

    EXT4.3实现动态表单全动态

    - **动态生成**:开发者可以通过编程方式动态生成表单元素,例如使用`Ext.Component`或`Ext.form.field.Base`的子类,根据需求动态添加或移除表单字段。 - **数据绑定**:EXT4.3支持双向数据绑定,允许表单字段与...

    Ext 3.0中文手册及帮助文档

    Ext 3.0的数据绑定机制使得UI组件可以直接与数据源关联,当数据源发生变化时,UI会自动更新,反之亦然。这种双向数据绑定提高了开发效率,简化了代码逻辑。 五、API参考 Ext 3.0的API文档详细列出了所有可用的类、...

    Ext-2.1 Ext 2全文档

    在Ext 2.1中,表单(Form)组件也是非常重要的。它们提供了创建和管理HTML表单的能力,支持各种输入类型、验证规则以及数据提交。Ext Form还包含了自定义表单字段、联动控制等高级特性。 对于数据管理,Ext 2.1提供...

    ext中文帮助文档最终版

    3. **数据绑定**:EXT支持数据绑定,这意味着你可以将组件与数据源(如JSON对象或XML文件)关联,当数据改变时,界面会自动更新,反之亦然。 4. **表格和网格**:EXT 2.0中的GridPanel组件提供了高度可定制的表格...

Global site tag (gtag.js) - Google Analytics