easyui的tab加载页面中的form重复提交

http://blog.csdn.net/fxz1982/article/details/8987769

Easyui中的tabs组件以href方式加载目标页面,如果目标页面中有dialog或者window这类的easyui组件中放了form.那么在关闭这个tab再次打开.如果进行form提交操作,后台就会收到两次提交请求,再次重复以上操作会收到3次提交请求,如果将表单serialize()后以jquery的post提交服务器将收到值全是数组方式组织的.

经分析发现,Easyui的tab加载页面后会把目标页面的dialog组件的DOM代码从目标页面中拿出放到本页面的DOM结构中.先看以下在目标页面中dialog初始化前后的差异

1.目标页面原始DOM结构如下(页面中的dialog未经实例化)

其中<!-- 表单 -->代码<div id="dept-dialog"...>就是包含form的dialog

2.如果目标页面在加载时实例化了dialog,代码如下

可以看到<!-- 表单 -->下的<div id="dept-dialog"...>代码的DOM结构发生了改变,被移动到了截图中下方的位置

3.那么再来看一下,这个页面被tabs加载后发生了什么

截图中,蓝框内是tab中被加载的目标DOM,可以看到红色框中<!-- 表单 -->下的<div id="dept-dialog"...>代码从目标页面的DOM结构中被移走了,被移动到了tabs组件所在页面的DOM结构中,因为DOM展开后太大所以截图没有截到.

这就是问题所在,当tabs中目标页面被关闭时,Easyui会销毁掉蓝框内的DOM内容,但是目标页面中的dialog组件被移动到外面,导致dialog的DOM内容没有与目标页面一起销毁,当再次以tab方式加载目标页面时,会在tab组件所在页面的DOM结构中生成块相同的<div id="dept-dialog"...>代码内容.这就导致了表单的重复提交.

解决方法:目前没有找到好的办法,笨一点的,在tabs加载页面前,记录本tab页面中所有组件的ID,在tab关闭时手动找到这个对象删除掉.

加载时的代码:

[javascript] view plaincopy

  1. $(‘#my-tabs‘).tabs(‘add‘,{
  2. title: title,
  3. href : url,//内容页面的地址
  4. border : false,
  5. closable:true,
  6. id : title,
  7. extractor: function(data){
  8. //抽取body中的内容
  9. var pattern = /<body[^>]*>((.|[\n\r])*)<\/body>/im;
  10. var matches = pattern.exec(data);
  11. if (matches){
  12. data = matches[1];
  13. }
  14. var tmp = $(‘<div/>‘).html(data);
  15. var divs = $(tmp).find(‘[id]‘);
  16. var ids = [];
  17. for(var i=0;i<divs.length;i++){
  18. ids.push(divs[i].getAttribute("id"));
  19. }
  20. //记录本tab中的所有带ID的DIV
  21. $(‘#base-tabs‘).tabs(‘getTab‘,title).divs = ids;
  22. return data;
  23. }

关闭时的动作:

[javascript] view plaincopy

    1. $(‘#my-tabs‘).tabs({
    2. autoWidth:true,
    3. onBeforeClose:function(title,index){//关闭面板前把此功能的资源释放
    4. var tab =  $(this).tabs(‘getTab‘,index);
    5. //准备删除的DIV内容
    6. $(‘#my-tabs‘).attr("rmdiv",tab.divs);
    7. },onClose : function(){//删除被关闭tab中用到的DOM对象
    8. var divs = $(‘#my-tabs‘).attr("rmdiv").split(",");
    9. for(var i=0;i<divs.length;i++){
    10. var divTarget = $(‘#‘+divs[i]);
    11. if(divTarget){
    12. divTarget.remove();
    13. }
    14. }
    15. }
    16. });
时间: 2024-08-03 03:13:16

easyui的tab加载页面中的form重复提交的相关文章

EasyUI的window加载的页面不执行js问题说明

http://364434006.iteye.com/blog/1671907 —————————————————————————————————————————————————————————————————————— 解决方案:将被加载页面中的body标签删掉. 说明:window.dialog.tab都是panel,加载内容的方式都有硬编码和通过url来加载外部html片段,这里html片段就是body标签里面的代码. 详细参见: http://easyui.btboys.com/post

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根据不同菜单定位到不同页面,而整体布局不会变化 这种布局结构对于单纯的HTML不具备这种嵌入各部分内容的能力,所以就需要我们自己来寻找或者解决这种问题,由于jquery的兼容性和使用广度比较不错,这里 使用jquery的load方法来处理这种页面布局框架. 二.load方法详解 1.定义 $(sele

PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题

PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动画展示效果不好,解决方法,让所有屏的背景可见,但是只要当前屏的元素可见; 上代码: .page { width: 100%; height: 100%; -webkit-backface-visibility: hidden; -webkit-perspective: 1000; div, ul,

jquery load加载页面内ajax返回的div不能响应页面js的问题的解决方案

1. 前言 由于项目需要,需要load一个页面并保持ajax返回的div能响应其页面内的JS的click事件.这个不是 解决用jquery load加载页面到div时,不执行页面js的问题 这类问题,因为并无这个问题存在(jquery版本:1.10.2.js). 2. 本质原因 假定页面内有$(.btn1).click(function(){})事件,你手动复制一个包含class为btn1的div到页面,然后会发现你点击那个div,并不会被响应,如果你在console执行$(.btn1)确实有包

ExtJs非Iframe框架加载页面实现

在用Ext开发App应用时,一般的框架都是左边为菜单栏,中间为tab页方式的显示区域.而tab页面大多采用的嵌入一个iframe来显示内容.但是采用iframe方式有一个很大的弊端就是每次在加载一个新的iframe时都要将Ext的核心js,css文件重新加载.由于Ext是一个庞大的类库,这些文件的体积都很庞大,仅仅是ext-all.js就有400多k,所以用iframe方式加载就大大降低了效率.为了能解决这个问题,我推荐使用Ext.Panel的autoload模式进行加载页面.用这种模式加载就可

局部动态加载页面

不知道各位小伙伴在做前端页面的时候,会不会跟我有一样的经历,整个系统大体上是需要一个整体框架的,只有局部需要不时地刷新.话不多说,以下就是我要实现的效果图. 显然,我用红色边框框起的的地方是整个项目页面都需要有的,而黄色的两个边框的,有些页面采用了同样的样式,有些改变上面黄色边框,有些改变下面黄色边框. 于是,我就想到了用Ajax动态请求其他页面中的内容.这样及不会让index页面的代码内容过多,也可以让几个样式相同的板块统一样式,请求同一页面,省事. 首先呢,我在主页面留了两个空白的div,也

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g

DOM加载过程中ready和load的区别

在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有async或defer属性,就暂停解析,开始执行脚本和CSS样式 3. HTML文档解析完成 4. 浏览器等待图片.样式表.字体文件等外部资源加载完成 在这其中,有两个阶段: ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): load,表示页面包含图片等外部文件在内的所有元素都加载完成. DOM

UIWebView解决加载页面时背景一片空白问题

UIWebView加载过程中,在页面没有加载完毕前,会显示一片空白.为解决这个问题,方法如下: 方法1.让UIWebView背景透明. webView.backgroundColor = [UIColor clearColor]; webView.opaque = NO; [webView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"webbg.png"]]]; 方法2: 先将webVi