zoukankan      html  css  js  c++  java
  • 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[^>]*>((.|[ ])*)</body>/im;  
    10.                 var matches = pattern.exec(data);  
    11.                 if (matches){  
    12.                     data = matches[1];  
    13.                 }  
    14.                 var tmp = $('<div/>').html(data);  
    15.                   
    16.             var divs = $(tmp).find('[id]');  
    17.             var ids = [];  
    18.             for(var i=0;i<divs.length;i++){  
    19.                 ids.push(divs[i].getAttribute("id"));  
    20.             }  
    21.             //记录本tab中的所有带ID的DIV  
    22.                 $('#base-tabs').tabs('getTab',title).divs = ids;  
    23.                 return data;  
    24.             }  


    关闭时的动作:

    [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.     });  
  • 相关阅读:
    《团队-团队编程项目作业名称-成员简介及分工》
    《团队-团队编程项目作业名称-需求分析》
    《结对-结对编项目作业名称-需求分析》
    团队编程项目总结
    并发工具包
    并发工具包
    spring注解的源码解释
    webservice客户端
    线程池
    问题
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/4834486.html
Copyright © 2011-2022 走看看