使用jquery的load方法設計動態加載,並解決被加載頁面JavaScript失效問題

1、問題分析javascript

對於後臺系統,相比你們都有所印象,知道其中的佈局結構,如圖:css

在這種佈局中咱們須要將header,sidebar,footer分開,並且對於中間部分的content內容須要動態變化,即根據不一樣菜單定位到不一樣頁面,而總體佈局不會變化html

這種佈局結構對於單純的HTML不具有這種嵌入各部份內容的能力,因此就須要咱們本身來尋找或者解決這種問題,因爲jquery的兼容性和使用廣度比較不錯,這裏java

使用jquery的load方法來處理這種頁面佈局框架。jquery

2、load方法詳解web

1.定義
  $(selector).load(URL,data,callback);

  必需的 URL 參數規定您但願加載的 URL。ajax

  可選的 data 參數規定與請求一同發送的查詢字符串鍵/值對集合。bootstrap

  可選的 callback 參數是 load() 方法完成後所執行的函數名稱。app

 2.示例框架

  • 也能夠把 jQuery 選擇器添加到 URL 參數。

    下面的例子把 "demo_test.txt" 文件中 id="p1" 的元素的內容,加載到指定的 <div> 元素中:

    $("#div1").load("demo_test.txt #p1");
  • 可選的 callback 參數規定當 load() 方法完成後所要容許的回調函數。回調函數能夠設置不一樣的

$("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){
    if(statusTxt=="success")
      alert("外部內容加載成功!");
    if(statusTxt=="error")
      alert("Error: "+xhr.status+": "+xhr.statusText);
  });

3、佈局框架load的使用

1.問題

  網上不少人在使用load方法加載動態頁面的時候遇到一個廣泛的問題,就是在被加載頁面中的JavaScript代碼失效,這是由於load加載的外部文件會把Script部分刪除掉,因此被加載頁面中調用該頁面的JavaScript的時候就會出現xxxfunction未定義。

2.解決

  • 對於header,sidebar,footer這種只包含靜態HTML代碼的部分直接使用load加載
  • 對應中間content變化的內容,通常都會包含對應的JavaScript代碼,使用自定義的load方法(以下代碼),在使用jquery.load()方法加載對應的內容的同時,使用load的回調方法處理JavaScript的加載,將被加載頁面的JavaScript代碼加載到佈局頁面的<div id="content"></div>中這樣每次load()的時候content的內容都會被覆蓋,因此也沒必要擔憂重複加載的問題。這樣就完美解決被加載頁面js失效的問題。具體代碼以下所示:

4、代碼示例

佈局頁面:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <!-- Tell the browser to be responsive to screen width -->
        <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
        <!-- Bootstrap 3.3.6 -->
        <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css">
       
    </head>

    <body class="hold-transition skin-blue-light sidebar-mini" onload="onload();">
        <div class="wrapper">
            
            <div id="header">
            
            </div>
            
            <!-- Left side column. contains the logo and sidebar -->
            <div id="sidebar">
            
            </div>

            <!-- Content Wrapper. Contains page content -->
            <div id="content" class="content-wrapper clearfix">
                <!-- Content Header (Page header) -->
                
                
            </div>
            <!-- /.content-wrapper -->

            <div id="footer">
            
            </div>
            
            <!-- Add the sidebar's background. This div must be placed
       immediately after the control sidebar -->
            <div class="control-sidebar-bg"></div>

        </div>
        <!-- ./wrapper -->

        <!-- jQuery 2.2.3 -->
        <script src="../resources/plugins/jQuery/jquery-2.2.3.min.js"></script>
        <!-- Bootstrap 3.3.6 -->
        <script src="../resources/bootstrap/js/bootstrap.min.js"></script>
        
        <!--左側菜單-->
        <script src="../resources/dist/js/common/global.js"></script>
        <script src="../resources/dist/js/menu/menuTemplate.js"></script>
        <script src="../resources/dist/js/menu/menu.js"></script>
    </body>
<script>

 //加載頁面佈局的header,sidebar,footer的內容
 $("#header").load("inc/header.html");
 $("#sidebar").load("inc/sidebar.html");
 $("#footer").load("inc/footer.html");
 
 /*
 *加載變換內容,主要url參數爲dom對象,而且該dom中的url放在href中,
 *調用方式如:<span onclick="javascript:load(this);" href="/backstage/website/test.html">測試</span>
 *注意:1.該dom對象最好不要用a標籤,由於點擊a標籤會進入href指定的頁面
 *      2.要加載的內容要用 id="content" 標註,由於load中指明瞭加載頁面中指定的id爲content下的內容
 *    3.對應頁面的JavaScript寫在content下
 */
 function load(url, data){
     //alert($(url).attr("href"));
     $.ajaxSetup({cache: false });
     $("#content").load($(url).attr("href")+ " #content ", data, function(result){
         //alert(result);
         //將被加載頁的JavaScript加載到本頁執行
         $result = $(result); 
         $result.find("script").appendTo('#content');
     });

 }
</script>
</html>

 

被加載頁面:

<div id="content">
    <div>測試二</div>
    <span onclick="javascript:load(this);" href="/backstage/website/test.html">測試</span>
    <a href="javascript:test();">測試</a>
    <script>
        function test(){
            alert("測試二頁面");
        }
    </script>
    <script>
        function test2(){
            alert("ceshi");
        }
    </script>
</div>

效果截圖:

相關文章
相關標籤/搜索