關於layui踩過的坑


最近在做二手車的后台系統搭建,前端使用的框架是 layui,現在我對layui進行一下簡單的記錄。

   layui兼容Ie7以上所有瀏覽器,內置了很多好用的模塊,包括彈框(div,簡單的按鈕組,iframe,msg)分頁,表格,表單,文件上傳,日期等模塊,而模塊的引入也十分人性化,使用layui.use引入相應的所需模塊,類似於require.js

layui.use(['layer', 'form'], function(){
var layer = layui.layer
,form = layui.form;
});

今天總結一下在使用layui過程中遇到的問題

1.內置模塊功能不能用 一定要用use引入 你要使用的組建,並在內部函數中聲明一次。 

layui.use(['table','laypage'], function(){
    var table = layui.table, 表格
$= layui.jquery, 內置jquery
form = layui.form, 表單
laypage = layui.laypage; 分頁
    var beginTime,endTime;
    var laydate = layui.laydate; 日期組建
    var limit=10,page=1;
   //日期組建的
    laydate.render({
        elem: '#date',
        range: true
        ,ready: function(date){
            // console.log(date); //得到初始的日期時間對象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0}
        }
        ,done: function(value, date, endDate){
            $('#date').css('width',200);
            var arrTime=value.split(' - ');
            beginTime=arrTime[0];
            endTime=arrTime[1]
        }
    });
  
});

2019-09-23

layui內容彈框模塊 layer ,當頁面 引入其他模塊的時候 由於依賴關系 會自動引入,當頁面 沒有引入其他模塊 ,而需使用layer的時候 ,需要 layui.use('layer') 即可使用

2.layui中 slect form表單元素 不美化顯現的問題

  1.layui中美化的表單元素 在渲染完成要添加 form.render() 

 $.each($('#classId option'),function (i, v) {
                if($(v).val()==data.id){
                    $(v).attr("selected","selected")
                }
            })
 form.render()

  2.渲染之后還是沒有,檢查一下html結構 是否在父級元素上有layui-form的類名

 <div class="layui-form">
         <label for="unit" class="col-lg-2 control-label"> 商品單位:</label>
          <div class="col-lg-6">
            <select class="layui-input" id="unit" lay-search></select>
          </div>
 </div>

3.layui select 多選框

官方文檔並沒有 select多選框 不過大牛們利用layui改造了很多select的多選框  社區有一些介紹 戳這里  我用的是select多選v3版本 有一些問題 但是對於目前的功能比較適合 地址戳這里 這里對select v.3的功能介紹展示的很全 以后用到可以直接訪問 

select.v4地址 戳這里

接下來 我記錄一下 我的使用  效果圖如下

  (1)現引入資源 剛附上的鏈接里 拿來直接用的資源 

 

  (2)在頁面引入 js     

    還有一種方式 是將js引入到layui的資源js中

      和其他內置模塊一樣 引入模塊名 並且調用 但是這個需要配置一下路徑  

