遮罩层解决jQuery UI Dialog 内嵌iFrame拖曳缓慢问题

不知道大家使用jQuery UI Dialog 内嵌iFrame页面时候遇到拖曳延迟等问题没有,或者是对mousedown,mouseup事件触发不敏感。特别在同时弹出多个dialog非常明显。很明显问题症结所在就是iframe,所以对症下药就是要把iframe藏起来。在同时不影响用户体验的同时,我的解决方案是:在触发拖曳事件前将整个dialog加一层透明遮罩层,拖曳停止remove掉这个遮罩层。直接贴代码,由于只贴部分关键处理代码。。如果有兴趣可以留言给我。

代码片段:

 

Js代码 复制代码 收藏代码
  1. //弹出页:frame页面   
  2. function showFrameDialog(url,pageid,height,width) {   
  3.     screenWidth = screenWidth || $(document).width();   
  4.     screenHeight = screenHeight || $(document).height();   
  5.   
  6.     var maxZindex = getNextZindex();   
  7.     onActivePageId = pageid;   
  8.     //页面显示前调用   
  9.     try {beforeFrameDialogShow(onActivePageId);} catch (e) {}   
  10.        
  11.     var pageIsOpen = false;   
  12.        
  13.     var dialogCount = 0;   
  14.     $("iframe").each(function(){   
  15.            
  16.         dialogCount++;   
  17.            
  18.         var $dialog = $(this).parent().parent();   
  19.         var key = $(this).attr('key');   
  20.         if(pageid == key){   
  21.             //alert("page[key:"+pageid+"] Is Open");   
  22.             pageIsOpen = true;   
  23.             //set z-index at top   
  24.             $dialog.css("z-index",maxZindex);   
  25.             //set position in center   
  26.             resetDialogPosition($dialog);   
  27.         }else{   
  28.             //reset position   
  29.             var offset = (dialogCount%2==0)? 15: -15;   
  30.             var _top =  $dialog.position().top + 5;   
  31.             var _left = $dialog.position().left + offset;   
  32.             //   
  33.             resetDialogPosition($dialog,_left,_top);   
  34.         }   
  35.     });   
  36.        
  37.     if(pageIsOpen)return;   
  38.        
  39.     var w = width || 450;   
  40.     var h = height || 285;   
  41.        
  42.     var split = (url.indexOf("?")>0)?"&":"?";   
  43.     url = url + split + "__time=" + new Date().getTime()+"&pageid="+pageid;   
  44.   
  45.     var div = document.createElement("div");   
  46.     var iframeHtml = " <iframe winStatu='Normal' id='ifr_"+pageid+"' name='ifr_"+pageid+"' width='" + w   
  47.             + "px' height='" + h + "px' src='" + url   
  48.             + "' frameborder=0 scrolling='no' key='"+ pageid +"'></iframe>";   
  49.     var finalTitle = openedTitles[pageid];   
  50.     $(div).attr('id''div_'+pageid);   
  51.     $(div).attr('divHeight', h);   
  52.     $(div).attr('divWidth', w);   
  53.     $(div).attr('title', finalTitle ? finalTitle : 'Page is Loading...');   
  54.     $(div).html(iframeHtml);   
  55.        
  56.     var dlg = $(div).dialog( {   
  57.         height : h,   
  58.         width : w,   
  59.         zIndex:maxZindex,   
  60.         resizable : false,   
  61.         bgiframe: true,   
  62.         beforeclose: function(event, ui) {   
  63.             refreshProperties(true);   
  64.             //页面关闭前调用   
  65.             try{beforeFrameDialogClose(pageid);}catch(err){}   
  66.             dlg.remove();   
  67.         },   
  68.         dragStart: function(event, ui) {},   
  69.         drag: function(event, ui) {   
  70.             onActivePageId = pageid;   
  71.             try{onActivePage(onActivePageId);}catch(err){}   
  72.         },   
  73.         dragStop: function(event, ui) { }   
  74.     });   
  75.        
  76.     //--------------解决拖曳延迟问题 add by vakin 20110818-------------------   
  77.     var $waterfall = addWaterfall('#div_'+pageid);   
  78.     $waterfall.hide();   
  79.     var $headerBar = $('#div_'+pageid).prev();   
  80.     $headerBar.bind('mousedown',function(){        
  81.             window.console.info.apply(window.console, ["mousedown"]);   
  82.             $waterfall.show();   
  83.     });    
  84.     $headerBar.bind('mouseup',function(){   
  85.             window.console.info.apply(window.console, ["mouseup"]);    
  86.             $waterfall.hide();   
  87.     });   
  88.     //--------------add by vakin 20110818 end-------------------   
  89.        
  90.     if(finalTitle)return;   
  91.     var frameElm = window.frames['ifr_'+pageid];   
  92.     if (frameElm.attachEvent) {   
  93.         frameElm.attachEvent("onload"function() {   
  94.             setDialogTitle(frameElm,pageid);   
  95.         });   
  96.     } else {   
  97.         try {   
  98.             frameElm.onload = function() {   
  99.                 setDialogTitle(frameElm,pageid);   
  100.             };   
  101.         } catch (e) {}   
  102.            
  103.     }   
  104. }   
  105.   
  106.   
  107. /*iframe加载完成调用*/  
  108. function setDialogTitle(frameElm,pageid,defaultTitle){   
  109.     var pageTitle = defaultTitle || frameElm.document.title;   
  110.     $("span.ui-dialog-title").each(function(){   
  111.          var $this = $(this);   
  112.          if($this.attr('id').indexOf(pageid)>0){   
  113.              $this.text(pageTitle);   
  114.              openedTitles[pageid] = pageTitle;   
  115.              return false;   
  116.          }   
  117.     });   
  118. }   
  119.   
  120. //增加遮罩层   
  121. function addWaterfall(outterDiv){   
  122.     var waterfall = $(document.createElement("div"));   
  123.             waterfall.css( {   
  124.                 "height" : "100%",   
  125.                 "width" : "100%",   
  126.                 "filter" : "alpha(opacity = 50)",   
  127.                 "-moz-opacity" : "0.1",   
  128.                 "opacity" : "0.1",   
  129.                 "background-color" : "#fff",   
  130.                 "position" : "absolute",   
  131.                 "left" : "0px",   
  132.                 "top" : "30px",   
  133.                 "display":"none"  
  134.             });   
  135.             $(waterfall).appendTo(outterDiv);   
  136.             $(waterfall).bind('click',function(){   
  137.                 $(this).hide();   
  138.             });   
  139.      return $(waterfall);   
  140. }  
posted @ 2011-12-29 11:45  peterlee  阅读(2028)  评论(0)    收藏  举报