首頁  >  文章  >  php教程  >  基於Layer+jQuery的自訂彈框

基於Layer+jQuery的自訂彈框

高洛峰
高洛峰原創
2016-12-08 14:18:081357瀏覽

目的:XXXX專案中,很多的彈跳窗是利用freemarker的網頁標籤追加的形式實現的,網頁彈框只是將隱藏的div顯示出來,這樣會使網頁在預加載時速度變慢,增加頁面加載和回應時間

解決方法如下:

1.彈框頁面部分的html程式碼和css抽離

html : html/configure/layer-win /_group-add-layer.html
css : css/common/componnentWin.css
子層html: _group-add-layer.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>group Add</title>
</head>
<link rel="stylesheet" type="text/css" href="../../../js/lib/datePicker/skin/WdatePicker.css" />
<link rel="stylesheet" type="text/css" href="../../../css/common/componnentWin.css" />
<body>
  ····
</body>
<script type="text/javascript" src="../../../js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="../../../js/lib/layer/layer.js"></script>
 
<script type="text/javascript" src="../../../js/scooper/scooper.tool.xiacy.js"></script>
<script type="text/javascript" src="../../../js/configure/layer-win/group-new-add.js"></script>
<script type="text/javascript">
 
</script>
</html>

   

group

或父親層-manager.html

<#include "/html/config/configure.html"/>
<@menuConfig likey="stationGroup">
 
    <link rel="stylesheet" type="text/css" href="${contextPath}/css/configure/group-manager.css" />
    <link rel="stylesheet" type="text/css" href="${contextPath}/css/lib/userLibs/page-plugin.css">
 
    <script type="text/javascript" src="${contextPath}/js/lib/layer/layer.js"></script>   
    <script type="text/javascript" src="${contextPath}/js/lib/userLibs/page-load.js"></script>
    <script type="text/javascript" src="${contextPath}/js/scooper/scooper.tool.xiacy.js"></script>  
    <script type="text/javascript" src="${contextPath}/js/configure/group-manager.js"></script> 
 
  ·····
</@menuConfig>

   

通用彈窗html :

<div id = "addNewGroupWin" class = "capsule-win show">
   <div class = "capsule-win-top" title = "添加分中心"><span>添加分中心</span></div>
   <div class = "capsule-win-center">
     <div class = "capsule-item" id = "oldDevSearch">
       <div class = "item-left input_required" >名称</div>
         <div class = "item-right">
         <input id = "newGroupName" class = "sc_validate" title = "分中心名称" type="text" placeholder="请输入分中心名称" scvalidate=&#39;{"required":true,"format":"string"}&#39;/>                  
         </div>        
     </div>      
     <div class = "capsule-item">
       <div class = "item-left input_required">经度</div>
       <div class = "item-right">
         <input id = "newGroupLng" class = "sc_validate" title= "分中心经度" type="text" placeholder="请输入0-180的数字" scvalidate=&#39;{"required":true,"format":"lng"}&#39;/>         
       </div>
     </div>
 
     <div class = "capsule-item">
       <div class = "item-left input_required">纬度</div>
       <div class = "item-right">
         <input id = "newGroupLat" class = "sc_validate" title = "分中心纬度" type="text" placeholder="请输入0-90的数字" scvalidate=&#39;{"required":true,"format":"lat"}&#39;/>         
       </div>
     </div>
 
     <div class = "capsule-item" id = "processSNOLDIV">
       <div class = "item-left input_required">描述</div>
       <div class = "item-right">
         <textarea id = "newGroupDesc" class = "sc_validate" title = "分中心描述" scvalidate=&#39;{"required":true,"format":"string"}&#39;></textarea>
       </div>
     </div>        
   </div>
   <div class = "capsule-win-bottom">
      <input id="addNewGroupSure" class = "btn-bottom centerfix btn-succ" type="button" value="确定"/>
      <input id="addNewGroupCancle" class = "btn-bottom btn-cancel" type="button" value="取消"/>    
   </div>
  </div>

   

2.子父層都需要引進laylay3.

4.父層js

/**
 * <分中心管理>
 * 添加分中心
 * Author  :  Yiyuery
 * Date   :  2016/10/19
 */