layui.use(['table','upload','laypage','formSelects'], function(){
    var upload = layui.upload,laydate = layui.laydate,form = layui.form,$ = layui.$;var formSelects = layui.formSelects

  html中  

xm-select-search 搜索
xm-select-type  樣式類型 
xm-select    選擇器標志 和js中 對應
  <select id="serviceNetworkId" xm-select="select" xm-select-type="3" xm-select-search="" lay-filter="xm-select"></select>

  js中  一般layui 中表單渲染 是from.render()

formSelects.render({
                                            name: 'select', 和xm-select對應 標志應用
                                            on: function(data, arr){

                                                var a='';
                                                $.each(arr,function (i,v) {
                                                    a+=v.val+','
                                                })
//把多選的內容存儲起來
                                               goodCreate.serviceNetworkIdStr=a.slice(0,-1)
                                            }
                                        });

  (3)賦值,當用戶已經編輯過一次 如何反寫回去呢

formSelects.value('select',  serviceNetworkIdArr);
serviceNetworkIdArr是一個數組  是option的value組成的數組 
formSelects.value('select');			//獲取選中的值
formSelects.value('select', 'val');		//獲取選中的val數組
formSelects.value('select', 'name');		//獲取選中的name數組
formSelects.value('select', [1, 3]);	//動態賦值

  4.layui 日期插件laydate 閃沒 問題

問題描述:當頁面高度不夠時(高度不夠,指的是 input輸入框下面的頁面高度 小於 時間控件的高度),時間控件,點擊以后 會閃沒,當退出頁面 ,再返回以后,時間控件正常出現;

 

解決方法:

將觸發 方法 改為 click 

laydate.render({
            elem: '#birthLeader'
            ,trigger: 'click'
        });

 效果:無論是否 高度足夠,均可以出現 控件 ,當高度不夠時,會遮擋 input輸入框 

 

5.layui圖片上傳  

官方文檔鏈接 

看需求 ,是否  同步還是異步上傳

 

1.異步上傳   點擊上傳照片 按鈕  就上傳到服務器,返回線上圖片地址,等提交表單提交的時候 ,將其它表單信息 和 圖片的線上地址 一起提交 

  var uploadLeader = upload.render({
            elem: '#upMan' //綁定元素
            ,accept:'images'
            // ,auto:'false'
             ,auto:'true'  //默認為true ,異步提交
            ,url:'/upfile/img'
            ,size:'1024' //限制 kb
            ,before: function(obj){ //obj參數包含的信息,跟 choose回調完全一致,可參見上文。
                layer.load(); //上傳loading
            }
            ,choose:function (obj) {
                //將每次選擇的文件追加到文件隊列
                var files = obj.pushFile();
                //預讀本地文件,如果是多文件,則會遍歷。(不支持ie8/9)
                obj.preview(function(index, file, result) {
                    // console.log(index); //得到文件索引
                    // console.log(file); //得到文件對象
                    // console.log(result); //得到文件base64編碼,比如圖片
                    //下面這個只是為了操作畫面 並沒有上傳 應該上傳成功以后 執行 done中執行
                    $('#upMan').parents('.add-img-box ').find('img').attr('src',result)
                })
            }
            ,done: function(res){
                layer.closeAll('loading'); //關閉loading
                //上傳完畢回調
                //將圖片替換為上傳的圖片
                $('#upMan').parents('.add-img-box ').find('img').attr('src',res.data)
            }
            ,error: function(){
                layer.closeAll('loading'); //關閉loading
                //請求異常回調
            }
        });

  2.同步提交 ,點擊上傳照片,后 僅僅 將圖片的base64格式 存儲下來,並不掉接口,等表單提交的時候,將其他表單信息以及圖片的base64 字符串 一起提交

    var uploadLeader = upload.render({
            elem: '#upMan' //綁定元素
            ,accept:'images'
             ,auto:'false'
            ,size:'1024' //限制 kb
            ,choose:function (obj) {
                //將每次選擇的文件追加到文件隊列
                var files = obj.pushFile();
                //預讀本地文件,如果是多文件,則會遍歷。(不支持ie8/9)
                obj.preview(function(index, file, result) {
                    // console.log(index); //得到文件索引
                    // console.log(file); //得到文件對象
                    // console.log(result); //得到文件base64編碼,比如圖片
                    //下面這個只是為了操作畫面 並沒有上傳 應該上傳成功以后 執行 done中執行
                    $('#upMan').parents('.add-img-box ').find('img').attr('src',result)
                })
            }
        });

 6.layer.open 彈框 出現 object object 

layer.open({
					title: '添加團隊團員'
				
					,area: ['400px','520px']
					,btn: []
					,content: $('#form-box')

  當content為一個 dom元素的時候,彈出框出現異常

解決辦法:  將type設置為 1,內容就正常了

                layer.open({
					title: '添加團隊團員'
					,type:1
					,area: ['400px','520px']
					,btn: []
					,content: $('#form-box')
		            });                    

 

 7.彈出框 不居中問題

正常情況下,彈出框 默認是居中的位置(在沒有offset的情況下),現在 遇到一個問題,彈出框 水平居中,高度偏下,解決辦法

  1.動態改變位置

  

layer.style(index 的值 彈出框 唯一標識, {
   top: '50%',
   transform:'translateY(-50%)'
});

  2.由於彈出框 fixed,定位,但是 內容高度 獲取不對,此時 給body添加 ,height:100%;也可以解決

 

 8.關於頁面layer報錯

有很多時候,這個頁面不需要用到layui的form,table,或者其他模塊,所以 

不引用 這些模塊

  layui.use(['form','laydate','upload'], function(){代碼})

,但需要用到layer模塊,此時 直接調用會報錯

<script src="layui/layui.js"></script>
<script>
    $('.dele').click(function () {
            layer.open({
                title: '在線調試'
                ,content: '可以填寫任意的layer代碼'
            });
        })
</script>

  而在有引用 form,table等模塊的時候,直接調用並不會報錯,能夠正常使用

這是因為,模塊之間的相互依賴,當引用這些功能性模塊的時候,會自動引用layer,但是當不使用其他模塊的時候,只需要layer的時候需要 單獨引入 ,像下面這樣

 layui.use(['layer']);
   $('.dele').click(function () {
            layer.open({
                title: 'test'
                ,content: '可以填寫任意的layer代碼'
            });
        })

就不會報錯了

8.關於lay-search 屬性 英文區分大小寫的問題

  

                 <select name="Nationality" lay-search lay-filter="nationality">
                                <option value="中國">中國</option>
                                <option value="其他">其他</option>
                            </select>

  layui提供搜索功能,切搜索是根據option的text而不是value值,這樣很便捷,但是layui這里對於英文來說是區分大小寫的,所以 英文輸入的時候 不太便捷 需要修改源碼進行優化

在layui.all.js和form.js中  搜索 無匹配項,修改兩處 轉為大寫 此時 就會不區分大小寫了 

9.laydate無法正常顯示的問題,

 laydate接受的格式默認為 datetime類型下 為:yyyy-MM-dd HH:mm:ss,當數據庫數據為 yyyy-MM-dd HH:mm的時候 ,會由於格式不正確,而導致無法正常顯示的問題

laydate.render({
elem: '#goTime',
type:'datetime',
format:'yyyy-MM-dd HH:mm'
});
解決辦法:1.在讀數據的時候,動態判斷並修改格式為統一
     2.前后台,數據保持統一性,防止此類問題發生

 10.上傳圖片 當重復提交同一個圖片 無法再次吊起( input file也是一樣)

解決辦法:

  <1>. 當圖片是異步上傳 可以在選擇上傳完 對文件隊列 進行刪除 

, choose: function (obj) {
var files = this.files = obj.pushFile(); //將每次選擇的文件追加到文件隊列
}
, done: function (res, index, upload) {
alert(index);
layer.msg('添加失敗!');
//var files = upload.pushFile();
delete this.files[index]
//console.log(res)
}

  <2>.修改源碼 當單個圖片是異步上傳 可以在選擇上傳完 對文件隊列 進行清空

 

  <3>當圖片是同步上傳,上傳完成后,需要保存 ,等待和form一起提交 ,就不可以 清空,或者 利用兩個input進行提交

       var imgUpload=upload.render({
                elem: '#upMan' //綁定元素
                ,accept:'file'
                ,auto:false
                // ,size:'1024' //限制 kb
                ,choose:function (obj) {
                    //將每次選擇的文件追加到文件隊列
                    var files = obj.pushFile();
                    //預讀本地文件,如果是多文件,則會遍歷。(不支持ie8/9)
                    obj.preview(function(index, file, result) {
                        common.clearError('headImg')
                        if(common.isImg(file.name)){
                            //新增 圖片裁剪
                            if(file.size<common.imgSzieMax && file.size>common.imgSzieMin ){
                                //新增 圖片裁剪
                                $(".dialog").show();
                                $('#image').cropper('destroy').attr('src', result).cropper({
                                    aspectRatio: 377/472, // 縱橫比
                                    viewMode: 1,
                                    guides: false,
                                });
                                $(".finish").on('click', function () {
                                    //確定裁剪
                                    crop();
                                    $(".dialog").hide();
                                });
                                $(".cancle").on('click', function () {
                                    //裁剪取消
                                    crop_cancle();
                                    $(".dialog").hide();
                                });
                                // $('#headImg').val(result);
                                // $('#upMan').parents('.add-img-box ').find('img').attr('src',result)
                                //新增 圖片裁剪
                            }else{
                                common.nameEroor($('#headImg'),'文件大小必須在50k和350k之間!',)
                               common.errorAlert('文件大小必須在50k和350k之間!')
                            }
                            //新增 圖片裁剪
                        }else{
                            common.nameEroor($('#headImg'),'僅支持jpg圖片格式!')
                            common.errorAlert('僅支持jpg圖片格式!')
                        }
                    })
                    imgUpload.config.elem.next()[0].value = ''
                }
            });

  

 

 提供一個博客 寫過相關解決辦法 以供參考 地址

11.日期范圍 動態切換問題

laydate 提供了 日期范圍 可以選擇,不過正常需求中,日期范圍一般都是 動態可變的 ,所以 來寫一下實現這個的方法

  //兩個時間綁定
        var startDate=laydate.render({
            elem:'#intime'
            ,trigger: 'click'
            ,min: '2019-10-06'
            ,max: '2019-10-07'
            ,done: function(value, date, endDate){
                console.log(value); //得到日期生成的值,如:2017-08-18
                if($('#outtime').val().replace(/\-/g,'')<=$('#intime').val().replace(/\-/g,'')){

                    var index=layer.open({
                        title: '警告'
                        ,content: '入住時間不能比離開時間晚'
                        ,yes: function(index, layero){
                            //關閉彈框
                            layer.close(index);
                            $('#intime').val('')
                        }
                    });
                }else{
                    // 根據選中的值 獲取數據 重新渲染頁面
                    homeSurplus()

                }
            }
        });
  
        //重新設置 最大值 最小值 並重新渲染
        function timeMaxMinChange(startDateMin,startDateMax){
          //注意,月份是從 0開始 到11
            startDate.config.min ={
                year:timeForm(endDateMIn).year,
                month:timeForm(endDateMIn).month,
                date: timeForm(endDateMIn).date,
                hours: 0,
                minutes: 0,
                seconds : 0
            };
            startDate.config.max ={
                year:timeForm(endDateMax).year,
                month:timeForm(endDateMax).month,
                date: timeForm(endDateMax).date,
                hours: 0,
                minutes: 0,
                seconds : 0
            };
        }

  2020-04-16補充

12.laydate 只取時分 hh:mm 不要時分秒 hh:mm:ss

需要更改 

在css最下面添加 

/*隱藏秒*/
  .laydate-time-list {
    padding-bottom: 0;
    overflow: hidden
}
/*時分 寬度  */
.laydate-time-list>li {
    width: 50%
}

 

js 確保 可讀可寫(當設置為hh:mm:ss 而接受的數據是hh:mm形式的情況下 不會回顯 所以必須保持一致性)

  laydate.render({
            elem: '#comeTime1',
            type: 'time',
            format: 'HH:mm'
            , trigger: 'click'
        });

  

 效果

 

 

 

 

  

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM