解決display none到display block 渲染時間過長的問題,以及bootstrap模態框導致其他框中input不能獲得焦點問題的解決


在做定制頁面的時候,遇到這么一個問題,因為彈出框用的是bootstrap的自帶的彈出框,控制顯示和隱藏也是用自帶的屬性控制

控制顯示,在觸發的地方 例如botton上面加上 

data-toggle="modal" data-target="#myModal"

控制關閉,在取消或者確定的地方加上

<button type="button" class="btn btn-primary">Save changes</button>

這樣一來就可以關聯控制顯示和隱藏目標 #myModal  的模態框,但是問題在於

如果模態框中加載的內容過多,因為以上的屬性控制底層其實是控制display none或者block,我們知道從none改成block的時候,是會重新渲染整個元素的,所以在再次點擊彈出模態框的時候又執行顯示的js

就又會加載一次,重復的加載慢,導致不好的用戶體驗

解決辦法:

第一次加載慢,是數據的問題我們這里不討論,在隱藏之后我們可以不用 display:none,(bootstrap中當然用的是$(el).closest(".modal").modal('hide');)這樣顯示的時候只能用show()解決不了問題,

我們在隱藏的時候不用hide,修改其z-index,將z-index改成一個負數,在body的下面,這樣他就視覺不顯示了,

$(el).closest(".modal").css("z-index",-2);

顯示的時候

$('#'+id).closest(".modal").css("z-index",1050);

這樣一來,只有第一次加載的時候慢,其余來回點擊的時候會速度快

步驟:

1、去掉關聯

  點擊關聯時:data-toggle="modal" data-target="#myModal"
  關閉關聯時:btn-primary

2、js控制顯示和隱藏直接上代碼:

直接上代碼

 

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>解決display渲染時間過長的問題</title>
  <!-- 設置 viewport -->
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- IE -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!-- 兼容國產瀏覽器的高速模式 -->
  <meta name="renderer" content="webkit">
 <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
   <style>
   /*添加一個背景,輔助 z-index顯示或者隱藏用*/
    body::before{
        content:'';
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        background-color:#fff;
        z-index:-1;
    }
   </style>
</head>
<body>
<button type="button" class="btn btn-primary btn-lg add-button" data-class="myModal" >Launch demo modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" >
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        <ul id="UL" style="max-height:700px;overflow:auto;">
            <li></li>
        </ul>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default"  onclick="initModel.hide(this)">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<!-- 引入 Bootstrap 的 JS 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>

<script>
var str="";
for(var i=0;i<80000;i++){
    str+="<li><a>"+i+"</a></li>"
}
$("#UL").html(str);
    $(function(){
        $("body").on("click",".add-button",function(e){
            initModel.show($(e.target).attr("data-class"));//motai
        })
    })
    window.initModel={
        show:function (id){
            //顯示摸態框
            $('#'+id).modal('show')
            $('#'+id).closest(".modal").css("z-index",1050);
            $(".modal-backdrop").show();
        },
        hide:function(el){
            //$(el).closest(".modal").modal('hide');
            $(el).closest(".modal").css("z-index",-2);//如果用上面句的代碼渲染時間會很長,造成不好的用戶體驗
            $(".modal-backdrop").hide();//隱藏bootstrap自帶的遮罩層
        }
    }
</script>
</body>
</html>

 

 

 

重要:頁面中只能存在一個bootstrap模態框,如果還存在其他彈框,會導致其他彈出框的input不能獲得焦點,因為bootstrap里面定義了tabindex作用

tabIndex屬性可以設置鍵盤中的TAB鍵在控件中的移動順序,即焦點的順序。tabIndex的值可為0至32767之間的任意數字。

如果使用-1值時,onfocus與onblur事件仍被啟動。tabIndex的值可為0至32767之間的任意數字

所以在設置顯示和隱藏的時候將tabindex=“-1”的屬性去掉既可

/**
 * 頁面定制
 * 
 * @author hpf 
 * @since 2019-01
 * 
 */

(function($){
    /**
     * 控制dialog的顯示和隱藏
     */
    $.fn.showorhideModel={
        show:function(id){
            //顯示dialog(改z-index)
            $('#'+id).modal('show')
            $("#"+id).css("z-index",1050)
            //顯示模態框
            $(".modal-backdrop").show();
            $('#'+id).removeAttr("tabindex");
        },
        hide:function(el){
            //隱藏dialog(改z-index)
            var $el=$(el).closest(".modal");
            $el.css("z-index",-1);
            //將模態框的tabindex去掉,因為會導致其他的彈出層中input不能獲得焦點
            $el.removeAttr("tabindex") //隱藏模態框
            $(".modal-backdrop").hide();
        }
    }
})(jQuery)

 

 


免責聲明!

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



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