;(function($,w,document,undefined){
  $(document).ready(function(){
    validatorInit();
    clickEventBind();
  });
 
  var addGroupValidator = new Validator();
  var contextPath = "/ZJDZYW";
 
  /**
   * 表单验证初始化
   * @returns
   */
  function validatorInit(){
    addGroupValidator.init(function(obj, msg){
      layer.tips(msg,obj,{
         style: [&#39;background-color:#78BA32; color:#fff&#39;, &#39;#78BA32&#39;],
         maxWidth:185,
         time: 2000,         
         tips: 1,
        });
    });
  }
  /**
   * 点击事件绑定
   * @returns
   */
  function clickEventBind(){
    addNewGroupClick();
  }
 
  /**
   * 分中心相关点击事件
   * @returns
   */
  function addNewGroupClick(){
    $("#addNewGroupSure").click(function(){
      addNewGroupSure();    
    });
    $("#addNewGroupCancle").click(function(){
      addNewGroupCancle();     
    });  
  }
 
  /**
   * 添加新的分中心 [确定]
   * @returns
   */
  function addNewGroupSure(){
    validatorInput();     
  }
  /**
   * 添加分中心 [取消]
   */
  function addNewGroupCancle(){   
    closeLayerWin(); 
  }
 
  /**
   * 关闭当前打开的layer弹窗
   */
  function closeLayerWin(){
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index); //再执行关闭
  }
 
  /**
   * 表单提交输入验证
   */
  function validatorInput(){
    /**
     * 输入校验
     */
    if(!addGroupValidator.validate("addNewGroupWin")){
      return;
    }   
    var paras = {
        "group_name"  : $("#newGroupName").val(),
        "longitude"   : $("#newGroupLng").val(),
        "latitude"   : $("#newGroupLat").val(),
        "group_desc"  : $("#newGroupDesc").val(),
      };
    $.ajaxSettings.async = false ;
    $.getJSON(contextPath+"/stationGroup/add", paras, function(resp){        
      if(resp.code !=undefined && resp.code == 0){
        console.log("分中心列表刷新!");
      }
    });
    $.ajaxSettings.async = true ;
    closeLayerWin();
  }
})(jQuery,window,document);

   

loadGroupCenterInfo :父層js的方法,在關閉layer彈窗時調用父層方法刷新分中心列表

5.父層的layer彈窗時調用父層方法刷新分中心列表

5.父層的layer彈窗時所嵌套的iframe的,由於添加分中心的操作loadGroupCenterInfo,中嵌套著點擊事件的重新激活clickEventInit該方法不是全局的,無法通過end傳遞到父頁中再次執行

$("#addGroup").click(function(){       
  layer.config({
    path : &#39;${contextPath}/js/lib/layer&#39;
  });
  index = layer.open({
    type: 2,
     area: [&#39;520px&#39;, &#39;400px&#39;],
     fix: false, //不固定
     title: &#39;&#39;,
     maxmin: false,
     scrollbar:false,
     shade:0.5,
     shadeColse:true,
     content:capsule.request.path.groupMan.layer.groupManAddLayerShow,      
     end:function(){
       loadGroupCenterInfo();
     }
  });
 
});

   

因此:

因此:

因此:

因此:

因此:
因此:

因此:

因此:

因此當回呼函數涉及當前層的函數互相呼叫時,是無法使用通用layer最外層彈框來實現的,只能在當前頁的js中重新模組化引入layer 

[後來發現,其實是可以的,只需要將回呼函數直接寫在呼叫方法中即可,請參閱:javascript中的方法回呼和父頁Iframe的方法呼叫]

/**
 * 加载分中心
 */
function loadGroupCenterInfo(){
  $.ajaxSettings.async = false ;
  $.getJSON(capsule.request.path.groupMan.getJson.loadCenterGroup,{},function(data){
    $("#groupCenterArea").empty();
    $.each(data.list,function(i,obj){
      groupMap.setKeyValue(obj.id,obj.group_name);
      var count = obj.c_num;
      if(obj.c_num == null || obj.c_num == "null"){
        count = 0;
      }
      var html = &#39;<div class="groupItemDiv" id=&#39;+obj.id+&#39;>&#39;
        + &#39;<img class="checkBoxLeftSite" src="&#39;+contextPath+&#39;/image/Checkbox.png"/>&#39;+obj.group_name+"("+count+")"+&#39;<li title="编辑" class="editGroup"></li></div>&#39;;
      $("#groupCenterArea").append(html);
    });
    clickEventInit();
  });
  $.ajaxSettings.async = true ;
}

   

6.通用彈出式🜎效果: 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn