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关闭时手动找到这个对象删除掉.

加载时的代码:

  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. }

关闭时的动作:

    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. });

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

  1. 加载 页面 中js 方法

    js 文件中 var mingchen= mingchen|| {    init: function (){ } }; 文件中 mingchen.init(); 注意问题: 在新加载 页面中     ...

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

    http://364434006.iteye.com/blog/1671907 ———————————————————————————————————————————————————————————— ...

  3. IE8中jQuery.load()加载页面不显示的原因

    一.jQuery.load() jQuery.load(url,[data],[callback])通过Ajax异步请求加载服务器中的数据,并把数据放到指定元素中. url :请求服务器的地址 dat ...

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

    一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...

  5. jquery动态加载并解决被加载页面js失效问题

    代码布局结构分为 header  left  content html代码如下: <!DOCTYPE html> <html lang="zh-CN"> & ...

  6. 【转】关于easyui tab 加载 js ajax 不走后台的问题, 怕找不到 以防万一

    一直以来群里里面很多人反应,在用tab加载界面的时候,界面里面的js不会执行.今天在此说明一下原因. 不管是window,dailog还是tab其实质最终都是继承了panel.panel有两种方式展示 ...

  7. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  8. 关于IE8中使用Jquery load方法无法正常加载页面

    最近发现,在IE8中使用Jquery load方法时无法正常加载页面,页面显示空白,没有加载.调试发现,页面多了一个</div>标签,但在FF和CH下表现正常.希望能给遇到同样问题的码农有 ...

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

    PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动 ...

随机推荐

  1. 7、Class文件的格式

    Class文件的格式 1.magic(魔数) 身份标识,用来标记这是不是一个CLASS文件 CLASS的魔数比较有浪漫气息,是0xCAFEBABE(咖啡宝贝),也标识着将来JAVA咖啡商标: 2.之后 ...

  2. vim打开多窗口、多文件之间的切换

    打开多个文件: 一.vim还没有启动的时候: 1.在终端里输入  vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :e file 可以再打开一 ...

  3. Selenium-Css Selector使用方法

    什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 ...

  4. 蓝牙inquiry流程之Inquiry Complete处理

    inquiry流程一般持续有12s多,当inquiry完成的时候,设备端会上报一个Event: Inquiry Complete 上来,那协议栈是如何把这个事件上传到应用层的呢?本篇文章来分析一下其具 ...

  5. [C#源代码]使用SCPI指令对通信端口(RS232/USB/GPIB/LAN)进行仪器编程

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本软件是基于NI-VISA/VISA32(Virtual Instrument Softwar ...

  6. .Net Core 分布式微服务框架介绍 - Jimu

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...

  7. Docker swarm集群搭建教程

    一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...

  8. Scrum Meeting NO.3

    Scrum Meeting No.2 1.会议内容 之前的两天无法登录TFS服务器来生成燃尽图,再加上这种方式只能生成当日的燃尽图,我们决定改用excel生成燃尽图.(作为一个渣渣pm,我用了一下午才 ...

  9. 关于Win10系统下VC2013安装Unit test出现问题的解决办法

    话不多说,先上图~~~ 很多同学在Vs2013安装Unit test组件时会弹出这样的对话框,极其极其让人崩溃. 当我看到这个对话框时,首先中规中矩的去官网下载.NET(但是我怎么可能没有!游戏环境包 ...

  10. DataGridView不显示未绑定的列-AutoGenerateColumns

    DataGridView绑定数据源时,会自动显示未绑定的列,怎么让其不显示未绑定的列呢? 设置AutoGenerateColumns属性即可 this.dataGridView1.AutoGenera ...