關於jQuery的load()方法
傳統的網站頁面包含多個header、footer、siderbar、tip(提示框/輸入框)等多個公共元件,如果一味的複製貼上,頁面將會相當臃腫和難以維護。這裡介紹jqurey的load()方法。目的:實現頁面的元件化,方便管理和維護。如果你是Vue和React使用者,請無視此文。
jquery load方法是jQuery.ajax()的一個方法,語法:$(selector).load(url,data,function(response,status,xhr))
現在,我的index.html只有一些動態載入的元件:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
<!-- 頭部 -->
<div id="header"></div>
<!-- 主頁內容 -->
<div class="main"></div>
<!-- 提示框 -->
<div id="tip"></div>
<!-- 側邊欄 -->
<div id="sideBar"></div>
<!-- 頁尾 -->
<div id="footer"></div>
</body>
<script>
$('#header').load('header.html',function(responseTxt,statusTxt,xhr){
if(statusTxt=='success'){
console.log('頭部載入成功!')
}
});
//.........動態載入其他的元件
$('#footer').load('footer.html',function(responseTxt,statusTxt,xhr){
if(statusTxt=='success'){
console.log('footer載入成功!')
}
});
</script>
然後,我們來看看header.html
<div class="my_nav">
<ul class="nav navbar-nav">
<li class="active"><a href="index.html">首頁</a></li>
<li><a href="#">產品</a></li>
<li><a href="index.html">解決方案</a></li>
<li><a href="aboutUs.html">關於我們</a></li>
</ul>
</div>
<!-- script內容 -->
<script>
$(window).scroll(function(){
if($(window).scrollTop() > 100) {
$(".my_nav").addClass("active");
} else {
$(".my_nav").removeClass("active");
}
})
</script>
注意,這裡本人推薦只用html片段而非標準html格式
您會遇到的兩個坑:
1.元件的js載入失敗,在index.html中元件定義的方法和函式無效報錯。如果你使用的標準hhtml格式,可能遇到這個問題。
index.html介面最終其實是jq通過ajax請求過來內容,在append到目標區域。而通過ajax請求方法的responseText又只會抓去完整html片段中<body>裡面的內容。標準格式正好把js寫在了body外面所以導致js沒執行。也就是說當load()這個老司機開車的時候,body的內容上車了,js卻被留在了車外。當老司機到達index.html的時候,由於之前js定義的函式和方法沒有上車,index頁面的控制檯只能幫你報警...
2.用jquery的load方法後:jQuery獲取元件dom物件失敗。
載入完畢後試試在index的script裡操作下 $(".my_nav").html("設定內容失敗!")
原因:只有在元素完全載入完之前繫結load的處理函式,才會在他載入完後觸發。如果之後再繫結就不會觸發了。所以不要在$(document).ready()裡繫結load事件,因為jQuery會在所有DOM載入完成後再繫結load事件,也就是執行在前,載入在後。
我的寫法(不一定好用):
$(function(){
$('#header').load('header.html',function(responseTxt,statusTxt,xhr){
if(statusTxt=='success'){
var _li=$(".navbar-nav").find("li");//用變數儲存多次呼叫的Dom物件,可以減少開銷
_li.eq(0).removeClass("active")
_li.eq(3).addClass("active")
console.log('頭部載入成功!')
}
});
$('#footer').load('footer.html',function(responseTxt,statusTxt,xhr){
if(statusTxt=='success'){
//載入完畢前要處理的事件
console.log('footer載入成功!')
}
});
})
在load方法的回撥函式裡面提前繫結dom。
原創不易,請輕噴,Vue、React元件化框架使用者請無視,如有問題請回復我!