1. 程式人生 > >layer彈出層詳解

layer彈出層詳解

前言:學習layer彈出框,之前專案是用bootstrap模態框,後來改用layer彈出框,在文章的後面,我會分享專案的一些程式碼(我自己寫的)。

layer至今仍作為layui的代表作,她的受眾廣泛並非偶然,而是這五年多的堅持,不斷完善和維護、不斷建設和提升社群服務,使得猿們紛紛自發傳播,乃至於成為今天的Layui最強勁的源動力。目前,layer已成為國內最多人使用的web彈層元件,GitHub自然Stars3000+,官網累計下載量達30w+,大概有20萬Web平臺正在使用layer。 具體請移步layer官網,http://www.layui.com/doc/modules/layer.html

這篇部落格會引用官網的一些內容,主要是寫寫layer的一些難點。比如如何用layer開啟一個新的網頁,content直接為一個網址就可以了,但是在你的專案中,這個網址又是啥??HTML的直接路徑? 相對路徑??都不是

!! layer如何獲取父介面的元素,比如我點選新增按鈕,在layer框編輯後提交,是如何關閉當前layer框,額,關閉layer框很簡單,但是如何關閉後根據父介面的form表單向後臺發起Ajax請求,,重新整理資訊。即:layer子介面如何呼叫父介面的方法

如果你不想使用Layui,而只是想使用layer,你可以去layer獨立元件官網下載元件包。你需要在你的頁面引入jQuery1.8以上的任意版本,並引入layer.js

