表单设计器设计思路
1.页面布局
分为3个部分(设计器图片已上传)
(1)组件,用来画表单的基础工具,可以用Ext的tree实现。
(2)设计区域,就是一个配上背景图片的div。
(3)右侧属性栏,每个组件都有自己的属性配置,可以用Ext的PropertyGrid来实现。
2.组件拖拽到设计区
可以通过ext自带的拖拽功能很容易实现。设定拖拽源为tree,拖拽目标位设计区div,代码如下:
dropTarget = new Ext.dd.DropTarget(Ext.getDom('pageId'), {
ddGroup: 'DDGroup',
notifyEnter: function (ddSource, e, data) {
//拖拽过程中执行
},
notifyDrop: function (ddSource, e, data) {
//鼠标放开之后执行,ddSource拖拽源,e事件
return (true);
}
});
3.当拖拽到设计区之后需要创建对象
定义一个全局文档对象var domObj = {};//临时存放页面所有元素的对象集合,key为标签的id,value为对象引用。
在notifyDrop函数里判断拖拽的组件类型来实例化相对应的对象,然后分别添加到设计区内和domObj中。
添加到设计区为了达到显示效果,添加到文档对象中为了读取属性回显和保存的用途。
4.面向对象设计
在这里需要以OO的思路来处理,便于维护和扩展,将所有组件的公用部分属性抽象到超类中,每个组件都有自己的类定义,代码如下:
//超类组件的公共属性
//*********************继承通用方法***********************
function extend(sub , sup){//sub子类,sup父类
var F = function() {},
subclassProto,//子类的原型对象
superclassProto = sup.prototype;//把父类的原型对象交给了superclassProto变量
F.prototype = superclassProto;
subclassProto = sub.prototype = new F();
subclassProto.constructor = sub;
sub.superclass = superclassProto;
if (superclassProto.constructor === Object.prototype.constructor) {
superclassProto.constructor = sup;
}
};
function BaseObject(id,top,left,width,height,type){
this.id = id;
this.top = top;
this.left = left;
this.width = width;
this.height = height;
this.type = type;
}
//*********************标签***********************
function Label(id,top,left){
BaseObject.call(this,id,top,left,'40','20','label')
this.value = '标签';
this.color = '';
}
extend(Label,BaseObject);//继承超类
Label.prototype.toHtml = function () {
var obj = $("<label style='Z-INDEX: 1;POSITION: absolute;'></label>");
obj.attr("id", this.id);
obj.text(this.value);
addEvent(obj,this);//添加一些事件,略...
return obj;
}
每次向设计区添加组件都是通过new对象,然后调用toHtml方法来添加到div中。
5.拖拽原理
通过拖拽改变div位置和大小,当鼠标按下时mousedown绑定移动事件mousemove,当鼠标抬起时mouseup接触绑定的事件。
这样一来当按下时候随着鼠标的移动不断的改变对象坐标属性就可以达到拖拽的效果了。可以考虑把拖拽函数写成jquery插件形式便于调用。
代码如下:
this.mousedown(function (e){
var x = e.clientX - 160;
var y = e.clientY - 27;
var right = this.offsetLeft + this.offsetWidth;
var bottom = this.offsetTop + this.offsetHeight;
if((x<right&&x>=right-3)&&(y>=this.offsetTop&&y<=bottom)&&type!='Yline'){
var domObj = {};
domObj.x = x - this.offsetWidth;
domObj.y = y - this.offsetHeight;
domObj.dom = this;
$(document).bind("mousemove", {domObj: domObj}, updateWidth).bind("mouseup", mouseUp);
if(typeof(fn)!='undefined'){
$(document).bind("mousemove", updatePosition).bind("mouseup", {domObj: domObj, dragType:'width'}, fn);
}
}
else if((y<bottom&&y>=bottom-3)&&(x>=this.offsetLeft&&x<=right)&&type!='Xline'){
var domObj = {};
domObj.x = x - this.offsetWidth;
domObj.y = y - this.offsetHeight;
domObj.dom = this;
$(document).bind("mousemove", {domObj: domObj}, updateHeight).bind("mouseup", mouseUp);
if(typeof(fn)!='undefined'){
$(document).bind("mousemove", updatePosition).bind("mouseup", {domObj: domObj, dragType:'height'}, fn);
}
}
else{
for(var i=0;i<domArray.length;i++){
domArray[i].x = x-parseInt($(domArray[i].dom).css('left'));
domArray[i].y = y-parseInt($(domArray[i].dom).css('top'));
}
$(document).bind("mousemove", updatePosition).bind("mouseup", mouseUp);
if(typeof(fn)!='undefined'){
$(document).bind("mousemove", updatePosition).bind("mouseup", {dragType:'move'}, fn);
}
}
//防止默认事件发生
e.preventDefault();
});
//鼠标抬起时,解除拖拽效果的绑定
function mouseUp(e){
$(this).unbind("mousemove",updateWidth).unbind("mousemove",updateHeight).unbind("mousemove",updatePosition).unbind("mouseup");
}
6.多选和键盘事件
以按住ctrl多选为例,需要定义2个全局对象。
var keyFalg = false;//判断是否按下ctrl键
var domArray = []; //存放当前选中的对象数组
//绑定整个文档键盘事件,判断键盘是否按下
$(document).keydown(function(event){
keyFalg = true;
});
$(document).keyup(function(event){
keyFalg = false;
});
当对象点击事件被执行时判断keyFalg状态,来决定数组内容。
当执行拖拽等操作时,来通过数组对象循环改变每个对象属性值来达到同时拖拽多个对象的效果。
7.保存
分开两种保存,html和json或xml。
html用于给填表单的人使用,json数据用于给开发人员修改表单用。
保存html通过jquery的html()方法来实现。
保存json通过Ext.util.JSON.encode()方法来实现。
源码地址:
http://item.taobao.com/item.htm?spm=a1z10.5.w4002-5308542543.10.tBIcCP&id=37074279659
图片效果在附件中。。。
- 大小: 124.5 KB
分享到:
相关推荐
【图形化WINFORM表单设计器】是一款用于创建和编辑Windows Forms(WINFORM)应用程序界面的工具,它允许开发者通过拖放的方式,直观地构建应用程序的用户界面,而无需编写大量的UI布局代码。这款设计器通常包括丰富...
通过这个压缩包,开发者可以获取到实现表单设计器的源码,了解其内部工作原理,以及如何将其集成到自己的Vue项目中。表单设计器通常包含以下功能: 1. 可视化编辑:用户可以通过拖放方式添加、删除和配置表单元素,...
下面我们将深入探讨这个表单设计器的原理、实现方式以及相关的技术知识点。 1. **C#语言基础**:表单设计器的开发离不开C#的基础语法和面向对象编程。C#提供了丰富的类库和API,使得构建复杂的桌面应用程序变得可能...
学习winform表单设计器不仅需要掌握C#语言基础,还需要理解Windows Forms框架的工作原理,熟悉.NET Framework的组件模型。通过实践,开发者可以快速地构建出具有专业外观和丰富功能的桌面应用程序。同时,理解并运用...
【Vue3.0表单设计器基础介绍】 Vue3.0是Vue.js框架的最新版本,它带来了许多性能优化和新特性,旨在提升开发效率和应用性能。Vue Form Design是一款基于Vue3.0的表单设计器,它允许开发者通过拖拽方式快速构建动态...
用户可以通过研究这些文件来了解表单设计器的内部工作原理,甚至进行二次开发,扩展其功能,以适应更加复杂的业务场景。 总的来说,"表单设计器"结合了CKEditor的强大编辑功能,为创建专业且功能齐全的在线表单提供...
本文将深入探讨纯JavaScript实现的表单设计器,以及其核心功能和工作原理。 1. **表单动态定义** 表单动态定义是指在运行时创建和修改表单的能力。开发者可以通过选择不同的表单元素(如文本框、复选框、下拉菜单...
在“自定义表单设计器演示程序”中,我们能够探索这种技术的实际应用,通过提供的两个示例模板,可以更好地理解其功能和工作原理。 这个演示程序基于C#开发,这是一种广泛使用的面向对象的编程语言,特别适合开发...
这通常意味着下载后,开发者可以深入研究其内部工作原理,学习如何使用和扩展这个表单设计器。 基于以上信息,我们可以了解到这个表单设计器具备以下知识点: 1. **JavaScript编程**:作为主要的技术基础,...
**jQuery UI表单设计器**是基于流行的JavaScript库jQuery和其UI框架开发的一款工具,用于帮助开发者快速、便捷地创建和定制交互式表单。这款源代码提供了完整的前端解决方案,允许用户在网页上直接设计和编辑表单...
《超赞可视化表单设计器源码深度解析》 在当今数字化时代,表单设计作为数据收集和业务流程的重要环节,其重要性不言而喻。本文将深入探讨一款被誉为“超赞”的可视化表单设计器源码,帮助开发者理解并利用这款工具...
标题中的“表单设计器vue”指的是一种利用Vue.js技术实现的在线表单构建工具,允许开发人员或用户通过拖拽方式创建、编辑和配置表单元素。这种设计器通常包括各种表单控件,如文本输入框、选择框、日期选择器等,并...
#### 表单设计器的设计原理与组成 表单设计器是表单设计的核心工具,其设计理论基础为关系数据库为基础的存储模式,具有良好的扩展性和移植性。主要由以下几个部分组成: - **表单模板**:XML格式的文件,包含了...
GitHub Pages通常用于托管静态网站,这可能是一个公开的示例或者开发者分享的在线版表单设计器。 综合以上信息,我们可以学习到以下几个知识点: 1. Bootstrap框架:了解其基本组件、栅格系统和响应式设计原理,以...
通过学习和使用这个“表单设计器的例子”,开发者不仅可以掌握表单设计的基本原理,还能深入理解如何将设计的表单实现为实际的业务功能,提升开发效率和用户体验。对于初学者来说,这是一个很好的实践项目,可以锻炼...
7. **学习曲线**:尽管ExtJS界面设计器降低了开发难度,但熟悉其工作原理和组件库仍需要一定的学习。对于新用户,可能需要花时间了解每个组件的功能和使用方法,以及如何通过设计器进行有效的布局和样式设置。 8. *...
《基于Layui的表单设计器设计源码详解》 在现代Web开发中,快速构建高效、可定制的企业级表单管理系统是至关重要的。Layui,作为一个优秀的前端UI框架,以其简洁、实用的设计理念,深受开发者喜爱。本文将深入探讨...
Vue表单设计器是Vue生态系统中的一个重要组件,它允许开发者通过图形化界面设计和管理动态表单,极大地提高了开发效率和用户体验。 在"一个强大的Vue表单设计器.zip"中,我们可以预见到这可能是一个集成了一系列...
在互联网应用中,Web表单设计器是一个重要的工具,它允许用户无需编程知识就能创建出复杂的表单,极大地提升了工作效率。PHP作为服务器端的一种强大脚本语言,常用于构建动态网站和应用程序。此实例——“PHP实例...