<script src="jQuery的路徑"></script>
<script src="layer.js的路徑"></script>
<script>
//
彈出一個頁面層 $('#test2').on('click', function(){ layer.open({ type: 1, area: ['600px', '360px'], shadeClose: true, //點選遮罩關閉 content: '\<\div style="padding:20px;">自定義內容\<\/div>' }); }); </script>

title - 標題

型別:String/Array/Boolean,預設:'資訊'

title支援三種類型的值,若你傳入的是普通的字串,如title :'我是標題',那麼只會改變標題文字;若你還需要自定義標題區域樣式

,那麼你可以title: ['文字', 'font-size:18px;'],陣列第二項可以寫任意css樣式;如果你不想顯示標題欄,你可以title: false

content - 內容

型別:String/DOM/Array,預設:''

content可傳入的值是靈活多變的,不僅可以傳入普通的html內容,還可以指定DOM,更可以隨著type的不同而不同。譬如:

/!*
 如果是頁面層
 */
layer.open({
  type: 1, 
  content: '傳入任意的文字或html' //這裡content是一個普通的String
});
layer.open({
  type: 1,
  content: $('#id') //這裡content是一個DOM,注意:最好該元素要存放在body最外層,否則可能被其它的相對元素所影響
});
//Ajax獲取
$.post('url', {}, function(str){
  layer.open({
    type: 1,
    content: str //注意,如果str是object,那麼需要字元拼接。
  });
});
/!*
 如果是iframe層
 */
layer.open({
  type: 2, 
  content: 'http://sentsin.com' //這裡content是一個URL,如果你不想讓iframe出現滾動條,你還可以content: ['http://sentsin.com', 'no']
}); 
/!*
 如果是用layer.open執行tips層
 */
layer.open({
  type: 4,
  content: ['內容', '#id'] //陣列第二項即吸附元素選擇器或者DOM
});        
        

btn - 按鈕

型別:String/Array,預設:'確認'

資訊框模式時,btn預設是一個確認按鈕,其它層型別則預設不顯示,載入層和tips層則無效。當您只想自定義一個按鈕時,你可以btn: '我知道了',當你要定義兩個按鈕時,你可以btn: ['yes', 'no']。當然,你也可以定義更多按鈕,比如:btn: ['按鈕1', '按鈕2', '按鈕3', …],按鈕1的回撥是yes,而從按鈕2開始,則回撥為btn2: function(){},以此類推。如:

 1 //eg1       
 2 layer.confirm('納尼?', {
 3   btn: ['按鈕一', '按鈕二', '按鈕三'] //可以無限個按鈕
 4   ,btn3: function(index, layero){
 5     //按鈕【按鈕三】的回撥
 6   }
 7 }, function(index, layero){
 8   //按鈕【按鈕一】的回撥
 9 }, function(index){
10   //按鈕【按鈕二】的回撥
11 });
12  
13 //eg2
14 layer.open({
15   content: 'test'
16   ,btn: ['按鈕一', '按鈕二', '按鈕三']
17   ,yes: function(index, layero){
18     //按鈕【按鈕一】的回撥
19   }
20   ,btn2: function(index, layero){
21     //按鈕【按鈕二】的回撥
22     
23     //return false 開啟該程式碼可禁止點選該按鈕關閉
24   }
25   ,btn3: function(index, layero){
26     //按鈕【按鈕三】的回撥
27     
28     //return false 開啟該程式碼可禁止點選該按鈕關閉
29   }
30   ,cancel: function(){ 
31     //右上角關閉回撥
32     
33     //return false 開啟該程式碼可禁止點選該按鈕關閉
34   }
35 });
View Code

success - 層彈出後的成功回撥方法

型別:Function,預設:null

當你需要在層建立完畢時即執行一些語句,可以通過該回調。success會攜帶兩個引數,分別是當前層DOM當前層索引。如:

layer.open({
    content: '測試回撥',
    success: function(layero, index){
        console.log(layero, index);
    }
});

yes - 確定按鈕回撥方法

型別:Function,預設:null

該回調攜帶兩個引數,分別為當前層索引、當前層DOM物件。如:

layer.open({
    content: '測試回撥',
    yes: function(index, layero){
        //do something
        layer.close(index); //如果設定了yes回撥,需進行手工關閉
    }
});

cancel - 右上角關閉按鈕觸發的回撥

型別:Function,預設:null

該回調攜帶兩個引數,分別為:當前層索引引數(index)、當前層的DOM物件(layero),預設會自動觸發關閉。如果不想關閉,return false即可,如;

cancel: function(index, layero){
    if(confirm('確定要關閉麼')){ //只有當點選confirm框的確定時,該層才會關閉
        layer.close(index)
    }
    return false;
}

end - 層銷燬後觸發的回撥

型別:Function,預設:null

無論是確認還是取消,只要層被銷燬了,end都會執行,不攜帶任何引數。

layer.ready(callback) - 初始化就緒

由於我們的layer內建了輕量級載入器,所以你根本不需要單獨引入css等檔案。但是載入總是需要過程的。當你在頁面一開啟就要執行彈層時,你最好是將彈層放入ready方法中,如:

//頁面一開啟就執行彈層
layer.ready(function(){
    layer.msg('很高興一開場就見到你');
}); 

layer.close(index) - 關閉特定層(比較重要)

關於它似乎沒有太多介紹的必要,唯一讓你疑惑的,可能就是這個index了吧。事實上它非常容易得到。

//當你想關閉當前頁的某個層時
var index = layer.open();
var index = layer.alert();
var index = layer.load();
var index = layer.tips();
//正如你看到的,每一種彈層呼叫方式,都會返回一個index
layer.close(index); //此時你只需要把獲得的index,輕輕地賦予layer.close即可
 
//如果你想關閉最新彈出的層,直接獲取layer.index即可
layer.close(layer.index); //它獲取的始終是最新彈出的某個層,值是由layer內部動態遞增計算的
 
//當你在iframe頁面關閉自身時
var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引
parent.layer.close(index); //再執行關閉  

layer.getChildFrame(selector, index) - 獲取iframe頁的DOM

當你試圖在當前頁獲取iframe頁的DOM元素時,你可以用此方法。selector即iframe頁的選擇器

 1 layer.open({
 2     type: 2,
 3     content: 'test/iframe.html',
 4     success: function(layero, index){
 5         var body = layer.getChildFrame('body', index);
 6         var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe頁的視窗物件,執行iframe頁的方法:iframeWin.method();
 7         console.log(body.html()) //得到iframe頁的body內容
 8         body.find('input').val('Hi,我是從父頁來的')
 9     }
10 });
11         

layer.getFrameIndex(windowName) - 獲取特定iframe層的索引

此方法一般用於在iframe頁關閉自身時用到。

//假設這是iframe頁
var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引
parent.layer.close(index); //再執行關閉

封裝好的Layer彈出框與關閉layer彈出框的方法(程式碼週一給出, 現在手頭沒有程式碼):